xbintsc 0.3.18 → 0.3.35

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 (194) hide show
  1. package/README.md +33 -0
  2. package/dist/src/cli/main.js +124 -30
  3. package/dist/src/cli/main.js.map +1 -1
  4. package/dist/src/codegen/generator/calls/access.js +8 -1
  5. package/dist/src/codegen/generator/calls/access.js.map +1 -1
  6. package/dist/src/codegen/generator/state.js +20 -0
  7. package/dist/src/codegen/generator/state.js.map +1 -1
  8. package/dist/src/codegen/generator/tables.d.ts +6 -0
  9. package/dist/src/codegen/generator/tables.js +38 -0
  10. package/dist/src/codegen/generator/tables.js.map +1 -1
  11. package/dist/src/driver/bundler/commonjs.d.ts +52 -0
  12. package/dist/src/driver/bundler/commonjs.js +493 -0
  13. package/dist/src/driver/bundler/commonjs.js.map +1 -0
  14. package/dist/src/driver/bundler/graph.d.ts +2 -1
  15. package/dist/src/driver/bundler/graph.js +32 -3
  16. package/dist/src/driver/bundler/graph.js.map +1 -1
  17. package/dist/src/driver/bundler/merge.d.ts +2 -1
  18. package/dist/src/driver/bundler/merge.js +16 -2
  19. package/dist/src/driver/bundler/merge.js.map +1 -1
  20. package/dist/src/driver/bundler/types.d.ts +8 -0
  21. package/dist/src/driver/compiler.d.ts +8 -1
  22. package/dist/src/driver/compiler.js +75 -7
  23. package/dist/src/driver/compiler.js.map +1 -1
  24. package/dist/src/driver/config.d.ts +53 -0
  25. package/dist/src/driver/config.js +141 -0
  26. package/dist/src/driver/config.js.map +1 -0
  27. package/dist/src/driver/icon.d.ts +62 -0
  28. package/dist/src/driver/icon.js +151 -0
  29. package/dist/src/driver/icon.js.map +1 -0
  30. package/dist/src/driver/index.d.ts +4 -0
  31. package/dist/src/driver/index.js +4 -0
  32. package/dist/src/driver/index.js.map +1 -1
  33. package/dist/src/driver/mac-bundle.d.ts +41 -0
  34. package/dist/src/driver/mac-bundle.js +123 -0
  35. package/dist/src/driver/mac-bundle.js.map +1 -0
  36. package/dist/src/driver/win-icon.d.ts +27 -0
  37. package/dist/src/driver/win-icon.js +80 -0
  38. package/dist/src/driver/win-icon.js.map +1 -0
  39. package/dist/src/extensions/gui/html.d.ts +25 -0
  40. package/dist/src/extensions/gui/html.js +203 -0
  41. package/dist/src/extensions/gui/html.js.map +1 -0
  42. package/dist/src/extensions/gui/index.js +11 -0
  43. package/dist/src/extensions/gui/index.js.map +1 -1
  44. package/dist/src/extensions/registry.d.ts +29 -0
  45. package/dist/src/extensions/registry.js +14 -0
  46. package/dist/src/extensions/registry.js.map +1 -1
  47. package/dist/src/index.d.ts +1 -1
  48. package/dist/src/index.js.map +1 -1
  49. package/dist/src/lexer/scanner/identifiers.js +4 -12
  50. package/dist/src/lexer/scanner/identifiers.js.map +1 -1
  51. package/dist/src/parser/statements.js +17 -4
  52. package/dist/src/parser/statements.js.map +1 -1
  53. package/dist/tests/cli/main.test.js +46 -1
  54. package/dist/tests/cli/main.test.js.map +1 -1
  55. package/dist/tests/driver/bundler-resolve.test.d.ts +1 -0
  56. package/dist/tests/driver/bundler-resolve.test.js +230 -0
  57. package/dist/tests/driver/bundler-resolve.test.js.map +1 -0
  58. package/dist/tests/driver/config.test.d.ts +1 -0
  59. package/dist/tests/driver/config.test.js +124 -0
  60. package/dist/tests/driver/config.test.js.map +1 -0
  61. package/dist/tests/driver/icon.test.d.ts +1 -0
  62. package/dist/tests/driver/icon.test.js +421 -0
  63. package/dist/tests/driver/icon.test.js.map +1 -0
  64. package/dist/tests/driver/modules.test.js +177 -0
  65. package/dist/tests/driver/modules.test.js.map +1 -1
  66. package/dist/tests/e2e/fetch.test.d.ts +12 -0
  67. package/dist/tests/e2e/fetch.test.js +272 -0
  68. package/dist/tests/e2e/fetch.test.js.map +1 -0
  69. package/dist/tests/e2e/gui-dom.test.d.ts +5 -0
  70. package/dist/tests/e2e/gui-dom.test.js +102 -0
  71. package/dist/tests/e2e/gui-dom.test.js.map +1 -0
  72. package/dist/tests/e2e/gui-events.test.d.ts +5 -0
  73. package/dist/tests/e2e/gui-events.test.js +60 -0
  74. package/dist/tests/e2e/gui-events.test.js.map +1 -0
  75. package/dist/tests/e2e/gui-helpers.d.ts +31 -0
  76. package/dist/tests/e2e/gui-helpers.js +74 -0
  77. package/dist/tests/e2e/gui-helpers.js.map +1 -0
  78. package/dist/tests/e2e/gui-layout.test.d.ts +4 -0
  79. package/dist/tests/e2e/gui-layout.test.js +88 -0
  80. package/dist/tests/e2e/gui-layout.test.js.map +1 -0
  81. package/dist/tests/e2e/gui-lifecycle.test.d.ts +5 -0
  82. package/dist/tests/e2e/gui-lifecycle.test.js +58 -0
  83. package/dist/tests/e2e/gui-lifecycle.test.js.map +1 -0
  84. package/dist/tests/e2e/gui-paint.test.d.ts +5 -0
  85. package/dist/tests/e2e/gui-paint.test.js +111 -0
  86. package/dist/tests/e2e/gui-paint.test.js.map +1 -0
  87. package/dist/tests/e2e/gui-script.test.d.ts +5 -0
  88. package/dist/tests/e2e/gui-script.test.js +78 -0
  89. package/dist/tests/e2e/gui-script.test.js.map +1 -0
  90. package/dist/tests/e2e/gui-style.test.d.ts +5 -0
  91. package/dist/tests/e2e/gui-style.test.js +175 -0
  92. package/dist/tests/e2e/gui-style.test.js.map +1 -0
  93. package/dist/tests/e2e/icon.test.d.ts +7 -0
  94. package/dist/tests/e2e/icon.test.js +80 -0
  95. package/dist/tests/e2e/icon.test.js.map +1 -0
  96. package/dist/tests/e2e/npm-modules.test.d.ts +4 -1
  97. package/dist/tests/e2e/npm-modules.test.js +47 -1
  98. package/dist/tests/e2e/npm-modules.test.js.map +1 -1
  99. package/dist/tests/e2e/runtime-coverage-typed-array.test.d.ts +9 -0
  100. package/dist/tests/e2e/runtime-coverage-typed-array.test.js +140 -0
  101. package/dist/tests/e2e/runtime-coverage-typed-array.test.js.map +1 -0
  102. package/dist/tests/extensions/gui-index.test.d.ts +1 -0
  103. package/dist/tests/extensions/gui-index.test.js +49 -0
  104. package/dist/tests/extensions/gui-index.test.js.map +1 -0
  105. package/dist/tests/extensions/gui.test.d.ts +1 -0
  106. package/dist/tests/extensions/gui.test.js +177 -0
  107. package/dist/tests/extensions/gui.test.js.map +1 -0
  108. package/dist/tests/extensions/registry.test.js +36 -0
  109. package/dist/tests/extensions/registry.test.js.map +1 -1
  110. package/dist/tests/parser/statements.test.js +11 -0
  111. package/dist/tests/parser/statements.test.js.map +1 -1
  112. package/dist/tests/public-api.test.d.ts +1 -0
  113. package/dist/tests/public-api.test.js +31 -0
  114. package/dist/tests/public-api.test.js.map +1 -0
  115. package/package.json +1 -1
  116. package/runtime/ext_gui/css.cpp +4 -517
  117. package/runtime/ext_gui/css_internal.h +27 -0
  118. package/runtime/ext_gui/css_match.cpp +195 -0
  119. package/runtime/ext_gui/css_selector.cpp +207 -0
  120. package/runtime/ext_gui/css_sheet.cpp +129 -0
  121. package/runtime/ext_gui/document.cpp +90 -0
  122. package/runtime/ext_gui/document.h +23 -0
  123. package/runtime/ext_gui/dom.cpp +43 -403
  124. package/runtime/ext_gui/dom.h +7 -0
  125. package/runtime/ext_gui/dom_api.cpp +164 -0
  126. package/runtime/ext_gui/dom_api.h +12 -0
  127. package/runtime/ext_gui/dom_api_document.cpp +96 -0
  128. package/runtime/ext_gui/dom_api_events.cpp +123 -0
  129. package/runtime/ext_gui/dom_api_internal.h +135 -0
  130. package/runtime/ext_gui/dom_api_node.cpp +329 -0
  131. package/runtime/ext_gui/dom_api_node_read.cpp +294 -0
  132. package/runtime/ext_gui/dom_api_proto.cpp +130 -0
  133. package/runtime/ext_gui/dom_api_style.cpp +192 -0
  134. package/runtime/ext_gui/dom_internal.h +39 -0
  135. package/runtime/ext_gui/dom_parse.cpp +348 -0
  136. package/runtime/ext_gui/dom_serialize.cpp +54 -0
  137. package/runtime/ext_gui/gui.cpp +61 -245
  138. package/runtime/ext_gui/gui_engine.h +54 -0
  139. package/runtime/ext_gui/gui_events.cpp +294 -0
  140. package/runtime/ext_gui/gui_internal.h +29 -0
  141. package/runtime/ext_gui/layout.cpp +6 -597
  142. package/runtime/ext_gui/layout_flex.cpp +200 -0
  143. package/runtime/ext_gui/layout_flow.cpp +191 -0
  144. package/runtime/ext_gui/layout_flow_internal.h +149 -0
  145. package/runtime/ext_gui/layout_inline.cpp +181 -0
  146. package/runtime/ext_gui/layout_internal.h +20 -0
  147. package/runtime/ext_gui/renderer.cpp +15 -679
  148. package/runtime/ext_gui/renderer_image.cpp +233 -0
  149. package/runtime/ext_gui/renderer_internal.h +112 -0
  150. package/runtime/ext_gui/renderer_shaders.h +108 -0
  151. package/runtime/ext_gui/renderer_text.cpp +342 -0
  152. package/runtime/ext_gui/script.cpp +63 -0
  153. package/runtime/ext_gui/style.cpp +12 -660
  154. package/runtime/ext_gui/style_internal.h +33 -0
  155. package/runtime/ext_gui/style_print.cpp +113 -0
  156. package/runtime/ext_gui/style_ua.cpp +98 -0
  157. package/runtime/ext_gui/style_values.cpp +468 -0
  158. package/runtime/ext_gui/window.cpp +60 -0
  159. package/runtime/rt.h +6 -0
  160. package/runtime/rt_internal.h +4 -0
  161. package/runtime/xt_builtins.c +1 -0
  162. package/runtime/xt_containers/access.inc +32 -1
  163. package/runtime/xt_fetch/buffer.inc +64 -0
  164. package/runtime/xt_fetch/headers.inc +312 -0
  165. package/runtime/xt_fetch/request.inc +386 -0
  166. package/runtime/xt_fetch/response.inc +107 -0
  167. package/runtime/xt_fetch/socket.inc +72 -0
  168. package/runtime/xt_fetch/url.inc +108 -0
  169. package/runtime/xt_fetch.c +39 -0
  170. package/runtime/xt_stdlib2/set.inc +1 -1
  171. package/runtime/xt_typed_array.c +614 -0
  172. package/src/cli/main.ts +137 -29
  173. package/src/codegen/generator/calls/access.ts +9 -1
  174. package/src/codegen/generator/state.ts +20 -0
  175. package/src/codegen/generator/tables.ts +40 -0
  176. package/src/driver/bundler/commonjs.ts +553 -0
  177. package/src/driver/bundler/graph.ts +35 -2
  178. package/src/driver/bundler/merge.ts +18 -1
  179. package/src/driver/bundler/types.ts +8 -0
  180. package/src/driver/compiler.ts +85 -7
  181. package/src/driver/config.ts +173 -0
  182. package/src/driver/icon.ts +184 -0
  183. package/src/driver/index.ts +30 -0
  184. package/src/driver/mac-bundle.ts +156 -0
  185. package/src/driver/win-icon.ts +96 -0
  186. package/src/extensions/gui/html.ts +236 -0
  187. package/src/extensions/gui/index.ts +11 -0
  188. package/src/extensions/registry.ts +39 -0
  189. package/src/index.ts +1 -1
  190. package/src/lexer/scanner/identifiers.ts +4 -11
  191. package/src/parser/statements.ts +17 -4
  192. package/dist/tests/e2e/gui.test.d.ts +0 -12
  193. package/dist/tests/e2e/gui.test.js +0 -493
  194. package/dist/tests/e2e/gui.test.js.map +0 -1
