@zappdev/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/README.md +55 -0
  2. package/dist/zapp-cli.js +9471 -0
  3. package/native/src/app/app.zc +490 -0
  4. package/native/src/event/event.zc +24 -0
  5. package/native/src/event/events.zc +70 -0
  6. package/native/src/platform/darwin/backend.zc +923 -0
  7. package/native/src/platform/darwin/backend_bootstrap.zc +9 -0
  8. package/native/src/platform/darwin/bootstrap.zc +9 -0
  9. package/native/src/platform/darwin/engine_jsc.zc +86 -0
  10. package/native/src/platform/darwin/engine_qjs.zc +92 -0
  11. package/native/src/platform/darwin/platform.zc +156 -0
  12. package/native/src/platform/darwin/webview.zc +550 -0
  13. package/native/src/platform/darwin/webview_bootstrap.zc +9 -0
  14. package/native/src/platform/darwin/window.zc +1223 -0
  15. package/native/src/platform/darwin/worker/common.zc +223 -0
  16. package/native/src/platform/darwin/worker/core/base64_core.zc +29 -0
  17. package/native/src/platform/darwin/worker/core/crypto_core.zc +19 -0
  18. package/native/src/platform/darwin/worker/core/encoding_core.zc +32 -0
  19. package/native/src/platform/darwin/worker/core/fetch_core.zc +145 -0
  20. package/native/src/platform/darwin/worker/core/url_core.zc +69 -0
  21. package/native/src/platform/darwin/worker/core/websocket_core.zc +179 -0
  22. package/native/src/platform/darwin/worker/dispatch.zc +55 -0
  23. package/native/src/platform/darwin/worker/jsc/base64_jsc.zc +39 -0
  24. package/native/src/platform/darwin/worker/jsc/crypto_jsc.zc +49 -0
  25. package/native/src/platform/darwin/worker/jsc/encoding_jsc.zc +86 -0
  26. package/native/src/platform/darwin/worker/jsc/fetch_jsc.zc +149 -0
  27. package/native/src/platform/darwin/worker/jsc/url_jsc.zc +54 -0
  28. package/native/src/platform/darwin/worker/jsc/websocket_jsc.zc +127 -0
  29. package/native/src/platform/darwin/worker/jsc.zc +670 -0
  30. package/native/src/platform/darwin/worker/mod.zc +30 -0
  31. package/native/src/platform/darwin/worker/qjs/fetch_qjs.zc +233 -0
  32. package/native/src/platform/darwin/worker/qjs/qjs_macros.zc +23 -0
  33. package/native/src/platform/darwin/worker/qjs/websocket_qjs.zc +223 -0
  34. package/native/src/platform/darwin/worker/qjs.zc +1053 -0
  35. package/native/src/platform/darwin/worker/timers.zc +149 -0
  36. package/native/src/platform/darwin/worker/timers_qjs.zc +209 -0
  37. package/native/src/platform/platform.zc +64 -0
  38. package/native/src/platform/shared/log.zc +156 -0
  39. package/native/src/platform/shared/worker/qjs/base64_qjs.zc +38 -0
  40. package/native/src/platform/shared/worker/qjs/crypto_qjs.zc +44 -0
  41. package/native/src/platform/shared/worker/qjs/encoding_qjs.zc +95 -0
  42. package/native/src/platform/shared/worker/qjs/url_qjs.zc +65 -0
  43. package/native/src/platform/shared/worker_registry.zc +206 -0
  44. package/native/src/platform/window.zc +446 -0
  45. package/native/src/platform/windows/backend.zc +452 -0
  46. package/native/src/platform/windows/backend_bootstrap.zc +9 -0
  47. package/native/src/platform/windows/bootstrap.zc +9 -0
  48. package/native/src/platform/windows/engine_qjs.zc +60 -0
  49. package/native/src/platform/windows/platform.zc +387 -0
  50. package/native/src/platform/windows/webview.zc +1175 -0
  51. package/native/src/platform/windows/webview_bootstrap.zc +9 -0
  52. package/native/src/platform/windows/window.zc +1271 -0
  53. package/native/src/platform/windows/worker/common.zc +409 -0
  54. package/native/src/platform/windows/worker/core/base64_core.zc +52 -0
  55. package/native/src/platform/windows/worker/core/crypto_core.zc +34 -0
  56. package/native/src/platform/windows/worker/core/encoding_core.zc +60 -0
  57. package/native/src/platform/windows/worker/core/fetch_core.zc +274 -0
  58. package/native/src/platform/windows/worker/core/url_core.zc +216 -0
  59. package/native/src/platform/windows/worker/core/websocket_core.zc +343 -0
  60. package/native/src/platform/windows/worker/dispatch.zc +34 -0
  61. package/native/src/platform/windows/worker/mod.zc +46 -0
  62. package/native/src/platform/windows/worker/qjs/fetch_qjs.zc +255 -0
  63. package/native/src/platform/windows/worker/qjs/websocket_qjs.zc +263 -0
  64. package/native/src/platform/windows/worker/qjs.zc +1049 -0
  65. package/native/src/platform/windows/worker/timers_qjs.zc +288 -0
  66. package/native/src/platform/worker.zc +8 -0
  67. package/native/src/service/service.zc +228 -0
  68. package/native/vendor/quickjs-ng/.gitattributes +4 -0
  69. package/native/vendor/quickjs-ng/.github/dependabot.yml +7 -0
  70. package/native/vendor/quickjs-ng/.github/workflows/ci.yml +812 -0
  71. package/native/vendor/quickjs-ng/.github/workflows/docs.yml +49 -0
  72. package/native/vendor/quickjs-ng/.github/workflows/release.yml +162 -0
  73. package/native/vendor/quickjs-ng/.github/workflows/test-docs.yml +23 -0
  74. package/native/vendor/quickjs-ng/.github/workflows/tsan.yml +32 -0
  75. package/native/vendor/quickjs-ng/.github/workflows/valgrind.yml +33 -0
  76. package/native/vendor/quickjs-ng/.gitmodules +5 -0
  77. package/native/vendor/quickjs-ng/CMakeLists.txt +553 -0
  78. package/native/vendor/quickjs-ng/LICENSE +24 -0
  79. package/native/vendor/quickjs-ng/Makefile +149 -0
  80. package/native/vendor/quickjs-ng/amalgam.js +53 -0
  81. package/native/vendor/quickjs-ng/api-test.c +927 -0
  82. package/native/vendor/quickjs-ng/builtin-array-fromasync.h +119 -0
  83. package/native/vendor/quickjs-ng/builtin-array-fromasync.js +36 -0
  84. package/native/vendor/quickjs-ng/builtin-iterator-zip-keyed.h +332 -0
  85. package/native/vendor/quickjs-ng/builtin-iterator-zip-keyed.js +194 -0
  86. package/native/vendor/quickjs-ng/builtin-iterator-zip.h +337 -0
  87. package/native/vendor/quickjs-ng/builtin-iterator-zip.js +210 -0
  88. package/native/vendor/quickjs-ng/ctest.c +17 -0
  89. package/native/vendor/quickjs-ng/cutils.h +2013 -0
  90. package/native/vendor/quickjs-ng/cxxtest.cc +2 -0
  91. package/native/vendor/quickjs-ng/dtoa.c +1619 -0
  92. package/native/vendor/quickjs-ng/dtoa.h +87 -0
  93. package/native/vendor/quickjs-ng/examples/fib.c +67 -0
  94. package/native/vendor/quickjs-ng/examples/fib_module.js +10 -0
  95. package/native/vendor/quickjs-ng/examples/hello.js +1 -0
  96. package/native/vendor/quickjs-ng/examples/hello_module.js +6 -0
  97. package/native/vendor/quickjs-ng/examples/meson.build +17 -0
  98. package/native/vendor/quickjs-ng/examples/pi_bigint.js +118 -0
  99. package/native/vendor/quickjs-ng/examples/point.c +154 -0
  100. package/native/vendor/quickjs-ng/examples/test_fib.js +8 -0
  101. package/native/vendor/quickjs-ng/examples/test_point.js +43 -0
  102. package/native/vendor/quickjs-ng/fuzz.c +51 -0
  103. package/native/vendor/quickjs-ng/gen/function_source.c +81 -0
  104. package/native/vendor/quickjs-ng/gen/hello.c +53 -0
  105. package/native/vendor/quickjs-ng/gen/hello_module.c +106 -0
  106. package/native/vendor/quickjs-ng/gen/repl.c +3053 -0
  107. package/native/vendor/quickjs-ng/gen/standalone.c +324 -0
  108. package/native/vendor/quickjs-ng/gen/test_fib.c +81 -0
  109. package/native/vendor/quickjs-ng/libregexp-opcode.h +58 -0
  110. package/native/vendor/quickjs-ng/libregexp.c +2687 -0
  111. package/native/vendor/quickjs-ng/libregexp.h +98 -0
  112. package/native/vendor/quickjs-ng/libunicode-table.h +4707 -0
  113. package/native/vendor/quickjs-ng/libunicode.c +1746 -0
  114. package/native/vendor/quickjs-ng/libunicode.h +126 -0
  115. package/native/vendor/quickjs-ng/list.h +107 -0
  116. package/native/vendor/quickjs-ng/lre-test.c +73 -0
  117. package/native/vendor/quickjs-ng/meson.build +684 -0
  118. package/native/vendor/quickjs-ng/meson_options.txt +6 -0
  119. package/native/vendor/quickjs-ng/qjs-wasi-reactor.c +208 -0
  120. package/native/vendor/quickjs-ng/qjs.c +748 -0
  121. package/native/vendor/quickjs-ng/qjsc.c +673 -0
  122. package/native/vendor/quickjs-ng/quickjs-atom.h +267 -0
  123. package/native/vendor/quickjs-ng/quickjs-c-atomics.h +54 -0
  124. package/native/vendor/quickjs-ng/quickjs-libc.c +4986 -0
  125. package/native/vendor/quickjs-ng/quickjs-libc.h +79 -0
  126. package/native/vendor/quickjs-ng/quickjs-opcode.h +369 -0
  127. package/native/vendor/quickjs-ng/quickjs.c +60259 -0
  128. package/native/vendor/quickjs-ng/quickjs.h +1419 -0
  129. package/native/vendor/quickjs-ng/repl.js +1927 -0
  130. package/native/vendor/quickjs-ng/run-test262.c +2417 -0
  131. package/native/vendor/quickjs-ng/standalone.js +129 -0
  132. package/native/vendor/quickjs-ng/tests/assert.js +49 -0
  133. package/native/vendor/quickjs-ng/tests/bug1221.js +16 -0
  134. package/native/vendor/quickjs-ng/tests/bug1296.js +12 -0
  135. package/native/vendor/quickjs-ng/tests/bug1297.js +22 -0
  136. package/native/vendor/quickjs-ng/tests/bug1301.js +21 -0
  137. package/native/vendor/quickjs-ng/tests/bug1302.js +24 -0
  138. package/native/vendor/quickjs-ng/tests/bug1305.js +26 -0
  139. package/native/vendor/quickjs-ng/tests/bug1318.js +54 -0
  140. package/native/vendor/quickjs-ng/tests/bug1352.js +8 -0
  141. package/native/vendor/quickjs-ng/tests/bug1354.js +6 -0
  142. package/native/vendor/quickjs-ng/tests/bug1355.js +58 -0
  143. package/native/vendor/quickjs-ng/tests/bug1368.js +9 -0
  144. package/native/vendor/quickjs-ng/tests/bug39/1.js +6 -0
  145. package/native/vendor/quickjs-ng/tests/bug39/2.js +6 -0
  146. package/native/vendor/quickjs-ng/tests/bug39/3.js +7 -0
  147. package/native/vendor/quickjs-ng/tests/bug488-upstream.js +7 -0
  148. package/native/vendor/quickjs-ng/tests/bug633/0.js +7 -0
  149. package/native/vendor/quickjs-ng/tests/bug633/1.js +4 -0
  150. package/native/vendor/quickjs-ng/tests/bug633/2.js +4 -0
  151. package/native/vendor/quickjs-ng/tests/bug633/3.js +4 -0
  152. package/native/vendor/quickjs-ng/tests/bug645/0.js +4 -0
  153. package/native/vendor/quickjs-ng/tests/bug645/1.js +9 -0
  154. package/native/vendor/quickjs-ng/tests/bug645/2.js +7 -0
  155. package/native/vendor/quickjs-ng/tests/bug648.js +13 -0
  156. package/native/vendor/quickjs-ng/tests/bug652.js +4 -0
  157. package/native/vendor/quickjs-ng/tests/bug741.js +19 -0
  158. package/native/vendor/quickjs-ng/tests/bug775.js +7 -0
  159. package/native/vendor/quickjs-ng/tests/bug776.js +7 -0
  160. package/native/vendor/quickjs-ng/tests/bug832.js +2 -0
  161. package/native/vendor/quickjs-ng/tests/bug858.js +26 -0
  162. package/native/vendor/quickjs-ng/tests/bug904.js +6 -0
  163. package/native/vendor/quickjs-ng/tests/bug988.js +7 -0
  164. package/native/vendor/quickjs-ng/tests/bug999.js +3 -0
  165. package/native/vendor/quickjs-ng/tests/destructured-export.js +8 -0
  166. package/native/vendor/quickjs-ng/tests/detect_module/0.js +1 -0
  167. package/native/vendor/quickjs-ng/tests/detect_module/1.js +2 -0
  168. package/native/vendor/quickjs-ng/tests/detect_module/2.js +1 -0
  169. package/native/vendor/quickjs-ng/tests/detect_module/3.js +8 -0
  170. package/native/vendor/quickjs-ng/tests/detect_module/4.js +3 -0
  171. package/native/vendor/quickjs-ng/tests/empty.js +0 -0
  172. package/native/vendor/quickjs-ng/tests/fixture_cyclic_import.js +2 -0
  173. package/native/vendor/quickjs-ng/tests/fixture_string_exports.js +12 -0
  174. package/native/vendor/quickjs-ng/tests/function_source.js +14 -0
  175. package/native/vendor/quickjs-ng/tests/microbench.js +1267 -0
  176. package/native/vendor/quickjs-ng/tests/null_or_undefined.js +38 -0
  177. package/native/vendor/quickjs-ng/tests/str-pad-leak.js +5 -0
  178. package/native/vendor/quickjs-ng/tests/test_bigint.js +107 -0
  179. package/native/vendor/quickjs-ng/tests/test_bjson.js +366 -0
  180. package/native/vendor/quickjs-ng/tests/test_builtin.js +1314 -0
  181. package/native/vendor/quickjs-ng/tests/test_closure.js +220 -0
  182. package/native/vendor/quickjs-ng/tests/test_cyclic_import.js +12 -0
  183. package/native/vendor/quickjs-ng/tests/test_domexception.js +35 -0
  184. package/native/vendor/quickjs-ng/tests/test_language.js +755 -0
  185. package/native/vendor/quickjs-ng/tests/test_loop.js +367 -0
  186. package/native/vendor/quickjs-ng/tests/test_queue_microtask.js +39 -0
  187. package/native/vendor/quickjs-ng/tests/test_std.js +340 -0
  188. package/native/vendor/quickjs-ng/tests/test_string_exports.js +25 -0
  189. package/native/vendor/quickjs-ng/tests/test_worker.js +43 -0
  190. package/native/vendor/quickjs-ng/tests/test_worker_module.js +30 -0
  191. package/native/vendor/quickjs-ng/tests.conf +14 -0
  192. package/native/vendor/quickjs-ng/unicode_download.sh +19 -0
  193. package/native/vendor/quickjs-ng/unicode_gen.c +3108 -0
  194. package/native/vendor/quickjs-ng/unicode_gen_def.h +310 -0
  195. package/native/vendor/quickjs-ng/update-version.sh +32 -0
  196. package/native/vendor/webview2/include/WebView2.h +60636 -0
  197. package/native/vendor/webview2/include/WebView2EnvironmentOptions.h +406 -0
  198. package/package.json +33 -0
  199. package/src/backend.ts +139 -0
  200. package/src/build-config.ts +87 -0
  201. package/src/build.ts +276 -0
  202. package/src/common.ts +195 -0
  203. package/src/config.ts +89 -0
  204. package/src/dev.ts +164 -0
  205. package/src/generate.ts +200 -0
  206. package/src/icons.ts +116 -0
  207. package/src/init.ts +190 -0
  208. package/src/package.ts +150 -0
  209. package/src/zapp-cli.ts +263 -0
