Skip to content
This repository was archived by the owner on Oct 15, 2020. It is now read-only.

Commit 985faa1

Browse files
authored
test: add a new.target test to addons-napi (#452)
N-API testing for new.target is lacking. Rectify this.
1 parent c6b7fca commit 985faa1

File tree

3 files changed

+102
-0
lines changed

3 files changed

+102
-0
lines changed

Diff for: test/addons-napi/test_new_target/binding.c

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#include <node_api.h>
2+
#include "../common.h"
3+
4+
napi_value BaseClass(napi_env env, napi_callback_info info) {
5+
napi_value newTargetArg;
6+
NAPI_CALL(env, napi_get_new_target(env, info, &newTargetArg));
7+
napi_value thisArg;
8+
NAPI_CALL(env, napi_get_cb_info(env, info, NULL, NULL, &thisArg, NULL));
9+
napi_value undefined;
10+
NAPI_CALL(env, napi_get_undefined(env, &undefined));
11+
12+
// this !== new.target since we are being invoked through super()
13+
bool result;
14+
NAPI_CALL(env, napi_strict_equals(env, newTargetArg, thisArg, &result));
15+
NAPI_ASSERT(env, !result, "this !== new.target");
16+
17+
// new.target !== undefined because we should be called as a new expression
18+
NAPI_CALL(env, napi_strict_equals(env, newTargetArg, undefined, &result));
19+
NAPI_ASSERT(env, !result, "new.target !== undefined");
20+
21+
return thisArg;
22+
}
23+
24+
napi_value Constructor(napi_env env, napi_callback_info info) {
25+
bool result;
26+
napi_value newTargetArg;
27+
NAPI_CALL(env, napi_get_new_target(env, info, &newTargetArg));
28+
size_t argc = 1;
29+
napi_value argv;
30+
napi_value thisArg;
31+
NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &argv, &thisArg, NULL));
32+
napi_value undefined;
33+
NAPI_CALL(env, napi_get_undefined(env, &undefined));
34+
35+
// new.target !== undefined because we should be called as a new expression
36+
NAPI_CALL(env, napi_strict_equals(env, newTargetArg, undefined, &result));
37+
NAPI_ASSERT(env, !result, "new.target !== undefined");
38+
39+
// arguments[0] should be Constructor itself (test harness passed it)
40+
NAPI_CALL(env, napi_strict_equals(env, newTargetArg, argv, &result));
41+
NAPI_ASSERT(env, result, "new.target === Constructor");
42+
43+
return thisArg;
44+
}
45+
46+
napi_value OrdinaryFunction(napi_env env, napi_callback_info info) {
47+
bool result;
48+
napi_value newTargetArg;
49+
NAPI_CALL(env, napi_get_new_target(env, info, &newTargetArg));
50+
napi_value undefined;
51+
NAPI_CALL(env, napi_get_undefined(env, &undefined));
52+
53+
// new.target === undefined because we are not called as a new expression
54+
NAPI_CALL(env, napi_strict_equals(env, newTargetArg, undefined, &result));
55+
NAPI_ASSERT(env, result, "new.target === undefined");
56+
57+
napi_value _true;
58+
NAPI_CALL(env, napi_get_boolean(env, true, &_true));
59+
return _true;
60+
}
61+
62+
napi_value Init(napi_env env, napi_value exports) {
63+
const napi_property_descriptor desc[] = {
64+
DECLARE_NAPI_PROPERTY("BaseClass", BaseClass),
65+
DECLARE_NAPI_PROPERTY("OrdinaryFunction", OrdinaryFunction),
66+
DECLARE_NAPI_PROPERTY("Constructor", Constructor)
67+
};
68+
NAPI_CALL(env, napi_define_properties(env, exports, 3, desc));
69+
return exports;
70+
}
71+
72+
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)

Diff for: test/addons-napi/test_new_target/binding.gyp

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
'targets': [
3+
{
4+
'target_name': 'binding',
5+
'defines': [ 'V8_DEPRECATION_WARNINGS=1' ],
6+
'sources': [ 'binding.c' ]
7+
}
8+
]
9+
}

Diff for: test/addons-napi/test_new_target/test.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
'use strict';
2+
3+
const common = require('../../common');
4+
const assert = require('assert');
5+
const binding = require(`./build/${common.buildType}/binding`);
6+
7+
class Class extends binding.BaseClass {
8+
constructor() {
9+
super();
10+
this.method();
11+
}
12+
method() {
13+
this.ok = true;
14+
}
15+
}
16+
17+
assert.ok(new Class() instanceof binding.BaseClass);
18+
assert.ok(new Class().ok);
19+
assert.ok(binding.OrdinaryFunction());
20+
assert.ok(
21+
new binding.Constructor(binding.Constructor) instanceof binding.Constructor);

0 commit comments

Comments
 (0)