• 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
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