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 16assert.strictEqual(makeCallback(process, common.mustCall(function() { 17 assert.strictEqual(arguments.length, 0); 18 assert.strictEqual(this, process); 19 return 42; 20})), 42); 21 22assert.strictEqual(makeCallback(process, common.mustCall(function(x) { 23 assert.strictEqual(arguments.length, 1); 24 assert.strictEqual(this, process); 25 assert.strictEqual(x, 1337); 26 return 42; 27}), 1337), 42); 28 29assert.strictEqual(makeCallback(this, 30 common.mustCall(myMultiArgFunc), 1, 2, 3), 42); 31 32// TODO(node-api): napi_make_callback needs to support 33// strings passed for the func argument 34/* 35const recv = { 36 one: common.mustCall(function() { 37 assert.strictEqual(0, arguments.length); 38 assert.strictEqual(this, recv); 39 return 42; 40 }), 41 two: common.mustCall(function(x) { 42 assert.strictEqual(1, arguments.length); 43 assert.strictEqual(this, recv); 44 assert.strictEqual(x, 1337); 45 return 42; 46 }), 47}; 48 49assert.strictEqual(makeCallback(recv, 'one'), 42); 50assert.strictEqual(makeCallback(recv, 'two', 1337), 42); 51 52// Check that callbacks on a receiver from a different context works. 53const foreignObject = vm.runInNewContext('({ fortytwo() { return 42; } })'); 54assert.strictEqual(makeCallback(foreignObject, 'fortytwo'), 42); 55*/ 56 57// Check that the callback is made in the context of the receiver. 58const target = vm.runInNewContext(` 59 (function($Object) { 60 if (Object === $Object) 61 throw new Error('bad'); 62 return Object; 63 }) 64`); 65assert.notStrictEqual(makeCallback(process, target, Object), Object); 66 67// Runs in inner context. 68const forward = vm.runInNewContext(` 69 (function(forward) { 70 return forward(Object); 71 }) 72`); 73 74// Runs in outer context. 75function endpoint($Object) { 76 if (Object === $Object) 77 throw new Error('bad'); 78 return Object; 79} 80 81assert.strictEqual(makeCallback(process, forward, endpoint), Object); 82