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 9assert.strictEqual(makeCallback(process, common.mustCall(function() { 10 assert.strictEqual(arguments.length, 0); 11 assert.strictEqual(process, this); 12 return 42; 13})), 42); 14 15assert.strictEqual(makeCallback(process, common.mustCall(function(x) { 16 assert.strictEqual(arguments.length, 1); 17 assert.strictEqual(process, this); 18 assert.strictEqual(x, 1337); 19 return 42; 20}), 1337), 42); 21 22const recv = { 23 one: common.mustCall(function() { 24 assert.strictEqual(arguments.length, 0); 25 assert.strictEqual(recv, this); 26 return 42; 27 }), 28 two: common.mustCall(function(x) { 29 assert.strictEqual(arguments.length, 1); 30 assert.strictEqual(recv, this); 31 assert.strictEqual(x, 1337); 32 return 42; 33 }), 34}; 35 36assert.strictEqual(makeCallback(recv, 'one'), 42); 37assert.strictEqual(makeCallback(recv, 'two', 1337), 42); 38 39// Check that callbacks on a receiver from a different context works. 40const foreignObject = vm.runInNewContext('({ fortytwo() { return 42; } })'); 41assert.strictEqual(makeCallback(foreignObject, 'fortytwo'), 42); 42 43// Check that the callback is made in the context of the receiver. 44const target = vm.runInNewContext(` 45 (function($Object) { 46 if (Object === $Object) 47 throw new Error('bad'); 48 return Object; 49 }) 50`); 51assert.notStrictEqual(makeCallback(process, target, Object), Object); 52 53// Runs in inner context. 54const forward = vm.runInNewContext(` 55 (function(forward) { 56 return forward(Object); 57 }) 58`); 59// Runs in outer context. 60function endpoint($Object) { 61 if (Object === $Object) 62 throw new Error('bad'); 63 return Object; 64} 65assert.strictEqual(makeCallback(process, forward, endpoint), Object); 66