Skip to content

Commit d4e0d36

Browse files
authored
Merge branch 'main' into test-filter
2 parents 23ed722 + 943ad7f commit d4e0d36

19 files changed

Lines changed: 1293 additions & 3 deletions

PORTING.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ Tests covering the engine-specific part of Node-API, defined in `js_native_api.h
5151
| `test_bigint` | Ported ✅ | Easy |
5252
| `test_cannot_run_js` | Not ported | Medium |
5353
| `test_constructor` | Ported ✅ | Medium |
54-
| `test_conversions` | Not ported | Medium |
54+
| `test_conversions` | Ported ✅ | Medium |
5555
| `test_dataview` | Not ported | Medium |
5656
| `test_date` | Ported ✅ | Easy |
5757
| `test_error` | Ported ✅ | Medium |
@@ -69,7 +69,7 @@ Tests covering the engine-specific part of Node-API, defined in `js_native_api.h
6969
| `test_reference` | Not ported | Medium |
7070
| `test_reference_double_free` | Ported ✅ | Easy |
7171
| `test_sharedarraybuffer` | Not ported | Medium |
72-
| `test_string` | Not ported | Medium |
72+
| `test_string` | Ported ✅ | Medium |
7373
| `test_symbol` | Ported ✅ | Easy |
7474
| `test_typedarray` | Ported ✅ | Medium |
7575

