quickwin 3.0.1 → 3.0.3

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 (163) hide show
  1. package/README.en.md +3 -0
  2. package/README.md +2 -0
  3. package/package.json +2 -3
  4. package/qwin-nowasm-x86.exe +0 -0
  5. package/qwin-nowasm.exe +0 -0
  6. package/qwin-x86.exe +0 -0
  7. package/qwin.exe +0 -0
  8. package/examples/PdfCanvas.js +0 -38
  9. package/examples/PdfCanvas.tsx +0 -54
  10. package/examples/execd/main.js +0 -23379
  11. package/examples/execd/tray.js +0 -192
  12. package/examples/execd/worker.js +0 -122
  13. package/examples/pdf_preview2.js +0 -398
  14. package/examples/pdf_preview2.ts +0 -353
  15. package/examples/pdf_viewer.js +0 -22515
  16. package/examples/pdf_viewer.tsx +0 -228
  17. package/examples/test_gallery.js +0 -18692
  18. package/examples/test_gallery.tsx +0 -291
  19. package/examples/test_react_lazy.js +0 -18560
  20. package/examples/test_react_lazy.tsx +0 -65
  21. package/examples/test_react_listbox.js +0 -18562
  22. package/examples/test_react_listbox.tsx +0 -73
  23. package/examples/test_root_window.js +0 -18532
  24. package/examples/test_root_window.tsx +0 -41
  25. package/examples/test_tab.js +0 -18563
  26. package/examples/test_tab.tsx +0 -77
  27. package/examples/tray_demo.js +0 -86
  28. package/examples/tray_demo.tsx +0 -89
  29. package/test/add.wasm +0 -0
  30. package/test/bench_ffi_callraw.js +0 -235
  31. package/test/bench_ffi_callraw.ts +0 -235
  32. package/test/bench_ffi_overhead.js +0 -139
  33. package/test/bench_ffi_overhead.ts +0 -141
  34. package/test/bench_sendmessage.js +0 -104
  35. package/test/bench_sendmessage.ts +0 -100
  36. package/test/bench_sendmessage_nonnull.js +0 -187
  37. package/test/bench_sendmessage_nonnull.ts +0 -188
  38. package/test/complex.wasm +0 -0
  39. package/test/complex_imports.wasm +0 -0
  40. package/test/debug/http_server_e2e.js +0 -31
  41. package/test/debug/minwasm.js +0 -52
  42. package/test/debug/mupdf_debug.js +0 -86
  43. package/test/debug/wasm.js +0 -122
  44. package/test/debug/wasm_export_debug.js +0 -54
  45. package/test/debug/wasm_names.js +0 -36
  46. package/test/example.pdf +0 -0
  47. package/test/global_imports.wasm +0 -0
  48. package/test/import_func.wasm +0 -0
  49. package/test/imports.wasm +0 -0
  50. package/test/mupdf-cdn.js +0 -40
  51. package/test/mupdf-cdn.ts +0 -43
  52. package/test/run.js +0 -111
  53. package/test/run.ts +0 -116
  54. package/test/sjlj.wasm +0 -0
  55. package/test/test_basic.js +0 -7
  56. package/test/test_basic.ts +0 -9
  57. package/test/test_basic_fetch.js +0 -63
  58. package/test/test_basic_fetch.ts +0 -59
  59. package/test/test_brotli.js +0 -48
  60. package/test/test_brotli.ts +0 -52
  61. package/test/test_fetch_cache.js +0 -169
  62. package/test/test_fetch_cache.ts +0 -187
  63. package/test/test_ffi.js +0 -157
  64. package/test/test_ffi.ts +0 -170
  65. package/test/test_ffi_abi.js +0 -290
  66. package/test/test_ffi_abi.ts +0 -274
  67. package/test/test_ffi_array.js +0 -116
  68. package/test/test_ffi_array.ts +0 -141
  69. package/test/test_ffi_bind.js +0 -656
  70. package/test/test_ffi_bind.ts +0 -670
  71. package/test/test_ffi_struct.js +0 -779
  72. package/test/test_ffi_struct.ts +0 -828
  73. package/test/test_ffi_struct_layout.js +0 -495
  74. package/test/test_ffi_struct_layout.ts +0 -543
  75. package/test/test_ffi_user32.js +0 -103
  76. package/test/test_ffi_user32.ts +0 -113
  77. package/test/test_ffi_windows.js +0 -172
  78. package/test/test_ffi_windows.ts +0 -187
  79. package/test/test_files.js +0 -102
  80. package/test/test_files.ts +0 -121
  81. package/test/test_frame_encoding.js +0 -128
  82. package/test/test_frame_encoding.ts +0 -132
  83. package/test/test_gdi_draw.js +0 -681
  84. package/test/test_gdi_draw.ts +0 -725
  85. package/test/test_helper.js +0 -91
  86. package/test/test_helper.ts +0 -88
  87. package/test/test_http_import.js +0 -96
  88. package/test/test_http_import.ts +0 -93
  89. package/test/test_http_server.js +0 -214
  90. package/test/test_http_server.ts +0 -211
  91. package/test/test_import_dir.js +0 -4
  92. package/test/test_import_dir.ts +0 -5
  93. package/test/test_ipv6.js +0 -134
  94. package/test/test_ipv6.ts +0 -130
  95. package/test/test_jsx.js +0 -1314
  96. package/test/test_meta_url.js +0 -3
  97. package/test/test_meta_url.ts +0 -4
  98. package/test/test_mupdf_render.js +0 -51
  99. package/test/test_mupdf_render.ts +0 -55
  100. package/test/test_mupdf_twice.js +0 -62
  101. package/test/test_mupdf_twice.ts +0 -65
  102. package/test/test_mupdf_wasm.js +0 -39
  103. package/test/test_mupdf_wasm.ts +0 -32
  104. package/test/test_net_event.js +0 -57
  105. package/test/test_net_event.ts +0 -56
  106. package/test/test_net_fetch.js +0 -384
  107. package/test/test_net_fetch.ts +0 -373
  108. package/test/test_net_websocket.js +0 -180
  109. package/test/test_net_websocket.ts +0 -164
  110. package/test/test_polyfill.js +0 -144
  111. package/test/test_polyfill.ts +0 -159
  112. package/test/test_printer.js +0 -137
  113. package/test/test_printer.ts +0 -148
  114. package/test/test_proc.js +0 -141
  115. package/test/test_proc.ts +0 -163
  116. package/test/test_react_complex.js +0 -18678
  117. package/test/test_react_counter.js +0 -18555
  118. package/test/test_react_flex.js +0 -18871
  119. package/test/test_react_hidden.js +0 -18560
  120. package/test/test_react_listview_link.js +0 -18590
  121. package/test/test_react_notify.js +0 -18797
  122. package/test/test_react_render.js +0 -18550
  123. package/test/test_registry.js +0 -74
  124. package/test/test_registry.ts +0 -95
  125. package/test/test_sysinfo.js +0 -122
  126. package/test/test_sysinfo.ts +0 -141
  127. package/test/test_url.js +0 -173
  128. package/test/test_url.ts +0 -183
  129. package/test/test_wasm_basic.js +0 -85
  130. package/test/test_wasm_basic.ts +0 -73
  131. package/test/test_wasm_import_global.js +0 -41
  132. package/test/test_wasm_import_global.ts +0 -45
  133. package/test/test_wasm_sjlj.js +0 -145
  134. package/test/test_wasm_sjlj.ts +0 -125
  135. package/test/test_wasm_types.js +0 -97
  136. package/test/test_wasm_types.ts +0 -124
  137. package/test/test_wolfssl_read.js +0 -203
  138. package/test/test_wolfssl_read.ts +0 -184
  139. package/test/test_worker.js +0 -21
  140. package/test/test_worker.ts +0 -24
  141. package/test/test_worker_concurrent.js +0 -45
  142. package/test/test_worker_concurrent.ts +0 -56
  143. package/test/test_worker_data_url.js +0 -46
  144. package/test/test_worker_data_url.ts +0 -51
  145. package/test/test_worker_fetch.js +0 -26
  146. package/test/test_worker_fetch.ts +0 -27
  147. package/test/test_worker_net.js +0 -69
  148. package/test/test_worker_net.ts +0 -66
  149. package/test/test_worker_wasm_concurrent.js +0 -44
  150. package/test/test_worker_wasm_concurrent.ts +0 -45
  151. package/test/types.wasm +0 -0
  152. package/test/worker_fetch.js +0 -13
  153. package/test/worker_fetch.ts +0 -13
  154. package/test/worker_helper.js +0 -1
  155. package/test/worker_helper.ts +0 -1
  156. package/test/worker_http.js +0 -18
  157. package/test/worker_http.ts +0 -20
  158. package/test/worker_import_lib.js +0 -12
  159. package/test/worker_import_lib.ts +0 -13
  160. package/test/worker_module.js +0 -16
  161. package/test/worker_module.ts +0 -17
  162. package/test/worker_wasm_concurrent.js +0 -22
  163. package/test/worker_wasm_concurrent.ts +0 -22