@@ -1,493 +0,0 @@
1
- /**
2
- * End-to-end tests for the `gui` extension.
3
- *
4
- * The suite compiles TypeScript programs that import `gui`, links them against
5
- * the prebuilt `runtime/lib/<os>-<arch>/gui.a` and runs them. Programs close
6
- * themselves through the `XT_GUI_AUTOCLOSE_MS` hook, so the tests never block on
7
- * a real window.
8
- *
9
- * It is skipped when the GUI archive has not been built (run `npm run gui`
10
- * first) and on Windows, where the archive is not produced yet.
11
- */
12
- import { existsSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
13
- import { tmpdir } from "node:os";
14
- import { join } from "node:path";
15
- import { spawnSync } from "node:child_process";
16
- import { afterAll, beforeAll, describe, expect, it } from "vitest";
17
- import { build } from "../../src/driver/compiler.js";
18
- import { createDefaultRegistry } from "../../src/extensions/registry.js";
19
- import { guiExtension } from "../../src/extensions/gui/index.js";
20
- import { findRuntimeDir, platformSlug } from "../../src/driver/paths.js";
21
- const archivePath = join(findRuntimeDir(), "lib", platformSlug(), "gui.a");
22
- const available = existsSync(archivePath) && process.platform !== "win32";
23
- describe.skipIf(!available)("gui extension", () => {
24
- let workdir;
25
- let logoPath;
26
- beforeAll(() => {
27
- workdir = mkdtempSync(join(tmpdir(), "xbintsc-gui-"));
28
- // A 4x4 PNG: left half red, right half blue (base64-encoded inline).
29
- logoPath = join(workdir, "logo.png");
30
- writeFileSync(logoPath, Buffer.from("iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAFElEQVR42mP4z8DwH4Sh1H8G0gUALFAf4eNWqTEAAAAASUVORK5CYII=", "base64"));
31
- });
32
- afterAll(() => {
33
- rmSync(workdir, { recursive: true, force: true });
34
- });
35
- /** Compile a program and run it with the auto-close hook, returning stdout. */
36
- function compileAndRun(name, source) {
37
- const entry = join(workdir, `${name}.ts`);
38
- writeFileSync(entry, source);
39
- const extensions = createDefaultRegistry().register(guiExtension);
40
- const result = build(entry, {
41
- emit: "exe",
42
- outDir: join(workdir, `out-${name}`),
43
- cacheDir: join(workdir, `.cache-${name}`),
44
- extensions,
45
- });
46
- expect(result.diagnostics.filter((diagnostic) => diagnostic.category === "error")).toEqual([]);
47
- const executed = spawnSync(result.outputPath, [], {
48
- encoding: "utf8",
49
- env: { ...process.env, XT_GUI_AUTOCLOSE_MS: "400" },
50
- });
51
- expect(executed.status, executed.stderr).toBe(0);
52
- return { stdout: executed.stdout, status: executed.status };
53
- }
54
- it("opens a GPU-backed window and delivers lifecycle events", () => {
55
- const { stdout } = compileAndRun("window", `
56
- import { createWindow, run } from "gui";
57
- const win = createWindow({ title: "test window", width: 320, height: 240 });
58
- win.on("ready", () => console.log("gui ready"));
59
- win.on("close", () => console.log("gui closed"));
60
- win.setBackground("#101010");
61
- win.loadHTML("<h1>hi</h1>");
62
- run();
63
- console.log("gui exited");
64
- `);
65
- const lines = stdout.trim().split("\n");
66
- expect(lines).toContain("gui ready");
67
- expect(lines).toContain("gui closed");
68
- expect(lines).toContain("gui exited");
69
- });
70
- it("parses HTML/CSS and cascades computed styles", () => {
71
- const { stdout } = compileAndRun("cascade", `
72
- import { createWindow, run } from "gui";
73
-
74
- const HTML = \`
75
- <html>
76
- <head>
77
- <style>
78
- body { font-size: 16px; color: #111111; }
79
- div { width: 10%; }
80
- .box { width: 25%; }
81
- #main { width: 60%; color: #222222; }
82
- .box > .inner { padding-top: 3px; }
83
- .box .inner { padding-top: 5px; }
84
- li:first-child { color: #555555; }
85
- li:nth-child(2) { color: #666666; }
86
- li:not(.skip) { font-weight: bold; }
87
- [data-role="lead"] { text-align: center; }
88
- .em { font-size: 2em; }
89
- .rem { font-size: 2rem; }
90
- .imp { color: #000000; }
91
- .imp { color: #ff0000 !important; }
92
- </style>
93
- </head>
94
- <body>
95
- <div id="main" class="box">
96
- <div class="inner" style="color: #00ff00">x</div>
97
- <div class="inner">y</div>
98
- </div>
99
- <ul>
100
- <li>one</li>
101
- <li>two</li>
102
- <li class="skip">three</li>
103
- </ul>
104
- <p data-role="lead">lead</p>
105
- <div class="em">em</div>
106
- <div class="rem">rem</div>
107
- <div class="imp" style="color: #0000ff">important</div>
108
- </body>
109
- </html>
110
- \`;
111
-
112
- const win = createWindow({ title: "cascade", width: 800, height: 600 });
113
- win.on("ready", () => {
114
- const out = (label, value) => console.log(label + "=" + value);
115
- out("main-width", win.computedStyle("#main", "width"));
116
- out("inner-padding", win.computedStyle(".inner", "padding-top"));
117
- out("inner-color", win.computedStyle(".inner", "color"));
118
- out("body-color", win.computedStyle("body", "color"));
119
- out("li1-color", win.computedStyle("li:first-child", "color"));
120
- out("li2-color", win.computedStyle("li:nth-child(2)", "color"));
121
- out("li2-weight", win.computedStyle("li:nth-child(2)", "font-weight"));
122
- out("skip-weight", win.computedStyle("li.skip", "font-weight"));
123
- out("lead-align", win.computedStyle("[data-role=\\"lead\\"]", "text-align"));
124
- out("em-size", win.computedStyle(".em", "font-size"));
125
- out("rem-size", win.computedStyle(".rem", "font-size"));
126
- out("imp-color", win.computedStyle(".imp", "color"));
127
- out("li-count", win.queryCount("li"));
128
- out("lead-count", win.queryCount("[data-role=\\"lead\\"]"));
129
- });
130
- win.loadHTML(HTML);
131
- run();
132
- `);
133
- const value = (label) => {
134
- const line = stdout.split("\n").find((entry) => entry.startsWith(`${label}=`));
135
- expect(line, `missing ${label} in:\n${stdout}`).toBeDefined();
136
- return line.slice(label.length + 1).trim();
137
- };
138
- expect(value("main-width")).toBe("60%"); // id beats class and tag
139
- expect(value("inner-padding")).toBe("5px"); // equal specificity, later rule wins
140
- expect(value("inner-color")).toBe("rgb(0, 255, 0)"); // inline beats the sheet
141
- expect(value("body-color")).toBe("rgb(17, 17, 17)");
142
- expect(value("li1-color")).toBe("rgb(85, 85, 85)"); // :first-child
143
- expect(value("li2-color")).toBe("rgb(102, 102, 102)"); // :nth-child(2)
144
- expect(value("li2-weight")).toBe("700"); // :not(.skip)
145
- expect(value("skip-weight")).toBe("400"); // :not(.skip) excluded it
146
- expect(value("lead-align")).toBe("center"); // [data-role="lead"]
147
- expect(value("em-size")).toBe("32px"); // 2em of the 16px parent
148
- expect(value("rem-size")).toBe("32px"); // 2rem of the 16px root
149
- expect(value("imp-color")).toBe("rgb(255, 0, 0)"); // !important beats inline
150
- expect(value("li-count")).toBe("3");
151
- expect(value("lead-count")).toBe("1");
152
- });
153
- it("lays out block, inline and flex boxes", () => {
154
- const { stdout } = compileAndRun("layout", `
155
- import { createWindow, run } from "gui";
156
-
157
- const HTML = \`
158
- <html><head><style>
159
- body { margin: 0; }
160
- #box { width: 200px; height: 100px; padding: 10px; border: 2px solid #000; margin: 5px; }
161
- #row { display: flex; width: 300px; gap: 10px; }
162
- #row .a { width: 50px; height: 20px; }
163
- #row .b { flex: 1; height: 20px; }
164
- #wrap { width: 60px; font-size: 10px; }
165
- </style></head><body>
166
- <div id="box">hello</div>
167
- <div id="row"><div class="a"></div><div class="b"></div></div>
168
- <div id="wrap">aaaa bbbb cccc dddd</div>
169
- </body></html>
170
- \`;
171
-
172
- const win = createWindow({ title: "layout", width: 800, height: 600 });
173
- win.on("ready", () => {
174
- const rect = (selector) => {
175
- const r = win.getBoundingClientRect(selector);
176
- return r.x + "," + r.y + "," + r.width + "," + r.height;
177
- };
178
- console.log("box=" + rect("#box"));
179
- console.log("a=" + rect("#row .a"));
180
- console.log("b=" + rect("#row .b"));
181
- console.log("wrap=" + rect("#wrap"));
182
- console.log("lh=" + win.fontMetrics(10).lineHeight);
183
- });
184
- win.loadHTML(HTML);
185
- run();
186
- `);
187
- const value = (label) => {
188
- const line = stdout.split("\n").find((entry) => entry.startsWith(`${label}=`));
189
- expect(line, `missing ${label} in:\n${stdout}`).toBeDefined();
190
- return line.slice(label.length + 1).trim();
191
- };
192
- // Border box = content + padding (20) + border (4); margin offsets by 5.
193
- expect(value("box")).toBe("5,5,224,124");
194
- // Flex row: `.a` keeps 50px, `.b` grows into the remaining 240px after a 10px gap.
195
- expect(value("a")).toBe("0,134,50,20");
196
- expect(value("b")).toBe("60,134,240,20");
197
- // 60px-wide box wraps "aaaa bbbb" / "cccc dddd" onto two lines. The line
198
- // height comes from the real font metrics, so assert against them rather
199
- // than hard-coding a pixel value (fonts differ per platform).
200
- const wrap = value("wrap").split(",").map(Number);
201
- expect(wrap.slice(0, 3)).toEqual([0, 154, 60]);
202
- expect(wrap[3]).toBeCloseTo(2 * Number(value("lh")), 1);
203
- });
204
- it("sizes and paints images (intrinsic and explicit)", () => {
205
- const { stdout } = compileAndRun("image", `
206
- import { createWindow, run } from "gui";
207
-
208
- const HTML = \`
209
- <html><head><style>
210
- body { margin: 0; }
211
- #logo { width: 40px; height: 40px; }
212
- </style></head><body>
213
- <img id="logo" src="${logoPath}">
214
- <img id="natural" src="${logoPath}">
215
- </body></html>
216
- \`;
217
-
218
- const win = createWindow({ title: "image", width: 400, height: 300 });
219
- win.on("ready", () => {
220
- const logo = win.getBoundingClientRect("#logo");
221
- console.log("logo=" + logo.width + "x" + logo.height);
222
- const natural = win.getBoundingClientRect("#natural");
223
- console.log("natural=" + natural.width + "x" + natural.height);
224
- console.log(win.paintList().trim());
225
- win.close();
226
- });
227
- win.loadHTML(HTML);
228
- run();
229
- `);
230
- // Explicit CSS size wins; without one the intrinsic 4x4 size is used.
231
- expect(stdout).toContain("logo=40x40");
232
- expect(stdout).toContain("natural=4x4");
233
- expect(stdout).toContain(`image x=0.0 y=0.0 w=40.0 h=40.0 src=${logoPath}`);
234
- expect(stdout).toContain(`image x=0.0 y=40.0 w=4.0 h=4.0 src=${logoPath}`);
235
- });
236
- it("builds a display list of backgrounds and borders", () => {
237
- const { stdout } = compileAndRun("paint", `
238
- import { createWindow, run } from "gui";
239
-
240
- const HTML = \`
241
- <html><head><style>
242
- body { margin: 0; background-color: #123456; }
243
- #box { width: 100px; height: 40px; background: #ff0000; border: 4px solid #00ff00; border-radius: 8px; }
244
- </style></head><body>
245
- <div id="box">x</div>
246
- </body></html>
247
- \`;
248
-
249
- const win = createWindow({ title: "paint", width: 800, height: 600 });
250
- win.on("ready", () => {
251
- const r = win.getBoundingClientRect("#box");
252
- console.log("box-rect=" + r.x + "," + r.y + "," + r.width + "," + r.height);
253
- console.log("paint-count=" + win.paintCount());
254
- console.log("paint-list-start");
255
- console.log(win.paintList());
256
- console.log("paint-list-end");
257
- });
258
- win.loadHTML(HTML);
259
- run();
260
- `);
261
- const value = (label) => {
262
- const line = stdout.split("\n").find((entry) => entry.startsWith(`${label}=`));
263
- expect(line, `missing ${label} in:\n${stdout}`).toBeDefined();
264
- return line.slice(label.length + 1).trim();
265
- };
266
- const list = stdout.slice(stdout.indexOf("paint-list-start"), stdout.indexOf("paint-list-end"));
267
- const occurrences = (needle) => list.split(needle).length - 1;
268
- // Border box = 100x40 content + 4px border on every side.
269
- expect(value("box-rect")).toBe("0,0,108,48");
270
- // body background + #box background + 4 border edges.
271
- expect(value("paint-count")).toBe("6");
272
- expect(occurrences("#123456ff")).toBe(1); // body background
273
- expect(occurrences("#ff0000ff")).toBe(1); // #box background
274
- expect(occurrences("#00ff00ff")).toBe(4); // four border edges
275
- // The background rectangle carries the 8px corner radius.
276
- expect(list).toContain("r=8.0 color=#ff0000ff");
277
- });
278
- it("emits shaped text runs into the display list", () => {
279
- const { stdout } = compileAndRun("text-runs", `
280
- import { createWindow, run } from "gui";
281
-
282
- const HTML = \`
283
- <html><head><style>
284
- body { margin: 0; }
285
- #t { font-size: 20px; color: #0000ff; }
286
- </style></head><body>
287
- <div id="t">Hi</div>
288
- </body></html>
289
- \`;
290
-
291
- const win = createWindow({ title: "text-runs", width: 400, height: 300 });
292
- win.on("ready", () => {
293
- const r = win.getBoundingClientRect("#t");
294
- console.log("rect=" + r.x + "," + r.y + "," + r.width + "," + r.height);
295
- console.log("paint-list-start");
296
- console.log(win.paintList());
297
- console.log("paint-list-end");
298
- });
299
- win.loadHTML(HTML);
300
- run();
301
- `);
302
- const list = stdout.slice(stdout.indexOf("paint-list-start"), stdout.indexOf("paint-list-end"));
303
- // The text fragment carries the resolved font size and colour.
304
- expect(list).toContain('text x=0.0');
305
- expect(list).toContain('size=20.0');
306
- expect(list).toContain('color=#0000ffff "Hi"');
307
- });
308
- it("hit-tests elements and delivers input events to handlers", () => {
309
- const { stdout } = compileAndRun("input", `
310
- import { createWindow, run } from "gui";
311
-
312
- const HTML = \`
313
- <html><head><style>
314
- body { margin: 0; }
315
- #box { width: 100px; height: 50px; }
316
- #inner { width: 20px; height: 20px; }
317
- </style></head><body>
318
- <div id="box"><div id="inner">x</div></div>
319
- </body></html>
320
- \`;
321
-
322
- const win = createWindow({ title: "input", width: 400, height: 300 });
323
- const log = [];
324
- win.on("mousemove", (e) => log.push("move:" + e.target));
325
- win.on("mousedown", (e) => log.push("down:" + e.button + ":" + e.target));
326
- win.on("click", (e) => log.push("click:" + e.x + "," + e.y + ":" + e.target));
327
- win.on("wheel", (e) => log.push("wheel:" + e.deltaX + "," + e.deltaY));
328
- win.on("keydown", (e) => log.push("key:" + e.key + ":" + e.shift));
329
-
330
- win.on("ready", () => {
331
- console.log("hit-inner=" + win.hitTest(5, 5));
332
- console.log("hit-box=" + win.hitTest(50, 40));
333
- console.log("hit-none=[" + win.hitTest(390, 290) + "]");
334
- win.sendEvent("mousemove", { x: 5, y: 5 });
335
- win.sendEvent("mousedown", { x: 5, y: 5, button: 0 });
336
- win.sendEvent("click", { x: 5, y: 5, button: 0 });
337
- win.sendEvent("wheel", { x: 5, y: 5, deltaX: 1, deltaY: 2 });
338
- win.sendEvent("keydown", { key: "a", code: "KeyA" });
339
- for (const line of log) console.log("event=" + line);
340
- win.close();
341
- });
342
- win.loadHTML(HTML);
343
- run();
344
- `);
345
- const value = (label) => {
346
- const line = stdout.split("\n").find((entry) => entry.startsWith(`${label}=`));
347
- expect(line, `missing ${label} in:\n${stdout}`).toBeDefined();
348
- return line.slice(label.length + 1).trim();
349
- };
350
- // Hit testing returns the deepest element under the point.
351
- expect(value("hit-inner")).toBe("div#inner");
352
- expect(value("hit-box")).toBe("div#box");
353
- expect(value("hit-none")).toBe("[]");
354
- // Handlers receive the payload (coordinates, button, target, deltas, key).
355
- expect(stdout).toContain("event=move:div#inner");
356
- expect(stdout).toContain("event=down:0:div#inner");
357
- expect(stdout).toContain("event=click:5,5:div#inner");
358
- expect(stdout).toContain("event=wheel:1,2");
359
- expect(stdout).toContain("event=key:a:false");
360
- });
361
- it("applies :hover and :focus state to selector matching", () => {
362
- const { stdout } = compileAndRun("state", `
363
- import { createWindow, run } from "gui";
364
-
365
- const HTML = \`
366
- <html><head><style>
367
- body { margin: 0; }
368
- #box { width: 100px; height: 50px; background: #000000; }
369
- #box:hover { background: #ff0000; }
370
- #box:focus { background: #00ff00; }
371
- #box:hover > #inner { color: #0000ff; }
372
- #inner { width: 20px; height: 20px; color: #888888; }
373
- </style></head><body>
374
- <div id="box"><div id="inner">x</div></div>
375
- </body></html>
376
- \`;
377
-
378
- const win = createWindow({ title: "state", width: 400, height: 300 });
379
- win.on("ready", () => {
380
- console.log("initial-bg=" + win.computedStyle("#box", "background-color"));
381
- console.log("initial-color=" + win.computedStyle("#inner", "color"));
382
- win.sendEvent("mousemove", { x: 50, y: 40 });
383
- console.log("hover-bg=" + win.computedStyle("#box", "background-color"));
384
- win.sendEvent("mousemove", { x: 5, y: 5 });
385
- console.log("inner-hover-color=" + win.computedStyle("#inner", "color"));
386
- win.sendEvent("mousedown", { x: 50, y: 40, button: 0 });
387
- console.log("focus-bg=" + win.computedStyle("#box", "background-color"));
388
- win.close();
389
- });
390
- win.loadHTML(HTML);
391
- run();
392
- `);
393
- const value = (label) => {
394
- const line = stdout.split("\n").find((entry) => entry.startsWith(`${label}=`));
395
- expect(line, `missing ${label} in:\n${stdout}`).toBeDefined();
396
- return line.slice(label.length + 1).trim();
397
- };
398
- expect(value("initial-bg")).toBe("rgb(0, 0, 0)"); // no :hover rule match
399
- expect(value("initial-color")).toBe("rgb(136, 136, 136)");
400
- expect(value("hover-bg")).toBe("rgb(255, 0, 0)"); // hovering #box
401
- // Hover also applies to ancestors of the hovered element.
402
- expect(value("inner-hover-color")).toBe("rgb(0, 0, 255)");
403
- expect(value("focus-bg")).toBe("rgb(0, 255, 0)"); // :focus wins over :hover
404
- });
405
- it("interpolates CSS transitions as the clock advances", () => {
406
- const { stdout } = compileAndRun("transition", `
407
- import { createWindow, run } from "gui";
408
-
409
- const HTML = \`
410
- <html><head><style>
411
- body { margin: 0; }
412
- #box {
413
- width: 100px; height: 50px; background-color: #000000; color: #888888;
414
- border-radius: 0px;
415
- transition: background-color 1000ms linear, color 500ms linear, border-radius 1000ms linear;
416
- }
417
- #box:hover { background-color: #ffffff; color: #0000ff; border-radius: 10px; }
418
- </style></head><body>
419
- <div id="box">hi</div>
420
- </body></html>
421
- \`;
422
-
423
- const win = createWindow({ title: "transition", width: 400, height: 300 });
424
- win.on("ready", () => {
425
- win.sendEvent("mousemove", { x: 50, y: 25 });
426
- console.log("start=" + win.computedStyle("#box", "background-color"));
427
- win.advance(250);
428
- console.log("q1-bg=" + win.computedStyle("#box", "background-color"));
429
- console.log("q1-color=" + win.computedStyle("#box", "color"));
430
- win.advance(250);
431
- console.log("q2-bg=" + win.computedStyle("#box", "background-color"));
432
- console.log("q2-color=" + win.computedStyle("#box", "color"));
433
- console.log("q2-radius=" + win.computedStyle("#box", "border-radius"));
434
- win.advance(500);
435
- console.log("end-bg=" + win.computedStyle("#box", "background-color"));
436
- console.log("end-radius=" + win.computedStyle("#box", "border-radius"));
437
- win.close();
438
- });
439
- win.loadHTML(HTML);
440
- run();
441
- `);
442
- const value = (label) => {
443
- const line = stdout.split("\n").find((entry) => entry.startsWith(`${label}=`));
444
- expect(line, `missing ${label} in:\n${stdout}`).toBeDefined();
445
- return line.slice(label.length + 1).trim();
446
- };
447
- expect(value("start")).toBe("rgb(0, 0, 0)"); // 0% progress at t=0
448
- expect(value("q1-bg")).toBe("rgb(64, 64, 64)"); // 25% of black->white
449
- expect(value("q1-color")).toBe("rgb(68, 68, 196)"); // 50% of the 500ms color run
450
- expect(value("q2-bg")).toBe("rgb(128, 128, 128)"); // halfway
451
- expect(value("q2-color")).toBe("rgb(0, 0, 255)"); // finished
452
- expect(value("q2-radius")).toBe("5px");
453
- expect(value("end-bg")).toBe("rgb(255, 255, 255)"); // finished
454
- expect(value("end-radius")).toBe("10px");
455
- });
456
- it("shapes and measures text with the font stack", () => {
457
- const { stdout } = compileAndRun("text", `
458
- import { createWindow, run } from "gui";
459
-
460
- const win = createWindow({ title: "text", width: 400, height: 300 });
461
- win.on("ready", () => {
462
- const fm16 = win.fontMetrics(16);
463
- console.log("ready=" + fm16.ready);
464
- console.log("lh16=" + fm16.lineHeight);
465
- console.log("ascent16=" + fm16.ascent);
466
- console.log("m16=" + win.measureText("Hello", 16));
467
- console.log("m32=" + win.measureText("Hello", 32));
468
- console.log("empty=" + win.measureText("", 16));
469
- console.log("wide=" + (win.measureText("WWWW", 16) > win.measureText("iiii", 16)));
470
- win.close();
471
- });
472
- win.loadHTML("<html><body></body></html>");
473
- run();
474
- `);
475
- const value = (label) => {
476
- const line = stdout.split("\n").find((entry) => entry.startsWith(`${label}=`));
477
- expect(line, `missing ${label} in:\n${stdout}`).toBeDefined();
478
- return line.slice(label.length + 1).trim();
479
- };
480
- // Metrics are positive and scale ~linearly with the font size (this holds
481
- // for both the real shaper and the no-font fallback).
482
- const m16 = Number(value("m16"));
483
- const m32 = Number(value("m32"));
484
- expect(m16).toBeGreaterThan(0);
485
- expect(m32).toBeGreaterThan(m16 * 1.8);
486
- expect(m32).toBeLessThan(m16 * 2.2);
487
- expect(Number(value("lh16"))).toBeGreaterThan(0);
488
- expect(Number(value("ascent16"))).toBeGreaterThan(0);
489
- expect(value("empty")).toBe("0");
490
- expect(value("wide")).toBe("true");
491
- });
492
- });
493
- //# sourceMappingURL=gui.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gui.test.js","sourceRoot":"","sources":["../../../tests/e2e/gui.test.ts"],"names":[],"mappings":"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"}