@@ -0,0 +1,1314 @@
1
+ import * as os from "qjs:os";
2
+ import { assert, assertThrows } from "./assert.js";
3
+
4
+ // Keep this at the top; it tests source positions.
5
+ function test_exception_source_pos()
6
+ {
7
+ var e;
8
+
9
+ try {
10
+ throw new Error(""); // line 10, column 19
11
+ } catch(_e) {
12
+ e = _e;
13
+ }
14
+
15
+ assert(e.stack.includes("test_builtin.js:10:19"));
16
+ }
17
+
18
+ // Keep this at the top; it tests source positions.
19
+ function test_function_source_pos() // line 19, column 1
20
+ {
21
+ function inner() {} // line 21, column 5
22
+ var f = eval("function f() {} f");
23
+ assert(`${test_function_source_pos.lineNumber}:${test_function_source_pos.columnNumber}`, "19:1");
24
+ assert(`${inner.lineNumber}:${inner.columnNumber}`, "21:5");
25
+ assert(`${f.lineNumber}:${f.columnNumber}`, "1:1");
26
+ }
27
+
28
+ // Keep this at the top; it tests source positions.
29
+ function test_exception_prepare_stack()
30
+ {
31
+ var e;
32
+
33
+ Error.prepareStackTrace = (_, frames) => {
34
+ // Just return the array to check.
35
+ return frames;
36
+ };
37
+
38
+ try {
39
+ throw new Error(""); // line 39, column 19
40
+ } catch(_e) {
41
+ e = _e;
42
+ }
43
+
44
+ Error.prepareStackTrace = undefined;
45
+
46
+ assert(e.stack.length, 2);
47
+ const f = e.stack[0];
48
+ assert(f.getFunctionName(), 'test_exception_prepare_stack');
49
+ assert(f.getFileName().endsWith('test_builtin.js'));
50
+ assert(f.getLineNumber(), 39);
51
+ assert(f.getColumnNumber(), 19);
52
+ assert(!f.isNative());
53
+ }
54
+
55
+ // Keep this at the top; it tests source positions.
56
+ function test_exception_stack_size_limit()
57
+ {
58
+ var e;
59
+
60
+ Error.stackTraceLimit = 1;
61
+ Error.prepareStackTrace = (_, frames) => {
62
+ // Just return the array to check.
63
+ return frames;
64
+ };
65
+
66
+ try {
67
+ throw new Error(""); // line 67, column 19
68
+ } catch(_e) {
69
+ e = _e;
70
+ }
71
+
72
+ Error.stackTraceLimit = 10;
73
+ Error.prepareStackTrace = undefined;
74
+
75
+ assert(e.stack.length, 1);
76
+ const f = e.stack[0];
77
+ assert(f.getFunctionName(), 'test_exception_stack_size_limit');
78
+ assert(f.getFileName().endsWith('test_builtin.js'));
79
+ assert(f.getLineNumber(), 67);
80
+ assert(f.getColumnNumber(), 19);
81
+ assert(!f.isNative());
82
+ }
83
+
84
+ function test_exception_capture_stack_trace()
85
+ {
86
+ var o = {};
87
+
88
+ assertThrows(TypeError, (function() {
89
+ Error.captureStackTrace();
90
+ }));
91
+
92
+ Error.captureStackTrace(o);
93
+
94
+ assert(typeof o.stack === 'string');
95
+ assert(o.stack.includes('test_exception_capture_stack_trace'));
96
+ }
97
+
98
+ function test_exception_capture_stack_trace_filter()
99
+ {
100
+ var o = {};
101
+ const fun1 = () => { fun2(); };
102
+ const fun2 = () => { fun3(); };
103
+ const fun3 = () => { log_stack(); };
104
+ function log_stack() {
105
+ Error.captureStackTrace(o, fun3);
106
+ }
107
+ fun1();
108
+
109
+ Error.captureStackTrace(o);
110
+
111
+ assert(!o.stack.includes('fun3'));
112
+ assert(!o.stack.includes('log_stack'));
113
+ }
114
+
115
+ function my_func(a, b)
116
+ {
117
+ return a + b;
118
+ }
119
+
120
+ function test_function()
121
+ {
122
+ function f(a, b) {
123
+ var i, tab = [];
124
+ tab.push(this);
125
+ for(i = 0; i < arguments.length; i++)
126
+ tab.push(arguments[i]);
127
+ return tab;
128
+ }
129
+ function constructor1(a) {
130
+ this.x = a;
131
+ }
132
+
133
+ var r, g;
134
+
135
+ r = my_func.call(null, 1, 2);
136
+ assert(r, 3, "call");
137
+
138
+ r = my_func.apply(null, [1, 2]);
139
+ assert(r, 3, "apply");
140
+
141
+ r = (function () { return 1; }).apply(null, undefined);
142
+ assert(r, 1);
143
+
144
+ assertThrows(TypeError, (function() {
145
+ Reflect.apply((function () { return 1; }), null, undefined);
146
+ }));
147
+
148
+ r = new Function("a", "b", "return a + b;");
149
+ assert(r(2,3), 5, "function");
150
+
151
+ g = f.bind(1, 2);
152
+ assert(g.length, 1);
153
+ assert(g.name, "bound f");
154
+ assert(g(3), [1,2,3]);
155
+
156
+ g = constructor1.bind(null, 1);
157
+ r = new g();
158
+ assert(r.x, 1);
159
+ }
160
+
161
+ function test()
162
+ {
163
+ var r, a, b, c, err;
164
+
165
+ r = Error("hello");
166
+ assert(r.message, "hello", "Error");
167
+
168
+ a = new Object();
169
+ a.x = 1;
170
+ assert(a.x, 1, "Object");
171
+
172
+ assert(Object.getPrototypeOf(a), Object.prototype, "getPrototypeOf");
173
+ Object.defineProperty(a, "y", { value: 3, writable: true, configurable: true, enumerable: true });
174
+ assert(a.y, 3, "defineProperty");
175
+
176
+ Object.defineProperty(a, "z", { get: function () { return 4; }, set: function(val) { this.z_val = val; }, configurable: true, enumerable: true });
177
+ assert(a.z, 4, "get");
178
+ a.z = 5;
179
+ assert(a.z_val, 5, "set");
180
+
181
+ a = { get z() { return 4; }, set z(val) { this.z_val = val; } };
182
+ assert(a.z, 4, "get");
183
+ a.z = 5;
184
+ assert(a.z_val, 5, "set");
185
+
186
+ b = Object.create(a);
187
+ assert(Object.getPrototypeOf(b), a, "create");
188
+ c = {u:2};
189
+ /* XXX: refcount bug in 'b' instead of 'a' */
190
+ Object.setPrototypeOf(a, c);
191
+ assert(Object.getPrototypeOf(a), c, "setPrototypeOf");
192
+
193
+ a = {};
194
+ assert(a.toString(), "[object Object]", "toString");
195
+
196
+ a = {x:1};
197
+ assert(Object.isExtensible(a), true, "extensible");
198
+ Object.preventExtensions(a);
199
+
200
+ err = false;
201
+ try {
202
+ a.y = 2;
203
+ } catch(e) {
204
+ err = true;
205
+ }
206
+ assert(Object.isExtensible(a), false, "extensible");
207
+ assert(typeof a.y, "undefined", "extensible");
208
+ assert(err, true, "extensible");
209
+
210
+ assertThrows(TypeError, () => Object.setPrototypeOf(Object.prototype, {}));
211
+ }
212
+
213
+ function test_enum()
214
+ {
215
+ var a, tab;
216
+ a = {x:1,
217
+ "18014398509481984": 1,
218
+ "9007199254740992": 1,
219
+ "9007199254740991": 1,
220
+ "4294967296": 1,
221
+ "4294967295": 1,
222
+ y:1,
223
+ "4294967294": 1,
224
+ "1": 2};
225
+ tab = Object.keys(a);
226
+ // console.log("tab=" + tab.toString());
227
+ assert(tab, ["1","4294967294","x","18014398509481984","9007199254740992","9007199254740991","4294967296","4294967295","y"], "keys");
228
+ }
229
+
230
+ function test_array()
231
+ {
232
+ var a, err;
233
+
234
+ a = [1, 2, 3];
235
+ assert(a.length, 3, "array");
236
+ assert(a[2], 3, "array1");
237
+
238
+ a = new Array(10);
239
+ assert(a.length, 10, "array2");
240
+
241
+ a = new Array(1, 2);
242
+ assert(a.length === 2 && a[0] === 1 && a[1] === 2, true, "array3");
243
+
244
+ a = [1, 2, 3];
245
+ a.length = 2;
246
+ assert(a.length === 2 && a[0] === 1 && a[1] === 2, true, "array4");
247
+
248
+ a = [];
249
+ a[1] = 10;
250
+ a[4] = 3;
251
+ assert(a.length, 5);
252
+
253
+ a = [1,2];
254
+ a.length = 5;
255
+ a[4] = 1;
256
+ a.length = 4;
257
+ assert(a[4] !== 1, true, "array5");
258
+
259
+ a = [1,2];
260
+ a.push(3,4);
261
+ assert(a.join(), "1,2,3,4", "join");
262
+
263
+ a = [1,2,3,4,5];
264
+ Object.defineProperty(a, "3", { configurable: false });
265
+ err = false;
266
+ try {
267
+ a.length = 2;
268
+ } catch(e) {
269
+ err = true;
270
+ }
271
+ assert(err && a.toString() === "1,2,3,4");
272
+ }
273
+
274
+ function test_string()
275
+ {
276
+ var a;
277
+ a = String("abc");
278
+ assert(a.length, 3, "string");
279
+ assert(a[1], "b", "string");
280
+ assert(a.charCodeAt(1), 0x62, "string");
281
+ assert(String.fromCharCode(65), "A", "string");
282
+ assert(String.fromCharCode.apply(null, [65, 66, 67]), "ABC", "string");
283
+ assert(a.charAt(1), "b");
284
+ assert(a.charAt(-1), "");
285
+ assert(a.charAt(3), "");
286
+
287
+ a = "abcd";
288
+ assert(a.substring(1, 3), "bc", "substring");
289
+ a = String.fromCharCode(0x20ac);
290
+ assert(a.charCodeAt(0), 0x20ac, "unicode");
291
+ assert(a, "€", "unicode");
292
+ assert(a, "\u20ac", "unicode");
293
+ assert(a, "\u{20ac}", "unicode");
294
+ assert("a", "\x61", "unicode");
295
+
296
+ a = "\u{10ffff}";
297
+ assert(a.length, 2, "unicode");
298
+ assert(a, "\u{dbff}\u{dfff}", "unicode");
299
+ assert(a.codePointAt(0), 0x10ffff);
300
+ assert(String.fromCodePoint(0x10ffff), a);
301
+
302
+ assert("a".concat("b", "c"), "abc");
303
+
304
+ assert("abcabc".indexOf("cab"), 2);
305
+ assert("abcabc".indexOf("cab2"), -1);
306
+ assert("abc".indexOf("c"), 2);
307
+
308
+ assert("aaa".indexOf("a"), 0);
309
+ assert("aaa".indexOf("a", NaN), 0);
310
+ assert("aaa".indexOf("a", -Infinity), 0);
311
+ assert("aaa".indexOf("a", -1), 0);
312
+ assert("aaa".indexOf("a", -0), 0);
313
+ assert("aaa".indexOf("a", 0), 0);
314
+ assert("aaa".indexOf("a", 1), 1);
315
+ assert("aaa".indexOf("a", 2), 2);
316
+ assert("aaa".indexOf("a", 3), -1);
317
+ assert("aaa".indexOf("a", 4), -1);
318
+ assert("aaa".indexOf("a", Infinity), -1);
319
+
320
+ assert("aaa".indexOf(""), 0);
321
+ assert("aaa".indexOf("", NaN), 0);
322
+ assert("aaa".indexOf("", -Infinity), 0);
323
+ assert("aaa".indexOf("", -1), 0);
324
+ assert("aaa".indexOf("", -0), 0);
325
+ assert("aaa".indexOf("", 0), 0);
326
+ assert("aaa".indexOf("", 1), 1);
327
+ assert("aaa".indexOf("", 2), 2);
328
+ assert("aaa".indexOf("", 3), 3);
329
+ assert("aaa".indexOf("", 4), 3);
330
+ assert("aaa".indexOf("", Infinity), 3);
331
+
332
+ assert("aaa".lastIndexOf("a"), 2);
333
+ assert("aaa".lastIndexOf("a", NaN), 2);
334
+ assert("aaa".lastIndexOf("a", -Infinity), 0);
335
+ assert("aaa".lastIndexOf("a", -1), 0);
336
+ assert("aaa".lastIndexOf("a", -0), 0);
337
+ assert("aaa".lastIndexOf("a", 0), 0);
338
+ assert("aaa".lastIndexOf("a", 1), 1);
339
+ assert("aaa".lastIndexOf("a", 2), 2);
340
+ assert("aaa".lastIndexOf("a", 3), 2);
341
+ assert("aaa".lastIndexOf("a", 4), 2);
342
+ assert("aaa".lastIndexOf("a", Infinity), 2);
343
+
344
+ assert("aaa".lastIndexOf(""), 3);
345
+ assert("aaa".lastIndexOf("", NaN), 3);
346
+ assert("aaa".lastIndexOf("", -Infinity), 0);
347
+ assert("aaa".lastIndexOf("", -1), 0);
348
+ assert("aaa".lastIndexOf("", -0), 0);
349
+ assert("aaa".lastIndexOf("", 0), 0);
350
+ assert("aaa".lastIndexOf("", 1), 1);
351
+ assert("aaa".lastIndexOf("", 2), 2);
352
+ assert("aaa".lastIndexOf("", 3), 3);
353
+ assert("aaa".lastIndexOf("", 4), 3);
354
+ assert("aaa".lastIndexOf("", Infinity), 3);
355
+
356
+ assert("a,b,c".split(","), ["a","b","c"]);
357
+ assert(",b,c".split(","), ["","b","c"]);
358
+ assert("a,b,".split(","), ["a","b",""]);
359
+
360
+ assert("aaaa".split(), [ "aaaa" ]);
361
+ assert("aaaa".split(undefined, 0), [ ]);
362
+ assert("aaaa".split(""), [ "a", "a", "a", "a" ]);
363
+ assert("aaaa".split("", 0), [ ]);
364
+ assert("aaaa".split("", 1), [ "a" ]);
365
+ assert("aaaa".split("", 2), [ "a", "a" ]);
366
+ assert("aaaa".split("a"), [ "", "", "", "", "" ]);
367
+ assert("aaaa".split("a", 2), [ "", "" ]);
368
+ assert("aaaa".split("aa"), [ "", "", "" ]);
369
+ assert("aaaa".split("aa", 0), [ ]);
370
+ assert("aaaa".split("aa", 1), [ "" ]);
371
+ assert("aaaa".split("aa", 2), [ "", "" ]);
372
+ assert("aaaa".split("aaa"), [ "", "a" ]);
373
+ assert("aaaa".split("aaaa"), [ "", "" ]);
374
+ assert("aaaa".split("aaaaa"), [ "aaaa" ]);
375
+ assert("aaaa".split("aaaaa", 0), [ ]);
376
+ assert("aaaa".split("aaaaa", 1), [ "aaaa" ]);
377
+
378
+ assert(eval('"\0"'), "\0");
379
+
380
+ assert("abc".padStart(Infinity, ""), "abc");
381
+
382
+ assert(qjs.getStringKind("xyzzy".slice(1)),
383
+ /*JS_STRING_KIND_NORMAL*/0);
384
+ assert(qjs.getStringKind("xyzzy".repeat(512).slice(1)),
385
+ /*JS_STRING_KIND_SLICE*/1);
386
+ }
387
+
388
+ function rope_concat(n, dir)
389
+ {
390
+ var i, s;
391
+ s = "";
392
+ if (dir > 0) {
393
+ for(i = 0; i < n; i++)
394
+ s += String.fromCharCode(i & 0xffff);
395
+ } else {
396
+ for(i = n - 1; i >= 0; i--)
397
+ s = String.fromCharCode(i & 0xffff) + s;
398
+ }
399
+
400
+ for(i = 0; i < n; i++) {
401
+ /* test before the assert to go faster */
402
+ if (s.charCodeAt(i) != (i & 0xffff)) {
403
+ assert(s.charCodeAt(i), i & 0xffff);
404
+ }
405
+ }
406
+ }
407
+
408
+ function test_rope()
409
+ {
410
+ var i, s, s2;
411
+
412
+ /* test forward and backward concatenation */
413
+ rope_concat(100000, 1);
414
+ rope_concat(100000, -1);
415
+
416
+ /* test rope comparison */
417
+ s = "";
418
+ s2 = "";
419
+ for (i = 0; i < 10000; i++) {
420
+ s += "abc";
421
+ s2 += "abc";
422
+ }
423
+ assert(s === s2, true);
424
+ assert(s < s2, false);
425
+ assert(s > s2, false);
426
+
427
+ /* test rope indexing */
428
+ s = "";
429
+ for (i = 0; i < 10000; i++)
430
+ s += "x";
431
+ assert(s.length, 10000);
432
+ assert(s[0], "x");
433
+ assert(s[5000], "x");
434
+ assert(s[9999], "x");
435
+
436
+ /* test rope with string methods */
437
+ s = "";
438
+ for (i = 0; i < 1000; i++)
439
+ s += "test";
440
+ assert(s.indexOf("test"), 0);
441
+ assert(s.lastIndexOf("test"), 3996);
442
+ assert(s.includes("test"), true);
443
+ assert(s.slice(0, 8), "testtest");
444
+ assert(s.substring(0, 8), "testtest");
445
+ }
446
+
447
+ function test_math()
448
+ {
449
+ var a;
450
+ a = 1.4;
451
+ assert(Math.floor(a), 1);
452
+ assert(Math.ceil(a), 2);
453
+ assert(Math.imul(0x12345678, 123), -1088058456);
454
+ assert(Math.imul(0xB505, 0xB504), 2147441940);
455
+ assert(Math.imul(0xB505, 0xB505), -2147479015);
456
+ assert(Math.imul((-2)**31, (-2)**31), 0);
457
+ assert(Math.imul(2**31-1, 2**31-1), 1);
458
+ assert(Math.fround(0.1), 0.10000000149011612);
459
+ assert(Math.hypot(), 0);
460
+ assert(Math.hypot(-2), 2);
461
+ assert(Math.hypot(3, 4), 5);
462
+ assert(Math.abs(Math.hypot(3, 4, 5) - 7.0710678118654755) <= 1e-15);
463
+ assert(Math.sumPrecise([1,Number.EPSILON/2,Number.MIN_VALUE]), 1.0000000000000002);
464
+ }
465
+
466
+ function test_number()
467
+ {
468
+ assert(parseInt("123"), 123);
469
+ assert(parseInt(" 123r"), 123);
470
+ assert(parseInt("0x123"), 0x123);
471
+ assert(parseInt("0o123"), 0);
472
+ assert(+" 123 ", 123);
473
+ assert(+"0b111", 7);
474
+ assert(+"0o123", 83);
475
+ assert(parseFloat("2147483647"), 2147483647);
476
+ assert(parseFloat("2147483648"), 2147483648);
477
+ assert(parseFloat("-2147483647"), -2147483647);
478
+ assert(parseFloat("-2147483648"), -2147483648);
479
+ assert(parseFloat("0x1234"), 0);
480
+ assert(parseFloat("Infinity"), Infinity);
481
+ assert(parseFloat("-Infinity"), -Infinity);
482
+ assert(parseFloat("123.2"), 123.2);
483
+ assert(parseFloat("123.2e3"), 123200);
484
+ assert(Number.isNaN(Number("+")));
485
+ assert(Number.isNaN(Number("-")));
486
+ assert(Number.isNaN(Number("\x00a")));
487
+
488
+ assert((1-2**-53).toString(12), "0.bbbbbbbbbbbbbba");
489
+ assert((1000000000000000128).toString(), "1000000000000000100");
490
+ assert((1000000000000000128).toFixed(0), "1000000000000000128");
491
+ assert((25).toExponential(0), "3e+1");
492
+ assert((-25).toExponential(0), "-3e+1");
493
+ assert((2.5).toPrecision(1), "3");
494
+ assert((-2.5).toPrecision(1), "-3");
495
+ assert((25).toPrecision(1) === "3e+1");
496
+ assert((1.125).toFixed(2), "1.13");
497
+ assert((-1.125).toFixed(2), "-1.13");
498
+ assert((0.5).toFixed(0), "1");
499
+ assert((-0.5).toFixed(0), "-1");
500
+ assert((-1e-10).toFixed(0), "-0");
501
+
502
+ assert((1.3).toString(7), "1.2046204620462046205");
503
+ assert((1.3).toString(35), "1.ahhhhhhhhhm");
504
+
505
+ assert((123.456).toExponential(100),
506
+ "1.2345600000000000306954461848363280296325683593750000000000000000000000000000000000000000000000000000e+2");
507
+ assert((1.23e-99).toExponential(100),
508
+ "1.2299999999999999636794326616259654935901564299639709630577493044757187515388707554223010856511630028e-99");
509
+ assert((-0.0007).toExponential(100),
510
+ "-6.9999999999999999288763374849509091291110962629318237304687500000000000000000000000000000000000000000e-4");
511
+ assert((0).toExponential(100),
512
+ "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e+0");
513
+ }
514
+
515
+ function test_eval2()
516
+ {
517
+ var g_call_count = 0;
518
+ /* force non strict mode for f1 and f2 */
519
+ var f1 = new Function("eval", "eval(1, 2)");
520
+ var f2 = new Function("eval", "eval(...[1, 2])");
521
+ function g(a, b) {
522
+ assert(a, 1);
523
+ assert(b, 2);
524
+ g_call_count++;
525
+ }
526
+ f1(g);
527
+ f2(g);
528
+ assert(g_call_count, 2);
529
+ var e;
530
+ try {
531
+ new class extends Object {
532
+ constructor() {
533
+ (() => {
534
+ for (const _ in this);
535
+ eval("");
536
+ })();
537
+ }
538
+ };
539
+ } catch (_e) {
540
+ e = _e;
541
+ }
542
+ assert(e?.message, "this is not initialized");
543
+ }
544
+
545
+ function test_eval()
546
+ {
547
+ function f(b) {
548
+ var x = 1;
549
+ return eval(b);
550
+ }
551
+ var r, a;
552
+
553
+ r = eval("1+1;");
554
+ assert(r, 2, "eval");
555
+
556
+ r = eval("var my_var=2; my_var;");
557
+ assert(r, 2, "eval");
558
+ assert(typeof my_var, "undefined");
559
+
560
+ assert(eval("if (1) 2; else 3;"), 2);
561
+ assert(eval("if (0) 2; else 3;"), 3);
562
+
563
+ assert(f.call(1, "this"), 1);
564
+
565
+ a = 2;
566
+ assert(eval("a"), 2);
567
+
568
+ eval("a = 3");
569
+ assert(a, 3);
570
+
571
+ assert(f("arguments.length", 1), 2);
572
+ assert(f("arguments[1]", 1), 1);
573
+
574
+ a = 4;
575
+ assert(f("a"), 4);
576
+ f("a=3");
577
+ assert(a, 3);
578
+
579
+ test_eval2();
580
+ }
581
+
582
+ function test_typed_array()
583
+ {
584
+ var buffer, a, i, str, b;
585
+
586
+ a = new Uint8Array(4);
587
+ assert(a.length, 4);
588
+ for(i = 0; i < a.length; i++)
589
+ a[i] = i;
590
+ assert(a.join(","), "0,1,2,3");
591
+ a[0] = -1;
592
+ assert(a[0], 255);
593
+
594
+ a = new Int8Array(3);
595
+ a[0] = 255;
596
+ assert(a[0], -1);
597
+
598
+ a = new Int32Array(3);
599
+ a[0] = Math.pow(2, 32) - 1;
600
+ assert(a[0], -1);
601
+ assert(a.BYTES_PER_ELEMENT, 4);
602
+
603
+ a = new Uint8ClampedArray(4);
604
+ a[0] = -100;
605
+ a[1] = 1.5;
606
+ a[2] = 0.5;
607
+ a[3] = 1233.5;
608
+ assert(a.toString(), "0,2,0,255");
609
+
610
+ buffer = new ArrayBuffer(16);
611
+ assert(buffer.byteLength, 16);
612
+ a = new Uint32Array(buffer, 12, 1);
613
+ assert(a.length, 1);
614
+ a[0] = -1;
615
+
616
+ a = new Uint16Array(buffer, 2);
617
+ a[0] = -1;
618
+
619
+ a = new Float16Array(buffer, 8, 1);
620
+ a[0] = 1;
621
+
622
+ a = new Float32Array(buffer, 8, 1);
623
+ a[0] = 1;
624
+
625
+ a = new Uint8Array(buffer);
626
+
627
+ str = a.toString();
628
+ /* test little and big endian cases */
629
+ if (str !== "0,0,255,255,0,0,0,0,0,0,128,63,255,255,255,255" &&
630
+ str !== "0,0,255,255,0,0,0,0,63,128,0,0,255,255,255,255") {
631
+ assert(false);
632
+ }
633
+
634
+ assert(a.buffer, buffer);
635
+
636
+ a = new Uint8Array([1, 2, 3, 4]);
637
+ assert(a.toString(), "1,2,3,4");
638
+ a.set([10, 11], 2);
639
+ assert(a.toString(), "1,2,10,11");
640
+
641
+ a = new Uint8Array(buffer, 0, 4);
642
+ a.constructor = {
643
+ [Symbol.species]: function (len) {
644
+ return new Uint8Array(buffer, 1, len);
645
+ },
646
+ };
647
+ b = a.slice();
648
+ assert(a.buffer, b.buffer);
649
+ assert(a.toString(), "0,0,0,255");
650
+ assert(b.toString(), "0,0,255,255");
651
+
652
+ const TypedArray = class extends Object.getPrototypeOf(Uint8Array) {};
653
+ let caught = false;
654
+ try {
655
+ new TypedArray(); // extensible but not instantiable
656
+ } catch (e) {
657
+ assert(e instanceof TypeError);
658
+ assert(/cannot be called/.test(e.message));
659
+ caught = true;
660
+ }
661
+ assert(caught);
662
+
663
+ // https://github.com/quickjs-ng/quickjs/issues/1208
664
+ buffer = new ArrayBuffer(16);
665
+ a = new Uint8Array(buffer);
666
+ a.fill(42);
667
+ assert(a[0], 42);
668
+ buffer.transfer();
669
+ assert(a[0], undefined);
670
+
671
+ // https://github.com/quickjs-ng/quickjs/issues/1210
672
+ var buffer = new ArrayBuffer(16, {maxByteLength: 16});
673
+ var desc = Object.getOwnPropertyDescriptor(ArrayBuffer, Symbol.species);
674
+ assert(typeof desc.get, "function");
675
+ var get = function() {
676
+ buffer.resize(1);
677
+ return ArrayBuffer;
678
+ };
679
+ Object.defineProperty(ArrayBuffer, Symbol.species, {...desc, get});
680
+ let ex;
681
+ try {
682
+ buffer.slice();
683
+ } catch (ex_) {
684
+ ex = ex_;
685
+ }
686
+ Object.defineProperty(ArrayBuffer, Symbol.species, desc); // restore
687
+ assert(ex instanceof TypeError);
688
+ assert("ArrayBuffer is detached", ex.message);
689
+
690
+ var buffer = new ArrayBuffer(2);
691
+ var ta = new Uint16Array(buffer);
692
+ var desc = Object.getOwnPropertyDescriptor(ta, "0");
693
+ ta[0] = 42;
694
+ assert(ta[0], 42);
695
+ Object.defineProperty(ta, "0", {value: 1337});
696
+ assert(ta[0], 1337);
697
+ assert(desc.writable, true);
698
+ assert(desc.enumerable, true);
699
+ assert(desc.configurable, true);
700
+
701
+ var buffer = new ArrayBuffer(2).sliceToImmutable();
702
+ var ta = new Uint16Array(buffer);
703
+ var desc = Object.getOwnPropertyDescriptor(ta, "0");
704
+ ta[0] = 42;
705
+ assert(ta[0], 0);
706
+ Object.defineProperty(ta, "0", {value: 1337});
707
+ assert(ta[0], 0);
708
+ assert(desc.writable, false);
709
+ assert(desc.enumerable, true);
710
+ assert(desc.configurable, false);
711
+ }
712
+
713
+ function test_json()
714
+ {
715
+ var a, s;
716
+ s = '{"x":1,"y":true,"z":null,"a":[1,2,3],"s":"str"}';
717
+ a = JSON.parse(s);
718
+ assert(a.x, 1);
719
+ assert(a.y, true);
720
+ assert(a.z, null);
721
+ assert(JSON.stringify(a), s);
722
+
723
+ /* indentation test */
724
+ assert(JSON.stringify([[{x:1,y:{},z:[]},2,3]],undefined,1),
725
+ `[
726
+ [
727
+ {
728
+ "x": 1,
729
+ "y": {},
730
+ "z": []
731
+ },
732
+ 2,
733
+ 3
734
+ ]
735
+ ]`);
736
+ }
737
+
738
+ function test_date()
739
+ {
740
+ // Date Time String format is YYYY-MM-DDTHH:mm:ss.sssZ
741
+ // accepted date formats are: YYYY, YYYY-MM and YYYY-MM-DD
742
+ // accepted time formats are: THH:mm, THH:mm:ss, THH:mm:ss.sss
743
+ // expanded years are represented with 6 digits prefixed by + or -
744
+ // -000000 is invalid.
745
+ // A string containing out-of-bounds or nonconforming elements
746
+ // is not a valid instance of this format.
747
+ // Hence the fractional part after . should have 3 digits and how
748
+ // a different number of digits is handled is implementation defined.
749
+ assert(Date.parse(""), NaN);
750
+ assert(Date.parse("13"), NaN);
751
+ assert(Date.parse("31"), NaN);
752
+ assert(Date.parse("1000"), -30610224000000);
753
+ assert(Date.parse("1969"), -31536000000);
754
+ assert(Date.parse("1970"), 0);
755
+ assert(Date.parse("2000"), 946684800000);
756
+ assert(Date.parse("9999"), 253370764800000);
757
+ assert(Date.parse("275761"), NaN);
758
+ assert(Date.parse("999999"), NaN);
759
+ assert(Date.parse("1000000000"), NaN);
760
+ assert(Date.parse("-271821"), NaN);
761
+ assert(Date.parse("-271820"), -8639977881600000);
762
+ assert(Date.parse("-100000"), -3217862419200000);
763
+ assert(Date.parse("+100000"), 3093527980800000);
764
+ assert(Date.parse("+275760"), 8639977881600000);
765
+ assert(Date.parse("+275761"), NaN);
766
+ assert(Date.parse("2000-01"), 946684800000);
767
+ assert(Date.parse("2000-01-01"), 946684800000);
768
+ assert(Date.parse("2000-01-01T"), NaN);
769
+ assert(Date.parse("2000-01-01T00Z"), NaN);
770
+ assert(Date.parse("2000-01-01T00:00Z"), 946684800000);
771
+ assert(Date.parse("2000-01-01T00:00:00Z"), 946684800000);
772
+ assert(Date.parse("2000-01-01T00:00:00.1Z"), 946684800100);
773
+ assert(Date.parse("2000-01-01T00:00:00.10Z"), 946684800100);
774
+ assert(Date.parse("2000-01-01T00:00:00.100Z"), 946684800100);
775
+ assert(Date.parse("2000-01-01T00:00:00.1000Z"), 946684800100);
776
+ assert(Date.parse("2000-01-01T00:00:00+00:00"), 946684800000);
777
+ //assert(Date.parse("2000-01-01T00:00:00+00:30"), 946686600000);
778
+ var d = new Date("2000T00:00"); // Jan 1st 2000, 0:00:00 local time
779
+ assert(typeof d === 'object' && d.toString() != 'Invalid Date');
780
+ assert((new Date('Jan 1 2000')).toISOString(),
781
+ d.toISOString());
782
+ assert((new Date('Jan 1 2000 00:00')).toISOString(),
783
+ d.toISOString());
784
+ assert((new Date('Jan 1 2000 00:00:00')).toISOString(),
785
+ d.toISOString());
786
+ assert((new Date('Jan 1 2000 00:00:00 GMT+0100')).toISOString(),
787
+ '1999-12-31T23:00:00.000Z');
788
+ assert((new Date('Jan 1 2000 00:00:00 GMT+0200')).toISOString(),
789
+ '1999-12-31T22:00:00.000Z');
790
+ assert((new Date('Sat Jan 1 2000')).toISOString(),
791
+ d.toISOString());
792
+ assert((new Date('Sat Jan 1 2000 00:00')).toISOString(),
793
+ d.toISOString());
794
+ assert((new Date('Sat Jan 1 2000 00:00:00')).toISOString(),
795
+ d.toISOString());
796
+ assert((new Date('Sat Jan 1 2000 00:00:00 GMT+0100')).toISOString(),
797
+ '1999-12-31T23:00:00.000Z');
798
+ assert((new Date('Sat Jan 1 2000 00:00:00 GMT+0200')).toISOString(),
799
+ '1999-12-31T22:00:00.000Z');
800
+
801
+ var d = new Date(1506098258091);
802
+ assert(d.toISOString(), "2017-09-22T16:37:38.091Z");
803
+ d.setUTCHours(18, 10, 11);
804
+ assert(d.toISOString(), "2017-09-22T18:10:11.091Z");
805
+ var a = Date.parse(d.toISOString());
806
+ assert((new Date(a)).toISOString(), d.toISOString());
807
+
808
+ assert((new Date("2020-01-01T01:01:01.123Z")).toISOString(),
809
+ "2020-01-01T01:01:01.123Z");
810
+ /* implementation defined behavior */
811
+ assert((new Date("2020-01-01T01:01:01.1Z")).toISOString(),
812
+ "2020-01-01T01:01:01.100Z");
813
+ assert((new Date("2020-01-01T01:01:01.12Z")).toISOString(),
814
+ "2020-01-01T01:01:01.120Z");
815
+ assert((new Date("2020-01-01T01:01:01.1234Z")).toISOString(),
816
+ "2020-01-01T01:01:01.123Z");
817
+ assert((new Date("2020-01-01T01:01:01.12345Z")).toISOString(),
818
+ "2020-01-01T01:01:01.123Z");
819
+ assert((new Date("2020-01-01T01:01:01.1235Z")).toISOString(),
820
+ "2020-01-01T01:01:01.123Z");
821
+ assert((new Date("2020-01-01T01:01:01.9999Z")).toISOString(),
822
+ "2020-01-01T01:01:01.999Z");
823
+
824
+ assert(Date.UTC(2017), 1483228800000);
825
+ assert(Date.UTC(2017, 9), 1506816000000);
826
+ assert(Date.UTC(2017, 9, 22), 1508630400000);
827
+ assert(Date.UTC(2017, 9, 22, 18), 1508695200000);
828
+ assert(Date.UTC(2017, 9, 22, 18, 10), 1508695800000);
829
+ assert(Date.UTC(2017, 9, 22, 18, 10, 11), 1508695811000);
830
+ assert(Date.UTC(2017, 9, 22, 18, 10, 11, 91), 1508695811091);
831
+
832
+ assert(Date.UTC(NaN), NaN);
833
+ assert(Date.UTC(2017, NaN), NaN);
834
+ assert(Date.UTC(2017, 9, NaN), NaN);
835
+ assert(Date.UTC(2017, 9, 22, NaN), NaN);
836
+ assert(Date.UTC(2017, 9, 22, 18, NaN), NaN);
837
+ assert(Date.UTC(2017, 9, 22, 18, 10, NaN), NaN);
838
+ assert(Date.UTC(2017, 9, 22, 18, 10, 11, NaN), NaN);
839
+ assert(Date.UTC(2017, 9, 22, 18, 10, 11, 91, NaN), 1508695811091);
840
+
841
+ // TODO: Fix rounding errors on Windows/Cygwin.
842
+ if (!['win32', 'cygwin'].includes(os.platform)) {
843
+ // from test262/test/built-ins/Date/UTC/fp-evaluation-order.js
844
+ assert(Date.UTC(1970, 0, 1, 80063993375, 29, 1, -288230376151711740), 29312,
845
+ 'order of operations / precision in MakeTime');
846
+ assert(Date.UTC(1970, 0, 213503982336, 0, 0, 0, -18446744073709552000), 34447360,
847
+ 'precision in MakeDate');
848
+ }
849
+ //assert(Date.UTC(2017 - 1e9, 9 + 12e9), 1506816000000); // node fails this
850
+ assert(Date.UTC(2017, 9, 22 - 1e10, 18 + 24e10), 1508695200000);
851
+ assert(Date.UTC(2017, 9, 22, 18 - 1e10, 10 + 60e10), 1508695800000);
852
+ assert(Date.UTC(2017, 9, 22, 18, 10 - 1e10, 11 + 60e10), 1508695811000);
853
+ assert(Date.UTC(2017, 9, 22, 18, 10, 11 - 1e12, 91 + 1000e12), 1508695811091);
854
+ assert(new Date("2024 Apr 7 1:00 AM").toLocaleString(), "04/07/2024, 01:00:00 AM");
855
+ assert(new Date("2024 Apr 7 2:00 AM").toLocaleString(), "04/07/2024, 02:00:00 AM");
856
+ assert(new Date("2024 Apr 7 11:00 AM").toLocaleString(), "04/07/2024, 11:00:00 AM");
857
+ assert(new Date("2024 Apr 7 12:00 AM").toLocaleString(), "04/07/2024, 12:00:00 AM");
858
+ assert(new Date("2024 Apr 7 1:00 PM").toLocaleString(), "04/07/2024, 01:00:00 PM");
859
+ assert(new Date("2024 Apr 7 2:00 PM").toLocaleString(), "04/07/2024, 02:00:00 PM");
860
+ assert(new Date("2024 Apr 7 11:00 PM").toLocaleString(), "04/07/2024, 11:00:00 PM");
861
+ assert(new Date("2024 Apr 7 12:00 PM").toLocaleString(), "04/07/2024, 12:00:00 PM");
862
+ }
863
+
864
+ function test_regexp()
865
+ {
866
+ var a, str;
867
+ str = "abbbbbc";
868
+ a = /(b+)c/.exec(str);
869
+ assert(a[0], "bbbbbc");
870
+ assert(a[1], "bbbbb");
871
+ assert(a.index, 1);
872
+ assert(a.input, str);
873
+ a = /(b+)c/.test(str);
874
+ assert(a, true);
875
+ assert(/\x61/.exec("a")[0], "a");
876
+ assert(/\u0061/.exec("a")[0], "a");
877
+ assert(/\ca/.exec("\x01")[0], "\x01");
878
+ assert(/\\a/.exec("\\a")[0], "\\a");
879
+ assert(/\c0/.exec("\\c0")[0], "\\c0");
880
+
881
+ a = /(\.(?=com|org)|\/)/.exec("ah.com");
882
+ assert(a.index === 2 && a[0] === ".");
883
+
884
+ a = /(\.(?!com|org)|\/)/.exec("ah.com");
885
+ assert(a, null);
886
+
887
+ a = /(?=(a+))/.exec("baaabac");
888
+ assert(a.index === 1 && a[0] === "" && a[1] === "aaa");
889
+
890
+ a = /(z)((a+)?(b+)?(c))*/.exec("zaacbbbcac");
891
+ assert(a, ["zaacbbbcac","z","ac","a",,"c"]);
892
+
893
+ a = eval("/\0a/");
894
+ assert(a.toString(), "/\0a/");
895
+ assert(a.exec("\0a")[0], "\0a");
896
+
897
+ assert(/{1a}/.toString(), "/{1a}/");
898
+ a = /a{1+/.exec("a{11");
899
+ assert(a, ["a{11"] );
900
+
901
+ eval("/[a-]/"); // accepted with no flag
902
+ eval("/[a-]/u"); // accepted with 'u' flag
903
+
904
+ let ex;
905
+ try {
906
+ eval("/[a-]/v"); // rejected with 'v' flag
907
+ } catch (_ex) {
908
+ ex = _ex;
909
+ }
910
+ assert(ex?.message, "invalid class range");
911
+
912
+ eval("/[\\-]/");
913
+ eval("/[\\-]/u");
914
+
915
+ /* test zero length matches */
916
+ a = /()*?a/.exec(",");
917
+ assert(a, null);
918
+ a = /(?:(?=(abc)))a/.exec("abc");
919
+ assert(a, ["a", "abc"]);
920
+ a = /(?:(?=(abc)))?a/.exec("abc");
921
+ assert(a, ["a", undefined]);
922
+ a = /(?:(?=(abc))){0,2}a/.exec("abc");
923
+ assert(a, ["a", undefined]);
924
+ a = /(?:|[\w])+([0-9])/.exec("123a23");
925
+ assert(a, ["123a23", "3"]);
926
+ a = "ab".split(/(c)*/);
927
+ assert(a, ["a", undefined, "b"]);
928
+ }
929
+
930
+ function test_symbol()
931
+ {
932
+ var a, b, obj, c;
933
+ a = Symbol("abc");
934
+ obj = {};
935
+ obj[a] = 2;
936
+ assert(obj[a], 2);
937
+ assert(typeof obj["abc"], "undefined");
938
+ assert(String(a), "Symbol(abc)");
939
+ b = Symbol("abc");
940
+ assert(a == a);
941
+ assert(a === a);
942
+ assert(a != b);
943
+ assert(a !== b);
944
+
945
+ b = Symbol.for("abc");
946
+ c = Symbol.for("abc");
947
+ assert(b === c);
948
+ assert(b !== a);
949
+
950
+ assert(Symbol.keyFor(b), "abc");
951
+ assert(Symbol.keyFor(a), undefined);
952
+
953
+ a = Symbol("aaa");
954
+ assert(a.valueOf(), a);
955
+ assert(a.toString(), "Symbol(aaa)");
956
+
957
+ b = Object(a);
958
+ assert(b.valueOf(), a);
959
+ assert(b.toString(), "Symbol(aaa)");
960
+ }
961
+
962
+ function test_map()
963
+ {
964
+ var a, i, n, tab, o, v;
965
+ n = 1000;
966
+
967
+ a = new Map();
968
+ for (var i = 0; i < n; i++) {
969
+ a.set(i, i);
970
+ }
971
+ a.set(-2147483648, 1);
972
+ assert(a.get(-2147483648), 1);
973
+ assert(a.get(-2147483647 - 1), 1);
974
+ assert(a.get(-2147483647.5 - 0.5), 1);
975
+
976
+ a = new Map();
977
+ tab = [];
978
+ for(i = 0; i < n; i++) {
979
+ v = { };
980
+ o = { id: i };
981
+ tab[i] = [o, v];
982
+ a.set(o, v);
983
+ }
984
+
985
+ assert(a.size, n);
986
+ for(i = 0; i < n; i++) {
987
+ assert(a.get(tab[i][0]), tab[i][1]);
988
+ }
989
+
990
+ i = 0;
991
+ a.forEach(function (v, o) {
992
+ assert(o, tab[i++][0]);
993
+ assert(a.has(o));
994
+ assert(a.delete(o));
995
+ assert(!a.has(o));
996
+ });
997
+
998
+ assert(a.size, 0);
999
+ }
1000
+
1001
+ function test_weak_map()
1002
+ {
1003
+ var a, e, i, n, tab, o, v, n2;
1004
+ a = new WeakMap();
1005
+ n = 10;
1006
+ tab = [];
1007
+ for (const k of [null, 42, "no", Symbol.for("forbidden")]) {
1008
+ e = undefined;
1009
+ try {
1010
+ a.set(k, 42);
1011
+ } catch (_e) {
1012
+ e = _e;
1013
+ }
1014
+ assert(!!e);
1015
+ assert(e.message, "invalid value used as WeakMap key");
1016
+ }
1017
+ for(i = 0; i < n; i++) {
1018
+ v = { };
1019
+ o = { id: i };
1020
+ tab[i] = [o, v];
1021
+ a.set(o, v);
1022
+ }
1023
+ o = null;
1024
+
1025
+ n2 = n >> 1;
1026
+ for(i = 0; i < n2; i++) {
1027
+ a.delete(tab[i][0]);
1028
+ }
1029
+ for(i = n2; i < n; i++) {
1030
+ tab[i][0] = null; /* should remove the object from the WeakMap too */
1031
+ }
1032
+ /* the WeakMap should be empty here */
1033
+ }
1034
+
1035
+ function test_set()
1036
+ {
1037
+ const iter = {
1038
+ a: [4, 5, 6],
1039
+ nextCalls: 0,
1040
+ returnCalls: 0,
1041
+ next() {
1042
+ const done = this.nextCalls >= this.a.length
1043
+ const value = this.a[this.nextCalls]
1044
+ this.nextCalls++
1045
+ return {done, value}
1046
+ },
1047
+ return() {
1048
+ this.returnCalls++
1049
+ return this
1050
+ },
1051
+ }
1052
+ const setlike = {
1053
+ size: iter.a.length,
1054
+ has(v) { return iter.a.includes(v) },
1055
+ keys() { return iter },
1056
+ }
1057
+ // set must be bigger than iter.a to hit iter.next and iter.return
1058
+ assert(new Set([4,5,6,7]).isSupersetOf(setlike), true)
1059
+ assert(iter.nextCalls, 4)
1060
+ assert(iter.returnCalls, 0)
1061
+ iter.nextCalls = iter.returnCalls = 0
1062
+ assert(new Set([0,1,2,3]).isSupersetOf(setlike), false)
1063
+ assert(iter.nextCalls, 1)
1064
+ assert(iter.returnCalls, 1)
1065
+ iter.nextCalls = iter.returnCalls = 0
1066
+ // set must be bigger than iter.a to hit iter.next and iter.return
1067
+ assert(new Set([4,5,6,7]).isDisjointFrom(setlike), false)
1068
+ assert(iter.nextCalls, 1)
1069
+ assert(iter.returnCalls, 1)
1070
+ iter.nextCalls = iter.returnCalls = 0
1071
+ assert(new Set([0,1,2,3]).isDisjointFrom(setlike), true)
1072
+ assert(iter.nextCalls, 4)
1073
+ assert(iter.returnCalls, 0)
1074
+ iter.nextCalls = iter.returnCalls = 0
1075
+ function expectException(klass, sizes) {
1076
+ for (const size of sizes) {
1077
+ let ex
1078
+ try {
1079
+ new Set([]).union({size})
1080
+ } catch (e) {
1081
+ ex = e
1082
+ }
1083
+ assert(ex instanceof klass)
1084
+ assert(typeof ex.message, "string")
1085
+ assert(ex.message.includes(".size"))
1086
+ }
1087
+ }
1088
+ expectException(RangeError, [-1, -(Number.MAX_SAFE_INTEGER+1), -Infinity])
1089
+ expectException(TypeError, [NaN])
1090
+ const legal = [
1091
+ 0, -0, 1, 2,
1092
+ Number.MAX_SAFE_INTEGER + 1,
1093
+ Number.MAX_SAFE_INTEGER + 2,
1094
+ Number.MAX_SAFE_INTEGER + 3,
1095
+ Infinity
1096
+ ]
1097
+ for (const size of legal) {
1098
+ new Set([]).union({
1099
+ size,
1100
+ has() { return false },
1101
+ keys() { return [].values() },
1102
+ })
1103
+ }
1104
+ }
1105
+
1106
+ function test_weak_set()
1107
+ {
1108
+ var a, e;
1109
+ a = new WeakSet();
1110
+ for (const k of [null, 42, "no", Symbol.for("forbidden")]) {
1111
+ e = undefined;
1112
+ try {
1113
+ a.add(k);
1114
+ } catch (_e) {
1115
+ e = _e;
1116
+ }
1117
+ assert(!!e);
1118
+ assert(e.message, "invalid value used as WeakSet key");
1119
+ }
1120
+ }
1121
+
1122
+ function test_generator()
1123
+ {
1124
+ function *f() {
1125
+ var ret;
1126
+ yield 1;
1127
+ ret = yield 2;
1128
+ assert(ret, "next_arg");
1129
+ return 3;
1130
+ }
1131
+ function *f2() {
1132
+ yield 1;
1133
+ yield 2;
1134
+ return "ret_val";
1135
+ }
1136
+ function *f1() {
1137
+ var ret = yield *f2();
1138
+ assert(ret, "ret_val");
1139
+ return 3;
1140
+ }
1141
+ function *f3() {
1142
+ var ret;
1143
+ /* test stack consistency with nip_n to handle yield return +
1144
+ * finally clause */
1145
+ try {
1146
+ ret = 2 + (yield 1);
1147
+ } catch(e) {
1148
+ } finally {
1149
+ ret++;
1150
+ }
1151
+ return ret;
1152
+ }
1153
+ var g, v;
1154
+ g = f();
1155
+ v = g.next();
1156
+ assert(v.value === 1 && v.done === false);
1157
+ v = g.next();
1158
+ assert(v.value === 2 && v.done === false);
1159
+ v = g.next("next_arg");
1160
+ assert(v.value === 3 && v.done === true);
1161
+ v = g.next();
1162
+ assert(v.value === undefined && v.done === true);
1163
+
1164
+ g = f1();
1165
+ v = g.next();
1166
+ assert(v.value === 1 && v.done === false);
1167
+ v = g.next();
1168
+ assert(v.value === 2 && v.done === false);
1169
+ v = g.next();
1170
+ assert(v.value === 3 && v.done === true);
1171
+ v = g.next();
1172
+ assert(v.value === undefined && v.done === true);
1173
+
1174
+ g = f3();
1175
+ v = g.next();
1176
+ assert(v.value === 1 && v.done === false);
1177
+ v = g.next(3);
1178
+ assert(v.value === 6 && v.done === true);
1179
+ }
1180
+
1181
+ function test_proxy_iter()
1182
+ {
1183
+ const p = new Proxy({}, {
1184
+ getOwnPropertyDescriptor() {
1185
+ return {configurable: true, enumerable: true, value: 42};
1186
+ },
1187
+ ownKeys() {
1188
+ return ["x", "y"];
1189
+ },
1190
+ });
1191
+ const a = [];
1192
+ for (const x in p) a.push(x);
1193
+ assert(a[0], "x");
1194
+ assert(a[1], "y");
1195
+ }
1196
+
1197
+ /* CVE-2023-31922 */
1198
+ function test_proxy_is_array()
1199
+ {
1200
+ for (var r = new Proxy([], {}), y = 0; y < 331072; y++)
1201
+ r = new Proxy(r, {});
1202
+
1203
+ try {
1204
+ /* Without ASAN */
1205
+ assert(Array.isArray(r));
1206
+ } catch(e) {
1207
+ /* With ASAN expect RangeError "Maximum call stack size exceeded" to be raised */
1208
+ if (e instanceof RangeError) {
1209
+ assert(e.message, "Maximum call stack size exceeded", "Stack overflow error was not raised")
1210
+ } else {
1211
+ throw e;
1212
+ }
1213
+ }
1214
+ }
1215
+
1216
+ function test_finalization_registry()
1217
+ {
1218
+ {
1219
+ let expected = {};
1220
+ let actual;
1221
+ let finrec = new FinalizationRegistry(v => { actual = v });
1222
+ finrec.register({}, expected);
1223
+ queueMicrotask(() => {
1224
+ assert(actual, expected);
1225
+ });
1226
+ }
1227
+ {
1228
+ let expected = 42;
1229
+ let actual;
1230
+ let finrec = new FinalizationRegistry(v => { actual = v });
1231
+ finrec.register({}, expected);
1232
+ queueMicrotask(() => {
1233
+ assert(actual, expected);
1234
+ });
1235
+ }
1236
+ }
1237
+
1238
+ function test_cur_pc()
1239
+ {
1240
+ var a = [];
1241
+ Object.defineProperty(a, '1', {
1242
+ get: function() { throw Error("a[1]_get"); },
1243
+ set: function(x) { throw Error("a[1]_set"); }
1244
+ });
1245
+ assertThrows(Error, function() { return a[1]; });
1246
+ assertThrows(Error, function() { a[1] = 1; });
1247
+ assertThrows(Error, function() { return [...a]; });
1248
+ assertThrows(Error, function() { return ({...b} = a); });
1249
+
1250
+ var o = {};
1251
+ Object.defineProperty(o, 'x', {
1252
+ get: function() { throw Error("o.x_get"); },
1253
+ set: function(x) { throw Error("o.x_set"); }
1254
+ });
1255
+ o.valueOf = function() { throw Error("o.valueOf"); };
1256
+ assertThrows(Error, function() { return +o; });
1257
+ assertThrows(Error, function() { return -o; });
1258
+ assertThrows(Error, function() { return o+1; });
1259
+ assertThrows(Error, function() { return o-1; });
1260
+ assertThrows(Error, function() { return o*1; });
1261
+ assertThrows(Error, function() { return o/1; });
1262
+ assertThrows(Error, function() { return o%1; });
1263
+ assertThrows(Error, function() { return o**1; });
1264
+ assertThrows(Error, function() { return o<<1; });
1265
+ assertThrows(Error, function() { return o>>1; });
1266
+ assertThrows(Error, function() { return o>>>1; });
1267
+ assertThrows(Error, function() { return o&1; });
1268
+ assertThrows(Error, function() { return o|1; });
1269
+ assertThrows(Error, function() { return o^1; });
1270
+ assertThrows(Error, function() { return o<1; });
1271
+ assertThrows(Error, function() { return o==1; });
1272
+ assertThrows(Error, function() { return o++; });
1273
+ assertThrows(Error, function() { return o--; });
1274
+ assertThrows(Error, function() { return ++o; });
1275
+ assertThrows(Error, function() { return --o; });
1276
+ assertThrows(Error, function() { return ~o; });
1277
+
1278
+ Object.defineProperty(globalThis, 'xxx', {
1279
+ get: function() { throw Error("xxx_get"); },
1280
+ set: function(x) { throw Error("xxx_set"); }
1281
+ });
1282
+ assertThrows(Error, function() { return xxx; });
1283
+ assertThrows(Error, function() { xxx = 1; });
1284
+ }
1285
+
1286
+ test();
1287
+ test_function();
1288
+ test_enum();
1289
+ test_array();
1290
+ test_string();
1291
+ test_rope();
1292
+ test_math();
1293
+ test_number();
1294
+ test_eval();
1295
+ test_typed_array();
1296
+ test_json();
1297
+ test_date();
1298
+ test_regexp();
1299
+ test_symbol();
1300
+ test_map();
1301
+ test_weak_map();
1302
+ test_set();
1303
+ test_weak_set();
1304
+ test_generator();
1305
+ test_proxy_iter();
1306
+ test_proxy_is_array();
1307
+ test_finalization_registry();
1308
+ test_exception_source_pos();
1309
+ test_function_source_pos();
1310
+ test_exception_prepare_stack();
1311
+ test_exception_stack_size_limit();
1312
+ test_exception_capture_stack_trace();
1313
+ test_exception_capture_stack_trace_filter();
1314
+ test_cur_pc();