@@ -1,122 +0,0 @@
1
- import * as std from 'std';
2
- function readWasmFile(path) {
3
- const fp = std.open(path, 'rb');
4
- if (!fp)
5
- return null;
6
- fp.seek(0, 2);
7
- const size = fp.tell();
8
- fp.seek(0, 0);
9
- const buffer = new ArrayBuffer(size);
10
- fp.read(buffer, 0, size);
11
- fp.close();
12
- return buffer;
13
- }
14
- var ok = 0, fail = 0;
15
- function check(name, expected, actual) {
16
- if (typeof expected === 'number' && typeof actual === 'number') {
17
- if (Math.abs(expected - actual) < 0.0001) {
18
- ok++;
19
- std.printf(' PASS: %s = %s\n', name, String(actual));
20
- }
21
- else {
22
- fail++;
23
- std.printf(' FAIL: %s = %s (expected %s)\n', name, String(actual), String(expected));
24
- }
25
- }
26
- else if (expected === actual) {
27
- ok++;
28
- std.printf(' PASS: %s = %s\n', name, String(actual));
29
- }
30
- else {
31
- fail++;
32
- std.printf(' FAIL: %s = %s (expected %s)\n', name, String(actual), String(expected));
33
- }
34
- }
35
- std.printf('=== validate ===\n');
36
- check('empty buffer', false, WebAssembly.validate(new Uint8Array([]).buffer));
37
- check('invalid bytes', false, WebAssembly.validate(new Uint8Array([1, 2, 3]).buffer));
38
- const wasmBuffer = readWasmFile('./add.wasm');
39
- if (!wasmBuffer) {
40
- std.printf('FAIL: cannot load add.wasm\n');
41
- std.exit(1);
42
- }
43
- check('valid module', true, WebAssembly.validate(wasmBuffer));
44
- std.printf('=== Module ===\n');
45
- var module = null;
46
- try {
47
- module = new WebAssembly.Module(wasmBuffer);
48
- check('Module constructor', true, module instanceof WebAssembly.Module);
49
- }
50
- catch (e) {
51
- std.printf(' FAIL: Module constructor: %s\n', String(e));
52
- fail++;
53
- }
54
- std.printf('=== Module.exports ===\n');
55
- if (module) {
56
- try {
57
- const exps = WebAssembly.Module.exports(module);
58
- check('exports count', 1, exps.length);
59
- check('export name', 'add', exps[0].name);
60
- check('export kind', 'function', exps[0].kind);
61
- }
62
- catch (e) {
63
- std.printf(' FAIL: Module.exports: %s\n', String(e));
64
- fail++;
65
- }
66
- }
67
- std.printf('=== Instance (add.wasm) ===\n');
68
- if (module) {
69
- try {
70
- const instance = new WebAssembly.Instance(module);
71
- const iExp = instance.exports;
72
- check('Instance created', true, instance instanceof WebAssembly.Instance);
73
- check('add(1, 2)', 3, iExp.add(1, 2));
74
- check('add(10, 20)', 30, iExp.add(10, 20));
75
- check('add(-5, 3)', -2, iExp.add(-5, 3));
76
- }
77
- catch (e) {
78
- std.printf(' FAIL: Instance: %s\n', String(e));
79
- fail++;
80
- }
81
- }
82
- std.printf('=== complex.wasm (multi exports) ===\n');
83
- const complexBuffer = readWasmFile('./complex.wasm');
84
- if (complexBuffer) {
85
- try {
86
- const cmod = new WebAssembly.Module(complexBuffer);
87
- const cinst = new WebAssembly.Instance(cmod);
88
- const cExp = cinst.exports;
89
- check('add(3, 4)', 7, cExp.add(3, 4));
90
- check('sub(10, 3)', 7, cExp.sub(10, 3));
91
- check('mul(6, 7)', 42, cExp.mul(6, 7));
92
- check('factorial(0)', 1, cExp.factorial(0));
93
- check('factorial(5)', 120, cExp.factorial(5));
94
- check('factorial(10)', 3628800, cExp.factorial(10));
95
- }
96
- catch (e) {
97
- std.printf(' FAIL: complex.wasm: %s\n', String(e));
98
- fail++;
99
- }
100
- }
101
- std.printf('=== import function support ===\n');
102
- const importFuncBuffer = readWasmFile('./import_func.wasm');
103
- if (importFuncBuffer) {
104
- try {
105
- const ifmod = new WebAssembly.Module(importFuncBuffer);
106
- const importObject = {
107
- env: { imported_add: (a, b) => a + b }
108
- };
109
- const ifinst = new WebAssembly.Instance(ifmod, importObject);
110
- const ifExp = ifinst.exports;
111
- check('add_via_import(3, 4)', 7, ifExp.add_via_import(3, 4));
112
- check('add_via_import(10, 20)', 30, ifExp.add_via_import(10, 20));
113
- check('add_via_import(-5, 3)', -2, ifExp.add_via_import(-5, 3));
114
- }
115
- catch (e) {
116
- std.printf(' FAIL: import_func.wasm: %s\n', String(e));
117
- fail++;
118
- }
119
- }
120
- std.printf('\n%d/%d tests passed\n', ok, ok + fail);
121
- if (fail > 0)
122
- std.exit(1);
@@ -1,54 +0,0 @@
1
- import { fetchMupdfWasm } from '../mupdf-cdn.js';
2
- const buf = await fetchMupdfWasm();
3
- const module = new WebAssembly.Module(buf);
4
- const exports = WebAssembly.Module.exports(module);
5
- const imports = WebAssembly.Module.imports(module);
6
- // List ALL export names
7
- console.log(`=== All exports (${exports.length}) ===`);
8
- for (let i = 0; i < exports.length; i++) {
9
- if (exports[i].name === 'ul' || exports[i].name === 'tl')
10
- console.log(` ${i}: ${exports[i].name} (${exports[i].kind}) *** FOUND ***`);
11
- }
12
- // Check last 20 exports
13
- console.log(`\n=== Last 20 exports ===`);
14
- for (let i = Math.max(0, exports.length - 20); i < exports.length; i++)
15
- console.log(` ${i}: ${exports[i].name} (${exports[i].kind})`);
16
- // Check if ul/tl are import functions
17
- console.log(`\n=== Imports (${imports.length}) ===`);
18
- for (let i = 0; i < imports.length; i++) {
19
- if (imports[i].name === 'ul' || imports[i].name === 'tl')
20
- console.log(` ${i}: ${imports[i].module}.${imports[i].name}`);
21
- }
22
- // Now try to call simple exports and see if exec_env is the issue
23
- console.log(`\n=== Direct instance call test ===`);
24
- const importObj = { a: {} };
25
- for (const imp of imports) {
26
- if (!importObj[imp.module])
27
- importObj[imp.module] = {};
28
- if (imp.kind === 'function') {
29
- importObj[imp.module][imp.name] = () => 0;
30
- }
31
- }
32
- // Test calling db, eb sequentially
33
- const inst = new WebAssembly.Instance(module, importObj);
34
- const exp = inst.exports;
35
- console.log('1. calling db()...');
36
- exp['db']();
37
- console.log('2. calling db() again...');
38
- exp['db']();
39
- console.log('3. calling eb()...');
40
- try {
41
- exp['eb']();
42
- console.log(' eb() succeeded');
43
- }
44
- catch (e) {
45
- console.log(' eb() failed:', e);
46
- }
47
- console.log('4. calling fb(100)...');
48
- try {
49
- const r = exp['fb'](100);
50
- console.log(' fb(100) =', r);
51
- }
52
- catch (e) {
53
- console.log(' fb(100) failed:', e);
54
- }
@@ -1,36 +0,0 @@
1
- import { fetchMupdfWasm } from '../mupdf-cdn.js';
2
- // Fetch the mupdf-wasm binary over HTTPS (process-wide HTTP cache applies)
3
- const buf = await fetchMupdfWasm();
4
- // Check exports for Tf
5
- const module = new WebAssembly.Module(buf);
6
- const exports = WebAssembly.Module.exports(module);
7
- const imports = WebAssembly.Module.imports(module);
8
- // Look for Tf specifically
9
- let foundTf = false;
10
- for (const e of exports) {
11
- if (e.name === 'Tf') {
12
- console.log('FOUND Tf in exports');
13
- foundTf = true;
14
- break;
15
- }
16
- }
17
- if (!foundTf)
18
- console.log('Tf NOT in exports');
19
- // Check a few nearby names used in assignWasmExports
20
- const wanted = ['Tf', 'Uf', 'Vf', 'Wf', 'Xf', 'Yf', 'Sf', 'Rf', 'Qf', 'Pf', 'Of', 'Nf'];
21
- const found = [];
22
- const missing = [];
23
- for (const w of wanted) {
24
- if (exports.some(e => e.name === w))
25
- found.push(w);
26
- else
27
- missing.push(w);
28
- }
29
- console.log('found:', found.join(', '));
30
- console.log('missing:', missing.join(', '));
31
- // Count exports
32
- console.log('total exports:', exports.length);
33
- console.log('total imports:', imports.length);
34
- // List first 30 export names
35
- for (let i = 0; i < 30 && i < exports.length; i++)
36
- console.log(' export', i, '=', exports[i].name);
package/test/example.pdf DELETED
Binary file
Binary file
Binary file
package/test/imports.wasm DELETED
Binary file
package/test/mupdf-cdn.js DELETED
@@ -1,40 +0,0 @@
1
- // ── mupdf-wasm CDN loading ──
2
- //
3
- // The runtime loads mupdf from unpkg; the npm package itself only ships
4
- // types (devDependency @quickwinlabs/mupdf-wasm resolved through the
5
- // package's exports types mapping — no local vendor copy involved).
6
- // MUPDF_VERSION must stay in sync with the devDependency in package.json
7
- // when bumping.
8
- //
9
- // Importing this module wires up the HTTPS stack (certs + fetch): the
10
- // wasm bytes travel through the process-wide HTTP cache next to the
11
- // executable, so the first fetch is the only network hit.
12
- import '../lib/certs.js';
13
- import '../lib/fetch.js';
14
- export const MUPDF_VERSION = '1.28.0';
15
- const BASE = `https://unpkg.com/@quickwinlabs/mupdf-wasm@${MUPDF_VERSION}`;
16
- export const MUPDF_JS_URL = `${BASE}/mupdf.js`;
17
- export const MUPDF_WASM_URL = `${BASE}/mupdf-wasm.wasm`;
18
- /** Fetch the wasm binary over HTTPS (HTTP-cached, no filesystem involved). */
19
- export async function fetchMupdfWasm() {
20
- const resp = await fetch(MUPDF_WASM_URL);
21
- if (resp.status !== 200)
22
- throw new Error(`mupdf wasm fetch failed: HTTP ${resp.status}`);
23
- const wasmBinary = await resp.arrayBuffer();
24
- if (wasmBinary.byteLength < 1_000_000)
25
- throw new Error(`mupdf wasm truncated: ${wasmBinary.byteLength} bytes`);
26
- return wasmBinary;
27
- }
28
- /**
29
- * Fetch the wasm binary and pre-wire it as $libmupdf_wasm_Module so the
30
- * mupdf.js module factory instantiates from memory (same injection the
31
- * local-vendor loading used).
32
- */
33
- export async function preloadMupdfWasm() {
34
- const wasmBinary = await fetchMupdfWasm();
35
- globalThis.$libmupdf_wasm_Module = {
36
- wasmBinary,
37
- locateFile: (p) => p,
38
- };
39
- return wasmBinary;
40
- }
package/test/mupdf-cdn.ts DELETED
@@ -1,43 +0,0 @@
1
- // ── mupdf-wasm CDN loading ──
2
- //
3
- // The runtime loads mupdf from unpkg; the npm package itself only ships
4
- // types (devDependency @quickwinlabs/mupdf-wasm resolved through the
5
- // package's exports types mapping — no local vendor copy involved).
6
- // MUPDF_VERSION must stay in sync with the devDependency in package.json
7
- // when bumping.
8
- //
9
- // Importing this module wires up the HTTPS stack (certs + fetch): the
10
- // wasm bytes travel through the process-wide HTTP cache next to the
11
- // executable, so the first fetch is the only network hit.
12
-
13
- import '../lib/certs.js'
14
- import '../lib/fetch.js'
15
-
16
- export const MUPDF_VERSION = '1.28.0'
17
- const BASE = `https://unpkg.com/@quickwinlabs/mupdf-wasm@${MUPDF_VERSION}`
18
-
19
- export const MUPDF_JS_URL = `${BASE}/mupdf.js`
20
- export const MUPDF_WASM_URL = `${BASE}/mupdf-wasm.wasm`
21
-
22
- /** Fetch the wasm binary over HTTPS (HTTP-cached, no filesystem involved). */
23
- export async function fetchMupdfWasm(): Promise<ArrayBuffer> {
24
- const resp = await fetch(MUPDF_WASM_URL)
25
- if (resp.status !== 200) throw new Error(`mupdf wasm fetch failed: HTTP ${resp.status}`)
26
- const wasmBinary = await resp.arrayBuffer()
27
- if (wasmBinary.byteLength < 1_000_000) throw new Error(`mupdf wasm truncated: ${wasmBinary.byteLength} bytes`)
28
- return wasmBinary
29
- }
30
-
31
- /**
32
- * Fetch the wasm binary and pre-wire it as $libmupdf_wasm_Module so the
33
- * mupdf.js module factory instantiates from memory (same injection the
34
- * local-vendor loading used).
35
- */
36
- export async function preloadMupdfWasm(): Promise<ArrayBuffer> {
37
- const wasmBinary = await fetchMupdfWasm()
38
- ;(globalThis as any).$libmupdf_wasm_Module = {
39
- wasmBinary,
40
- locateFile: (p: string) => p,
41
- }
42
- return wasmBinary
43
- }
package/test/run.js DELETED
@@ -1,111 +0,0 @@
1
- import '../lib/certs.js';
2
- import * as std from 'std';
3
- import { Tester } from './test_helper.js';
4
- function formatDuration(ms) {
5
- if (ms >= 1000)
6
- return (ms / 1000).toFixed(2) + 's';
7
- return ms + 'ms';
8
- }
9
- const BOLD = '\x1b[1m';
10
- const GREEN = '\x1b[32m';
11
- const RED = '\x1b[31m';
12
- const RESET = '\x1b[0m';
13
- const suiteDefs = [
14
- { name: 'basic', file: './test_basic.js', tags: [] },
15
- { name: 'basic-fetch', file: './test_basic_fetch.js', tags: [] },
16
- { name: 'ipv6', file: './test_ipv6.js', tags: ['net'] },
17
- { name: 'url', file: './test_url.js', tags: [] },
18
- { name: 'wasm-basic', file: './test_wasm_basic.js', tags: ['wasm'] },
19
- { name: 'wasm-types', file: './test_wasm_types.js', tags: ['wasm'] },
20
- { name: 'wasm-import-global', file: './test_wasm_import_global.js', tags: ['wasm'] },
21
- { name: 'wasm-sjlj', file: './test_wasm_sjlj.js', tags: ['wasm'] },
22
- { name: 'wasm-frame-encoding', file: './test_frame_encoding.js', tags: ['wasm'] },
23
- { name: 'mupdf-wasm', file: './test_mupdf_wasm.js', tags: ['wasm', 'mupdf'] },
24
- { name: 'mupdf-twice', file: './test_mupdf_twice.js', tags: ['wasm', 'mupdf'] },
25
- { name: 'mupdf-render', file: './test_mupdf_render.js', tags: ['wasm', 'mupdf'] },
26
- { name: 'ffi', file: './test_ffi.js', tags: [] },
27
- { name: 'ffi-bind', file: './test_ffi_bind.js', tags: [] },
28
- { name: 'ffi-struct', file: './test_ffi_struct.js', tags: [] },
29
- { name: 'ffi-struct-layout', file: './test_ffi_struct_layout.js', tags: [] },
30
- { name: 'ffi-array', file: './test_ffi_array.js', tags: [] },
31
- { name: 'ffi-abi', file: './test_ffi_abi.js', tags: [] },
32
- { name: 'ffi-user32', file: './test_ffi_user32.js', tags: [] },
33
- { name: 'ffi-windows', file: './test_ffi_windows.js', tags: [] },
34
- { name: 'gdi-draw', file: './test_gdi_draw.js', tags: [] },
35
- { name: 'registry', file: './test_registry.js', tags: [] },
36
- { name: 'files', file: './test_files.js', tags: [] },
37
- { name: 'printer', file: './test_printer.js', tags: [] },
38
- { name: 'sysinfo', file: './test_sysinfo.js', tags: [] },
39
- { name: 'proc', file: './test_proc.js', tags: [] },
40
- { name: 'net-fetch', file: './test_net_fetch.js', tags: ['net'] },
41
- { name: 'net-wolfssl-read', file: './test_wolfssl_read.js', tags: ['net'] },
42
- { name: 'net-websocket', file: './test_net_websocket.js', tags: ['net'] },
43
- { name: 'net-event', file: './test_net_event.js', tags: ['net'] },
44
- { name: 'http-server', file: './test_http_server.js', tags: ['net'] },
45
- { name: 'http-import', file: './test_http_import.js', tags: ['net'] },
46
- { name: 'fetch-cache', file: './test_fetch_cache.js', tags: ['net'] },
47
- { name: 'polyfill', file: './test_polyfill.js', tags: [] },
48
- { name: 'brotli', file: './test_brotli.js', tags: [] },
49
- { name: 'worker', file: './test_worker.js', tags: [] },
50
- { name: 'worker-wasm', file: './test_worker_wasm_concurrent.js', tags: ['wasm'] },
51
- { name: 'worker-http', file: './test_worker_net.js', tags: ['net'] },
52
- { name: 'worker-fetch', file: './test_worker_fetch.js', tags: ['net'] },
53
- { name: 'worker-concurrent', file: './test_worker_concurrent.js', tags: [] },
54
- { name: 'worker-data-url', file: './test_worker_data_url.js', tags: [] }
55
- ];
56
- async function main() {
57
- const filter = scriptArgs.length > 1 ? scriptArgs[1] : '';
58
- std.printf('%s====== QuickWin Test Runner ======%s\n', BOLD, RESET);
59
- if (filter)
60
- std.printf('Filter: %s\n', filter);
61
- const results = [];
62
- let totalOk = 0, totalFail = 0, totalSkip = 0;
63
- for (const def of suiteDefs) {
64
- if (filter) {
65
- if (filter.startsWith('-')) {
66
- const excludeTag = filter.slice(1);
67
- if (def.tags.indexOf(excludeTag) >= 0)
68
- continue;
69
- }
70
- else {
71
- if (def.name.indexOf(filter) < 0)
72
- continue;
73
- }
74
- }
75
- let mod;
76
- try {
77
- mod = await import(def.file);
78
- }
79
- catch (e) {
80
- continue;
81
- }
82
- if (!mod.suite)
83
- continue;
84
- const t = new Tester();
85
- std.printf('\n%s--- %s ---%s\n', BOLD, def.name, RESET);
86
- const suiteStart = Date.now();
87
- try {
88
- await mod.suite.run(t);
89
- }
90
- catch (e) {
91
- std.printf(' %sSUITE FAILED:%s %s\n', RED, RESET, String(e));
92
- t.fail++;
93
- }
94
- const suiteElapsed = Date.now() - suiteStart;
95
- t.summary();
96
- results.push({ name: def.name, ok: t.ok, fail: t.fail, skip: t.skip, elapsed: suiteElapsed });
97
- totalOk += t.ok;
98
- totalFail += t.fail;
99
- totalSkip += t.skip;
100
- }
101
- const color = totalFail > 0 ? RED : GREEN;
102
- std.printf('\n%s====== Test Results ======%s\n', BOLD, RESET);
103
- for (const r of results) {
104
- const c = r.fail > 0 ? RED : GREEN;
105
- const skipped = r.skip > 0 ? ` (${r.skip} skipped)` : '';
106
- std.printf(' %s%-18s %s%d/%d passed%s %s(%s)%s\n', c, r.name, RESET, r.ok, r.ok + r.fail, skipped, c, formatDuration(r.elapsed), RESET);
107
- }
108
- const skipped = totalSkip > 0 ? ` (${totalSkip} skipped)` : '';
109
- std.printf('%s====== Summary: %d/%d passed%s ======%s\n', color, totalOk, totalOk + totalFail, skipped, RESET);
110
- }
111
- main();
package/test/run.ts DELETED
@@ -1,116 +0,0 @@
1
- import '../lib/certs.js'
2
- import * as std from 'std'
3
- import { Tester } from './test_helper.js'
4
-
5
- declare var scriptArgs: string[]
6
-
7
- function formatDuration(ms: number): string {
8
- if (ms >= 1000) return (ms / 1000).toFixed(2) + 's'
9
- return ms + 'ms'
10
- }
11
-
12
- const BOLD = '\x1b[1m'
13
- const GREEN = '\x1b[32m'
14
- const RED = '\x1b[31m'
15
- const RESET = '\x1b[0m'
16
-
17
- const suiteDefs = [
18
- { name: 'basic', file: './test_basic.js', tags: [] },
19
- { name: 'basic-fetch', file: './test_basic_fetch.js', tags: [] },
20
- { name: 'ipv6', file: './test_ipv6.js', tags: ['net'] },
21
- { name: 'url', file: './test_url.js', tags: [] },
22
- { name: 'wasm-basic', file: './test_wasm_basic.js', tags: ['wasm'] },
23
- { name: 'wasm-types', file: './test_wasm_types.js', tags: ['wasm'] },
24
- { name: 'wasm-import-global', file: './test_wasm_import_global.js', tags: ['wasm'] },
25
- { name: 'wasm-sjlj', file: './test_wasm_sjlj.js', tags: ['wasm'] },
26
- { name: 'wasm-frame-encoding', file: './test_frame_encoding.js', tags: ['wasm'] },
27
- { name: 'mupdf-wasm', file: './test_mupdf_wasm.js', tags: ['wasm', 'mupdf'] },
28
- { name: 'mupdf-twice', file: './test_mupdf_twice.js', tags: ['wasm', 'mupdf'] },
29
- { name: 'mupdf-render', file: './test_mupdf_render.js', tags: ['wasm', 'mupdf'] },
30
- { name: 'ffi', file: './test_ffi.js', tags: [] },
31
- { name: 'ffi-bind', file: './test_ffi_bind.js', tags: [] },
32
- { name: 'ffi-struct', file: './test_ffi_struct.js', tags: [] },
33
- { name: 'ffi-struct-layout', file: './test_ffi_struct_layout.js', tags: [] },
34
- { name: 'ffi-array', file: './test_ffi_array.js', tags: [] },
35
- { name: 'ffi-abi', file: './test_ffi_abi.js', tags: [] },
36
- { name: 'ffi-user32', file: './test_ffi_user32.js', tags: [] },
37
- { name: 'ffi-windows', file: './test_ffi_windows.js', tags: [] },
38
- { name: 'gdi-draw', file: './test_gdi_draw.js', tags: [] },
39
- { name: 'registry', file: './test_registry.js', tags: [] },
40
- { name: 'files', file: './test_files.js', tags: [] },
41
- { name: 'printer', file: './test_printer.js', tags: [] },
42
- { name: 'sysinfo', file: './test_sysinfo.js', tags: [] },
43
- { name: 'proc', file: './test_proc.js', tags: [] },
44
- { name: 'net-fetch', file: './test_net_fetch.js', tags: ['net'] },
45
- { name: 'net-wolfssl-read', file: './test_wolfssl_read.js', tags: ['net'] },
46
- { name: 'net-websocket', file: './test_net_websocket.js', tags: ['net'] },
47
- { name: 'net-event', file: './test_net_event.js', tags: ['net'] },
48
- { name: 'http-server', file: './test_http_server.js', tags: ['net'] },
49
- { name: 'http-import', file: './test_http_import.js', tags: ['net'] },
50
- { name: 'fetch-cache', file: './test_fetch_cache.js', tags: ['net'] },
51
- { name: 'polyfill', file: './test_polyfill.js', tags: [] },
52
- { name: 'brotli', file: './test_brotli.js', tags: [] },
53
- { name: 'worker', file: './test_worker.js', tags: [] },
54
- { name: 'worker-wasm', file: './test_worker_wasm_concurrent.js', tags: ['wasm'] },
55
- { name: 'worker-http', file: './test_worker_net.js', tags: ['net'] },
56
- { name: 'worker-fetch', file: './test_worker_fetch.js', tags: ['net'] },
57
- { name: 'worker-concurrent', file: './test_worker_concurrent.js', tags: [] },
58
- { name: 'worker-data-url', file: './test_worker_data_url.js', tags: [] }
59
- ]
60
-
61
- async function main(): Promise<void> {
62
- const filter = scriptArgs.length > 1 ? scriptArgs[1] : ''
63
-
64
- std.printf('%s====== QuickWin Test Runner ======%s\n', BOLD, RESET)
65
- if (filter) std.printf('Filter: %s\n', filter)
66
-
67
- const results: { name: string, ok: number, fail: number, skip: number, elapsed: number }[] = []
68
- let totalOk = 0, totalFail = 0, totalSkip = 0
69
-
70
- for (const def of suiteDefs) {
71
- if (filter) {
72
- if (filter.startsWith('-')) {
73
- const excludeTag = filter.slice(1)
74
- if (def.tags.indexOf(excludeTag) >= 0) continue
75
- } else {
76
- if (def.name.indexOf(filter) < 0) continue
77
- }
78
- }
79
-
80
- let mod: any
81
- try {
82
- mod = await import(def.file)
83
- } catch (e) {
84
- continue
85
- }
86
- if (!mod.suite) continue
87
-
88
- const t = new Tester()
89
- std.printf('\n%s--- %s ---%s\n', BOLD, def.name, RESET)
90
- const suiteStart = Date.now()
91
- try {
92
- await mod.suite.run(t)
93
- } catch (e) {
94
- std.printf(' %sSUITE FAILED:%s %s\n', RED, RESET, String(e))
95
- t.fail++
96
- }
97
- const suiteElapsed = Date.now() - suiteStart
98
- t.summary()
99
- results.push({ name: def.name, ok: t.ok, fail: t.fail, skip: t.skip, elapsed: suiteElapsed })
100
- totalOk += t.ok
101
- totalFail += t.fail
102
- totalSkip += t.skip
103
- }
104
-
105
- const color = totalFail > 0 ? RED : GREEN
106
- std.printf('\n%s====== Test Results ======%s\n', BOLD, RESET)
107
- for (const r of results) {
108
- const c = r.fail > 0 ? RED : GREEN
109
- const skipped = r.skip > 0 ? ` (${r.skip} skipped)` : ''
110
- std.printf(' %s%-18s %s%d/%d passed%s %s(%s)%s\n', c, r.name, RESET, r.ok, r.ok + r.fail, skipped, c, formatDuration(r.elapsed), RESET)
111
- }
112
- const skipped = totalSkip > 0 ? ` (${totalSkip} skipped)` : ''
113
- std.printf('%s====== Summary: %d/%d passed%s ======%s\n', color, totalOk, totalOk + totalFail, skipped, RESET)
114
- }
115
-
116
- main()
package/test/sjlj.wasm DELETED
Binary file
@@ -1,7 +0,0 @@
1
- export const suite = {
2
- name: 'basic',
3
- run: (t) => {
4
- t.section('smoke');
5
- t.check('hello', true, true);
6
- }
7
- };
@@ -1,9 +0,0 @@
1
- import { Tester } from './test_helper.js'
2
-
3
- export const suite = {
4
- name: 'basic',
5
- run: (t: Tester) => {
6
- t.section('smoke')
7
- t.check('hello', true, true)
8
- }
9
- }
@@ -1,63 +0,0 @@
1
- import * as std from 'std';
2
- import '../lib/fetch.js';
3
- const PORT = 18923;
4
- const URL127 = `http://127.0.0.1:${PORT}/`;
5
- const URLLocalhost = `http://localhost:${PORT}/`;
6
- export const suite = {
7
- name: 'basic-fetch',
8
- run: async (t) => {
9
- function assert(name, ok) {
10
- if (ok) {
11
- t.ok++;
12
- std.printf(' PASS: %s\n', name);
13
- }
14
- else {
15
- t.fail++;
16
- std.printf(' FAIL: %s\n', name);
17
- }
18
- }
19
- t.section('fetch 127.0.0.1');
20
- {
21
- const r = await fetch(URL127);
22
- assert('status 200', r.status === 200);
23
- const body = await r.text();
24
- assert('body = hello from test server', body === 'hello from test server');
25
- }
26
- t.section('fetch localhost');
27
- {
28
- const r = await fetch(URLLocalhost);
29
- assert('status 200', r.status === 200);
30
- const body = await r.text();
31
- assert('body = hello from test server', body === 'hello from test server');
32
- }
33
- t.section('fetch chunked response with Trailer');
34
- {
35
- const r = await fetch(URL127 + 'trailer');
36
- assert('status 200', r.status === 200);
37
- assert('trailer declared', (r.headers.get('trailer') || '').toLowerCase() === 'x-checksum');
38
- const body = await r.text();
39
- assert('body decoded without trailer footer', body === 'chunkA/chunkB');
40
- }
41
- t.section('protocol whitelist (reject non-http(s))');
42
- {
43
- const badUrls = [
44
- 'file:///C:/secret.txt',
45
- 'data:text/plain,hello',
46
- 'javascript:alert(1)',
47
- 'ftp://example.com/resource',
48
- ];
49
- for (const u of badUrls) {
50
- let err = '';
51
- let rejected = false;
52
- try {
53
- await fetch(u);
54
- }
55
- catch (e) {
56
- rejected = true;
57
- err = e.message;
58
- }
59
- assert(`reject ${u} with TypeError`, rejected && err.includes('unsupported protocol'));
60
- }
61
- }
62
- }
63
- };