1'use strict'; 2 3const common = require('../../common'); 4const assert = require('assert'); 5const vm = require('vm'); 6const binding = require(`./build/${common.buildType}/binding`); 7const makeCallback = binding.makeCallback; 8 9function myMultiArgFunc(arg1, arg2, arg3) { 10 assert.strictEqual(arg1, 1); 11 assert.strictEqual(arg2, 2); 12 assert.strictEqual(arg3, 3); 13 return 42; 14} 15 16/** 17 * Resource should be able to be arbitrary objects without special internal 18 * slots. Testing with plain object here. 19 */ 20const resource = {}; 21assert.strictEqual(makeCallback(resource, process, common.mustCall(function() { 22 assert.strictEqual(arguments.length, 0); 23 assert.strictEqual(this, process); 24 return 42; 25})), 42); 26 27assert.strictEqual(makeCallback(resource, process, common.mustCall(function(x) { 28 assert.strictEqual(arguments.length, 1); 29 assert.strictEqual(this, process); 30 assert.strictEqual(x, 1337); 31 return 42; 32}), 1337), 42); 33 34assert.strictEqual(makeCallback(resource, this, 35 common.mustCall(myMultiArgFunc), 1, 2, 3), 42); 36 37// TODO(node-api): napi_make_callback needs to support 38// strings passed for the func argument 39// 40// const recv = { 41// one: common.mustCall(function() { 42// assert.strictEqual(0, arguments.length); 43// assert.strictEqual(this, recv); 44// return 42; 45// }), 46// two: common.mustCall(function(x) { 47// assert.strictEqual(1, arguments.length); 48// assert.strictEqual(this, recv); 49// assert.strictEqual(x, 1337); 50// return 42; 51// }), 52// }; 53// 54// assert.strictEqual(makeCallback(recv, 'one'), 42); 55// assert.strictEqual(makeCallback(recv, 'two', 1337), 42); 56// 57// // Check that callbacks on a receiver from a different context works. 58// const foreignObject = vm.runInNewContext('({ fortytwo() { return 42; } })'); 59// assert.strictEqual(makeCallback(foreignObject, 'fortytwo'), 42); 60 61 62// Check that the callback is made in the context of the receiver. 63const target = vm.runInNewContext(` 64 (function($Object) { 65 if (Object === $Object) 66 throw new Error('bad'); 67 return Object; 68 }) 69`); 70assert.notStrictEqual(makeCallback(resource, process, target, Object), Object); 71 72// Runs in inner context. 73const forward = vm.runInNewContext(` 74 (function(forward) { 75 return forward(Object); 76 }) 77`); 78 79// Runs in outer context. 80function endpoint($Object) { 81 if (Object === $Object) 82 throw new Error('bad'); 83 return Object; 84} 85 86assert.strictEqual(makeCallback(resource, process, forward, endpoint), Object); 87