@@ -5,50 +5,113 @@ const test_number = require(`./build/${common.buildType}/test_number`);
55
66
77// testing api calls for number
8- assert . strictEqual ( 0 , test_number . Test ( 0 ) ) ;
9- assert . strictEqual ( 1 , test_number . Test ( 1 ) ) ;
10- assert . strictEqual ( - 1 , test_number . Test ( - 1 ) ) ;
11- assert . strictEqual ( 100 , test_number . Test ( 100 ) ) ;
12- assert . strictEqual ( 2121 , test_number . Test ( 2121 ) ) ;
13- assert . strictEqual ( - 1233 , test_number . Test ( - 1233 ) ) ;
14- assert . strictEqual ( 986583 , test_number . Test ( 986583 ) ) ;
15- assert . strictEqual ( - 976675 , test_number . Test ( - 976675 ) ) ;
8+ function testNumber ( num ) {
9+ assert . strictEqual ( num , test_number . Test ( num ) ) ;
10+ }
1611
17- const num1 = 98765432213456789876546896323445679887645323232436587988766545658 ;
18- assert . strictEqual ( num1 , test_number . Test ( num1 ) ) ;
12+ testNumber ( 0 ) ;
13+ testNumber ( - 0 ) ;
14+ testNumber ( 1 ) ;
15+ testNumber ( - 1 ) ;
16+ testNumber ( 100 ) ;
17+ testNumber ( 2121 ) ;
18+ testNumber ( - 1233 ) ;
19+ testNumber ( 986583 ) ;
20+ testNumber ( - 976675 ) ;
1921
20- const num2 = - 4350987086545760976737453646576078997096876957864353245245769809 ;
21- assert . strictEqual ( num2 , test_number . Test ( num2 ) ) ;
22+ testNumber (
23+ 98765432213456789876546896323445679887645323232436587988766545658 ) ;
24+ testNumber (
25+ - 4350987086545760976737453646576078997096876957864353245245769809 ) ;
26+ testNumber ( Number . MIN_SAFE_INTEGER ) ;
27+ testNumber ( Number . MAX_SAFE_INTEGER ) ;
28+ testNumber ( Number . MAX_SAFE_INTEGER + 10 ) ;
2229
23- const num3 = Number . MAX_SAFE_INTEGER ;
24- assert . strictEqual ( num3 , test_number . Test ( num3 ) ) ;
30+ testNumber ( Number . MIN_VALUE ) ;
31+ testNumber ( Number . MAX_VALUE ) ;
32+ testNumber ( Number . MAX_VALUE + 10 ) ;
2533
26- const num4 = Number . MAX_SAFE_INTEGER + 10 ;
27- assert . strictEqual ( num4 , test_number . Test ( num4 ) ) ;
34+ testNumber ( Number . POSITIVE_INFINITY ) ;
35+ testNumber ( Number . NEGATIVE_INFINITY ) ;
36+ assert ( Object . is ( NaN , test_number . Test ( NaN ) ) ) ;
2837
29- const num5 = Number . MAX_VALUE ;
30- assert . strictEqual ( num5 , test_number . Test ( num5 ) ) ;
38+ // validate documented behavior when value is retrieved as 32-bit integer with
39+ // `napi_get_value_int32`
40+ function testInt32 ( input , expected = input ) {
41+ assert . strictEqual ( expected , test_number . TestInt32Truncation ( input ) ) ;
42+ }
3143
32- const num6 = Number . MAX_VALUE + 10 ;
33- assert . strictEqual ( num6 , test_number . Test ( num6 ) ) ;
44+ // Test zero
45+ testInt32 ( 0.0 , 0 ) ;
46+ testInt32 ( - 0.0 , 0 ) ;
3447
35- const num7 = Number . POSITIVE_INFINITY ;
36- assert . strictEqual ( num7 , test_number . Test ( num7 ) ) ;
48+ // Test min/max int32 range
49+ testInt32 ( - Math . pow ( 2 , 31 ) ) ;
50+ testInt32 ( Math . pow ( 2 , 31 ) - 1 ) ;
3751
38- const num8 = Number . NEGATIVE_INFINITY ;
39- assert . strictEqual ( num8 , test_number . Test ( num8 ) ) ;
52+ // Test overflow scenarios
53+ testInt32 ( 4294967297 , 1 ) ;
54+ testInt32 ( 4294967296 , 0 ) ;
55+ testInt32 ( 4294967295 , - 1 ) ;
56+ testInt32 ( 4294967296 * 5 + 3 , 3 ) ;
4057
58+ // Test min/max safe integer range
59+ testInt32 ( Number . MIN_SAFE_INTEGER , 1 ) ;
60+ testInt32 ( Number . MAX_SAFE_INTEGER , - 1 ) ;
4161
42- // validate documented behaviour when value is retrieved
43- // as 32 bit integer with napi_get_value_int32
44- assert . strictEqual ( 1 , test_number . TestInt32Truncation ( 4294967297 ) ) ;
45- assert . strictEqual ( 0 , test_number . TestInt32Truncation ( 4294967296 ) ) ;
46- assert . strictEqual ( - 1 , test_number . TestInt32Truncation ( 4294967295 ) ) ;
47- assert . strictEqual ( 3 , test_number . TestInt32Truncation ( 4294967296 * 5 + 3 ) ) ;
62+ // Test within int64_t range (with precision loss)
63+ testInt32 ( - Math . pow ( 2 , 63 ) + ( Math . pow ( 2 , 9 ) + 1 ) , 1024 ) ;
64+ testInt32 ( Math . pow ( 2 , 63 ) - ( Math . pow ( 2 , 9 ) + 1 ) , - 1024 ) ;
4865
49- // validate that the boundaries of safe integer can be passed through
50- // successfully
51- assert . strictEqual ( Number . MAX_SAFE_INTEGER ,
52- test_number . TestInt64Truncation ( Number . MAX_SAFE_INTEGER ) ) ;
53- assert . strictEqual ( Number . MIN_SAFE_INTEGER ,
54- test_number . TestInt64Truncation ( Number . MIN_SAFE_INTEGER ) ) ;
66+ // Test min/max double value
67+ testInt32 ( - Number . MIN_VALUE , 0 ) ;
68+ testInt32 ( Number . MIN_VALUE , 0 ) ;
69+ testInt32 ( - Number . MAX_VALUE , 0 ) ;
70+ testInt32 ( Number . MAX_VALUE , 0 ) ;
71+
72+ // Test outside int64_t range
73+ testInt32 ( - Math . pow ( 2 , 63 ) + ( Math . pow ( 2 , 9 ) ) , 0 ) ;
74+ testInt32 ( Math . pow ( 2 , 63 ) - ( Math . pow ( 2 , 9 ) ) , 0 ) ;
75+
76+ // Test non-finite numbers
77+ testInt32 ( Number . POSITIVE_INFINITY , 0 ) ;
78+ testInt32 ( Number . NEGATIVE_INFINITY , 0 ) ;
79+ testInt32 ( Number . NaN , 0 ) ;
80+
81+ // validate documented behavior when value is retrieved as 64-bit integer with
82+ // `napi_get_value_int64`
83+ function testInt64 ( input , expected = input ) {
84+ assert . strictEqual ( expected , test_number . TestInt64Truncation ( input ) ) ;
85+ }
86+
87+ // Both V8 and ChakraCore return a sentinel value of `0x8000000000000000` when
88+ // the conversion goes out of range, but V8 treats it as unsigned in some cases.
89+ const RANGEERROR_POSITIVE = Math . pow ( 2 , 63 ) ;
90+ const RANGEERROR_NEGATIVE = - Math . pow ( 2 , 63 ) ;
91+
92+ // Test zero
93+ testInt64 ( 0.0 , 0 ) ;
94+ testInt64 ( - 0.0 , 0 ) ;
95+
96+ // Test min/max safe integer range
97+ testInt64 ( Number . MIN_SAFE_INTEGER ) ;
98+ testInt64 ( Number . MAX_SAFE_INTEGER ) ;
99+
100+ // Test within int64_t range (with precision loss)
101+ testInt64 ( - Math . pow ( 2 , 63 ) + ( Math . pow ( 2 , 9 ) + 1 ) ) ;
102+ testInt64 ( Math . pow ( 2 , 63 ) - ( Math . pow ( 2 , 9 ) + 1 ) ) ;
103+
104+ // Test min/max double value
105+ testInt64 ( - Number . MIN_VALUE , 0 ) ;
106+ testInt64 ( Number . MIN_VALUE , 0 ) ;
107+ testInt64 ( - Number . MAX_VALUE , RANGEERROR_NEGATIVE ) ;
108+ testInt64 ( Number . MAX_VALUE , RANGEERROR_POSITIVE ) ;
109+
110+ // Test outside int64_t range
111+ testInt64 ( - Math . pow ( 2 , 63 ) + ( Math . pow ( 2 , 9 ) ) , RANGEERROR_NEGATIVE ) ;
112+ testInt64 ( Math . pow ( 2 , 63 ) - ( Math . pow ( 2 , 9 ) ) , RANGEERROR_POSITIVE ) ;
113+
114+ // Test non-finite numbers
115+ testInt64 ( Number . POSITIVE_INFINITY , 0 ) ;
116+ testInt64 ( Number . NEGATIVE_INFINITY , 0 ) ;
117+ testInt64 ( Number . NaN , 0 ) ;
0 commit comments