eslint.config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ export default defineConfig([
2323
mustNotCall: "readonly",
2424
gcUntil: "readonly",
2525
experimentalFeatures: "readonly",
26+
napiVersion: "readonly",
27+
skipTest: "readonly",
2628
},
2729
},
2830
rules: {

implementors/node/features.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,9 @@ globalThis.experimentalFeatures = {
77
setPrototype: true,
88
postFinalizer: true,
99
};
10+
11+
globalThis.napiVersion = Number(process.versions.napi);
12+
13+
globalThis.skipTest = () => {
14+
process.exit(0);
15+
};

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"type": "module",
66
"scripts": {
77
"node:test": "node --test ./implementors/node/run-tests.ts",
8-
"lint": "eslint",
8+
"lint": "eslint && tsc",
99
"addons:configure": "cmake -S . -B ./build",
1010
"addons:build": "cmake --build ./build",
1111
"addons:clean": "git clean -xf '**/*.node' && rm -rf ./build",
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
add_node_api_cts_addon(test_conversions test_conversions.c test_null.c)
Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
"use strict";
2+
const test = loadAddon("test_conversions");
3+
4+
const boolExpected = /boolean was expected/;
5+
const numberExpected = /number was expected/;
6+
const stringExpected = /string was expected/;
7+
8+
const testSym = Symbol("test");
9+
10+
assert.strictEqual(test.asBool(false), false);
11+
assert.strictEqual(test.asBool(true), true);
12+
assert.throws(() => test.asBool(undefined), boolExpected);
13+
assert.throws(() => test.asBool(null), boolExpected);
14+
assert.throws(() => test.asBool(Number.NaN), boolExpected);
15+
assert.throws(() => test.asBool(0), boolExpected);
16+
assert.throws(() => test.asBool(""), boolExpected);
17+
assert.throws(() => test.asBool("0"), boolExpected);
18+
assert.throws(() => test.asBool(1), boolExpected);
19+
assert.throws(() => test.asBool("1"), boolExpected);
20+
assert.throws(() => test.asBool("true"), boolExpected);
21+
assert.throws(() => test.asBool({}), boolExpected);
22+
assert.throws(() => test.asBool([]), boolExpected);
23+
assert.throws(() => test.asBool(testSym), boolExpected);
24+
25+
[test.asInt32, test.asUInt32, test.asInt64].forEach((asInt) => {
26+
assert.strictEqual(asInt(0), 0);
27+
assert.strictEqual(asInt(1), 1);
28+
assert.strictEqual(asInt(1.0), 1);
29+
assert.strictEqual(asInt(1.1), 1);
30+
assert.strictEqual(asInt(1.9), 1);
31+
assert.strictEqual(asInt(0.9), 0);
32+
assert.strictEqual(asInt(999.9), 999);
33+
assert.strictEqual(asInt(Number.NaN), 0);
34+
assert.throws(() => asInt(undefined), numberExpected);
35+
assert.throws(() => asInt(null), numberExpected);
36+
assert.throws(() => asInt(false), numberExpected);
37+
assert.throws(() => asInt(""), numberExpected);
38+
assert.throws(() => asInt("1"), numberExpected);
39+
assert.throws(() => asInt({}), numberExpected);
40+
assert.throws(() => asInt([]), numberExpected);
41+
assert.throws(() => asInt(testSym), numberExpected);
42+
});
43+
44+
assert.strictEqual(test.asInt32(-1), -1);
45+
assert.strictEqual(test.asInt64(-1), -1);
46+
assert.strictEqual(test.asUInt32(-1), Math.pow(2, 32) - 1);
47+
48+
assert.strictEqual(test.asDouble(0), 0);
49+
assert.strictEqual(test.asDouble(1), 1);
50+
assert.strictEqual(test.asDouble(1.0), 1.0);
51+
assert.strictEqual(test.asDouble(1.1), 1.1);
52+
assert.strictEqual(test.asDouble(1.9), 1.9);
53+
assert.strictEqual(test.asDouble(0.9), 0.9);
54+
assert.strictEqual(test.asDouble(999.9), 999.9);
55+
assert.strictEqual(test.asDouble(-1), -1);
56+
assert.ok(Number.isNaN(test.asDouble(Number.NaN)));
57+
assert.throws(() => test.asDouble(undefined), numberExpected);
58+
assert.throws(() => test.asDouble(null), numberExpected);
59+
assert.throws(() => test.asDouble(false), numberExpected);
60+
assert.throws(() => test.asDouble(""), numberExpected);
61+
assert.throws(() => test.asDouble("1"), numberExpected);
62+
assert.throws(() => test.asDouble({}), numberExpected);
63+
assert.throws(() => test.asDouble([]), numberExpected);
64+
assert.throws(() => test.asDouble(testSym), numberExpected);
65+
66+
assert.strictEqual(test.asString(""), "");
67+
assert.strictEqual(test.asString("test"), "test");
68+
assert.throws(() => test.asString(undefined), stringExpected);
69+
assert.throws(() => test.asString(null), stringExpected);
70+
assert.throws(() => test.asString(false), stringExpected);
71+
assert.throws(() => test.asString(1), stringExpected);
72+
assert.throws(() => test.asString(1.1), stringExpected);
73+
assert.throws(() => test.asString(Number.NaN), stringExpected);
74+
assert.throws(() => test.asString({}), stringExpected);
75+
assert.throws(() => test.asString([]), stringExpected);
76+
assert.throws(() => test.asString(testSym), stringExpected);
77+
78+
assert.strictEqual(test.toBool(true), true);
79+
assert.strictEqual(test.toBool(1), true);
80+
assert.strictEqual(test.toBool(-1), true);
81+
assert.strictEqual(test.toBool("true"), true);
82+
assert.strictEqual(test.toBool("false"), true);
83+
assert.strictEqual(test.toBool({}), true);
84+
assert.strictEqual(test.toBool([]), true);
85+
assert.strictEqual(test.toBool(testSym), true);
86+
assert.strictEqual(test.toBool(false), false);
87+
assert.strictEqual(test.toBool(undefined), false);
88+
assert.strictEqual(test.toBool(null), false);
89+
assert.strictEqual(test.toBool(0), false);
90+
assert.strictEqual(test.toBool(Number.NaN), false);
91+
assert.strictEqual(test.toBool(""), false);
92+
93+
assert.strictEqual(test.toNumber(0), 0);
94+
assert.strictEqual(test.toNumber(1), 1);
95+
assert.strictEqual(test.toNumber(1.1), 1.1);
96+
assert.strictEqual(test.toNumber(-1), -1);
97+
assert.strictEqual(test.toNumber("0"), 0);
98+
assert.strictEqual(test.toNumber("1"), 1);
99+
assert.strictEqual(test.toNumber("1.1"), 1.1);
100+
assert.strictEqual(test.toNumber([]), 0);
101+
assert.strictEqual(test.toNumber(false), 0);
102+
assert.strictEqual(test.toNumber(null), 0);
103+
assert.strictEqual(test.toNumber(""), 0);
104+
assert.ok(Number.isNaN(test.toNumber(Number.NaN)));
105+
assert.ok(Number.isNaN(test.toNumber({})));
106+
assert.ok(Number.isNaN(test.toNumber(undefined)));
107+
assert.throws(() => test.toNumber(testSym), TypeError);
108+
109+
assert.deepStrictEqual({}, test.toObject({}));
110+
assert.deepStrictEqual({ test: 1 }, test.toObject({ test: 1 }));
111+
assert.deepStrictEqual([], test.toObject([]));
112+
assert.deepStrictEqual([1, 2, 3], test.toObject([1, 2, 3]));
113+
assert.deepStrictEqual(new Boolean(false), test.toObject(false));
114+
assert.deepStrictEqual(new Boolean(true), test.toObject(true));
115+
assert.deepStrictEqual(new String(""), test.toObject(""));
116+
assert.deepStrictEqual(new Number(0), test.toObject(0));
117+
assert.deepStrictEqual(new Number(Number.NaN), test.toObject(Number.NaN));
118+
assert.deepStrictEqual(new Object(testSym), test.toObject(testSym));
119+
assert.notStrictEqual(test.toObject(false), false);
120+
assert.notStrictEqual(test.toObject(true), true);
121+
assert.notStrictEqual(test.toObject(""), "");
122+
assert.notStrictEqual(test.toObject(0), 0);
123+
assert.ok(!Number.isNaN(test.toObject(Number.NaN)));
124+
125+
assert.strictEqual(test.toString(""), "");
126+
assert.strictEqual(test.toString("test"), "test");
127+
assert.strictEqual(test.toString(undefined), "undefined");
128+
assert.strictEqual(test.toString(null), "null");
129+
assert.strictEqual(test.toString(false), "false");
130+
assert.strictEqual(test.toString(true), "true");
131+
assert.strictEqual(test.toString(0), "0");
132+
assert.strictEqual(test.toString(1.1), "1.1");
133+
assert.strictEqual(test.toString(Number.NaN), "NaN");
134+
assert.strictEqual(test.toString({}), "[object Object]");
135+
assert.strictEqual(test.toString({ toString: () => "test" }), "test");
136+
assert.strictEqual(test.toString([]), "");
137+
assert.strictEqual(test.toString([1, 2, 3]), "1,2,3");
138+
assert.throws(() => test.toString(testSym), TypeError);
139+
140+
assert.deepStrictEqual(test.testNull.getValueBool(), {
141+
envIsNull: "Invalid argument",
142+
valueIsNull: "Invalid argument",
143+
resultIsNull: "Invalid argument",
144+
inputTypeCheck: "A boolean was expected",
145+
});
146+
147+
assert.deepStrictEqual(test.testNull.getValueInt32(), {
148+
envIsNull: "Invalid argument",
149+
valueIsNull: "Invalid argument",
150+
resultIsNull: "Invalid argument",
151+
inputTypeCheck: "A number was expected",
152+
});
153+
154+
assert.deepStrictEqual(test.testNull.getValueUint32(), {
155+
envIsNull: "Invalid argument",
156+
valueIsNull: "Invalid argument",
157+
resultIsNull: "Invalid argument",
158+
inputTypeCheck: "A number was expected",
159+
});
160+
161+
assert.deepStrictEqual(test.testNull.getValueInt64(), {
162+
envIsNull: "Invalid argument",
163+
valueIsNull: "Invalid argument",
164+
resultIsNull: "Invalid argument",
165+
inputTypeCheck: "A number was expected",
166+
});
167+
168+
assert.deepStrictEqual(test.testNull.getValueDouble(), {
169+
envIsNull: "Invalid argument",
170+
valueIsNull: "Invalid argument",
171+
resultIsNull: "Invalid argument",
172+
inputTypeCheck: "A number was expected",
173+
});
174+
175+
assert.deepStrictEqual(test.testNull.coerceToBool(), {
176+
envIsNull: "Invalid argument",
177+
valueIsNull: "Invalid argument",
178+
resultIsNull: "Invalid argument",
179+
inputTypeCheck: "napi_ok",
180+
});
181+
182+
assert.deepStrictEqual(test.testNull.coerceToObject(), {
183+
envIsNull: "Invalid argument",
184+
valueIsNull: "Invalid argument",
185+
resultIsNull: "Invalid argument",
186+
inputTypeCheck: "napi_ok",
187+
});
188+
189+
assert.deepStrictEqual(test.testNull.coerceToString(), {
190+
envIsNull: "Invalid argument",
191+
valueIsNull: "Invalid argument",
192+
resultIsNull: "Invalid argument",
193+
inputTypeCheck: "napi_ok",
194+
});
195+
196+
assert.deepStrictEqual(test.testNull.getValueStringUtf8(), {
197+
envIsNull: "Invalid argument",
198+
valueIsNull: "Invalid argument",
199+
wrongTypeIn: "A string was expected",
200+
bufAndOutLengthIsNull: "Invalid argument",
201+
});
202+
203+
assert.deepStrictEqual(test.testNull.getValueStringLatin1(), {
204+
envIsNull: "Invalid argument",
205+
valueIsNull: "Invalid argument",
206+
wrongTypeIn: "A string was expected",
207+
bufAndOutLengthIsNull: "Invalid argument",
208+
});
209+
210+
assert.deepStrictEqual(test.testNull.getValueStringUtf16(), {
211+
envIsNull: "Invalid argument",
212+
valueIsNull: "Invalid argument",
213+
wrongTypeIn: "A string was expected",
214+
bufAndOutLengthIsNull: "Invalid argument",
215+
});

0 commit comments

Comments
 (0)