• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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