@tsonic/emitter 0.0.6 → 0.0.13

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 (223) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/array.test.js +5 -5
  3. package/dist/array.test.js.map +1 -1
  4. package/dist/core/attributes.d.ts +43 -0
  5. package/dist/core/attributes.d.ts.map +1 -0
  6. package/dist/core/attributes.js +128 -0
  7. package/dist/core/attributes.js.map +1 -0
  8. package/dist/core/attributes.test.d.ts +5 -0
  9. package/dist/core/attributes.test.d.ts.map +1 -0
  10. package/dist/core/attributes.test.js +296 -0
  11. package/dist/core/attributes.test.js.map +1 -0
  12. package/dist/core/imports.test.js +6 -3
  13. package/dist/core/imports.test.js.map +1 -1
  14. package/dist/core/index.d.ts +2 -0
  15. package/dist/core/index.d.ts.map +1 -1
  16. package/dist/core/index.js +2 -0
  17. package/dist/core/index.js.map +1 -1
  18. package/dist/core/module-emitter/static-container.d.ts.map +1 -1
  19. package/dist/core/module-emitter/static-container.js +50 -1
  20. package/dist/core/module-emitter/static-container.js.map +1 -1
  21. package/dist/core/module-emitter.test.js +2 -1
  22. package/dist/core/module-emitter.test.js.map +1 -1
  23. package/dist/core/module-map.d.ts.map +1 -1
  24. package/dist/core/module-map.js +5 -1
  25. package/dist/core/module-map.js.map +1 -1
  26. package/dist/core/module-map.test.d.ts +8 -0
  27. package/dist/core/module-map.test.d.ts.map +1 -0
  28. package/dist/core/module-map.test.js +94 -0
  29. package/dist/core/module-map.test.js.map +1 -0
  30. package/dist/core/type-compatibility.d.ts +31 -0
  31. package/dist/core/type-compatibility.d.ts.map +1 -0
  32. package/dist/core/type-compatibility.js +99 -0
  33. package/dist/core/type-compatibility.js.map +1 -0
  34. package/dist/core/type-resolution.d.ts +83 -3
  35. package/dist/core/type-resolution.d.ts.map +1 -1
  36. package/dist/core/type-resolution.js +262 -4
  37. package/dist/core/type-resolution.js.map +1 -1
  38. package/dist/core/type-resolution.test.js +110 -1
  39. package/dist/core/type-resolution.test.js.map +1 -1
  40. package/dist/emitter-types/context.d.ts.map +1 -1
  41. package/dist/emitter-types/context.js +21 -1
  42. package/dist/emitter-types/context.js.map +1 -1
  43. package/dist/emitter-types/core.d.ts +26 -0
  44. package/dist/emitter-types/core.d.ts.map +1 -1
  45. package/dist/emitter-types/identifiers.d.ts.map +1 -1
  46. package/dist/emitter-types/identifiers.js +4 -43
  47. package/dist/emitter-types/identifiers.js.map +1 -1
  48. package/dist/emitter-types/index.d.ts +1 -1
  49. package/dist/emitter-types/index.d.ts.map +1 -1
  50. package/dist/emitter-types/index.js.map +1 -1
  51. package/dist/emitter.d.ts.map +1 -1
  52. package/dist/emitter.js +47 -1
  53. package/dist/emitter.js.map +1 -1
  54. package/dist/expression-emitter.d.ts.map +1 -1
  55. package/dist/expression-emitter.js +51 -3
  56. package/dist/expression-emitter.js.map +1 -1
  57. package/dist/expressions/access.d.ts.map +1 -1
  58. package/dist/expressions/access.js +138 -23
  59. package/dist/expressions/access.js.map +1 -1
  60. package/dist/expressions/calls.d.ts.map +1 -1
  61. package/dist/expressions/calls.js +90 -13
  62. package/dist/expressions/calls.js.map +1 -1
  63. package/dist/expressions/collections.d.ts +3 -2
  64. package/dist/expressions/collections.d.ts.map +1 -1
  65. package/dist/expressions/collections.js +251 -52
  66. package/dist/expressions/collections.js.map +1 -1
  67. package/dist/expressions/functions.d.ts +2 -2
  68. package/dist/expressions/functions.d.ts.map +1 -1
  69. package/dist/expressions/functions.js +81 -38
  70. package/dist/expressions/functions.js.map +1 -1
  71. package/dist/expressions/identifiers.d.ts.map +1 -1
  72. package/dist/expressions/identifiers.js +28 -7
  73. package/dist/expressions/identifiers.js.map +1 -1
  74. package/dist/expressions/index.test.js +191 -4
  75. package/dist/expressions/index.test.js.map +1 -1
  76. package/dist/expressions/literals.d.ts +7 -17
  77. package/dist/expressions/literals.d.ts.map +1 -1
  78. package/dist/expressions/literals.js +27 -87
  79. package/dist/expressions/literals.js.map +1 -1
  80. package/dist/expressions/literals.test.js +52 -2
  81. package/dist/expressions/literals.test.js.map +1 -1
  82. package/dist/expressions/operators.d.ts +29 -11
  83. package/dist/expressions/operators.d.ts.map +1 -1
  84. package/dist/expressions/operators.js +244 -67
  85. package/dist/expressions/operators.js.map +1 -1
  86. package/dist/expressions/other.d.ts +3 -0
  87. package/dist/expressions/other.d.ts.map +1 -1
  88. package/dist/expressions/other.js +27 -3
  89. package/dist/expressions/other.js.map +1 -1
  90. package/dist/generator-exchange.d.ts +1 -1
  91. package/dist/generator-exchange.d.ts.map +1 -1
  92. package/dist/generator-exchange.js +15 -4
  93. package/dist/generator-exchange.js.map +1 -1
  94. package/dist/generator-wrapper.d.ts +84 -0
  95. package/dist/generator-wrapper.d.ts.map +1 -0
  96. package/dist/generator-wrapper.js +312 -0
  97. package/dist/generator-wrapper.js.map +1 -0
  98. package/dist/generator-wrapper.test.d.ts +12 -0
  99. package/dist/generator-wrapper.test.d.ts.map +1 -0
  100. package/dist/generator-wrapper.test.js +179 -0
  101. package/dist/generator-wrapper.test.js.map +1 -0
  102. package/dist/generator.test.js +596 -6
  103. package/dist/generator.test.js.map +1 -1
  104. package/dist/golden-tests/config-parser.d.ts.map +1 -1
  105. package/dist/golden-tests/config-parser.js +81 -11
  106. package/dist/golden-tests/config-parser.js.map +1 -1
  107. package/dist/golden-tests/discovery.d.ts +14 -3
  108. package/dist/golden-tests/discovery.d.ts.map +1 -1
  109. package/dist/golden-tests/discovery.js +105 -12
  110. package/dist/golden-tests/discovery.js.map +1 -1
  111. package/dist/golden-tests/index.d.ts +1 -1
  112. package/dist/golden-tests/index.d.ts.map +1 -1
  113. package/dist/golden-tests/index.js.map +1 -1
  114. package/dist/golden-tests/runner.d.ts +1 -0
  115. package/dist/golden-tests/runner.d.ts.map +1 -1
  116. package/dist/golden-tests/runner.js +83 -25
  117. package/dist/golden-tests/runner.js.map +1 -1
  118. package/dist/golden-tests/types.d.ts +18 -1
  119. package/dist/golden-tests/types.d.ts.map +1 -1
  120. package/dist/golden.test.d.ts +12 -5
  121. package/dist/golden.test.d.ts.map +1 -1
  122. package/dist/golden.test.js +40 -21
  123. package/dist/golden.test.js.map +1 -1
  124. package/dist/hierarchical-bindings.test.js +2 -2
  125. package/dist/hierarchical-bindings.test.js.map +1 -1
  126. package/dist/integration.test.js +57 -10
  127. package/dist/integration.test.js.map +1 -1
  128. package/dist/invariants/emitter-globals-subset.test.d.ts +15 -0
  129. package/dist/invariants/emitter-globals-subset.test.d.ts.map +1 -0
  130. package/dist/invariants/emitter-globals-subset.test.js +137 -0
  131. package/dist/invariants/emitter-globals-subset.test.js.map +1 -0
  132. package/dist/invariants/numeric-proof-contract.test.d.ts +19 -0
  133. package/dist/invariants/numeric-proof-contract.test.d.ts.map +1 -0
  134. package/dist/invariants/numeric-proof-contract.test.js +565 -0
  135. package/dist/invariants/numeric-proof-contract.test.js.map +1 -0
  136. package/dist/specialization/generic-functions.test.js +376 -0
  137. package/dist/specialization/generic-functions.test.js.map +1 -1
  138. package/dist/specialization/interfaces.test.js +6 -6
  139. package/dist/specialization/interfaces.test.js.map +1 -1
  140. package/dist/specialization/substitution.d.ts.map +1 -1
  141. package/dist/specialization/substitution.js +7 -0
  142. package/dist/specialization/substitution.js.map +1 -1
  143. package/dist/specialization/type-aliases.test.js +88 -5
  144. package/dist/specialization/type-aliases.test.js.map +1 -1
  145. package/dist/statement-emitter.d.ts.map +1 -1
  146. package/dist/statement-emitter.js +5 -1
  147. package/dist/statement-emitter.js.map +1 -1
  148. package/dist/statements/blocks.d.ts +39 -1
  149. package/dist/statements/blocks.d.ts.map +1 -1
  150. package/dist/statements/blocks.js +129 -3
  151. package/dist/statements/blocks.js.map +1 -1
  152. package/dist/statements/classes/members/methods.d.ts.map +1 -1
  153. package/dist/statements/classes/members/methods.js +16 -5
  154. package/dist/statements/classes/members/methods.js.map +1 -1
  155. package/dist/statements/classes/members/properties.d.ts.map +1 -1
  156. package/dist/statements/classes/members/properties.js +10 -1
  157. package/dist/statements/classes/members/properties.js.map +1 -1
  158. package/dist/statements/classes/properties.d.ts.map +1 -1
  159. package/dist/statements/classes/properties.js +4 -0
  160. package/dist/statements/classes/properties.js.map +1 -1
  161. package/dist/statements/control/conditionals.d.ts.map +1 -1
  162. package/dist/statements/control/conditionals.js +352 -1
  163. package/dist/statements/control/conditionals.js.map +1 -1
  164. package/dist/statements/control/loops.d.ts +6 -0
  165. package/dist/statements/control/loops.d.ts.map +1 -1
  166. package/dist/statements/control/loops.js +9 -2
  167. package/dist/statements/control/loops.js.map +1 -1
  168. package/dist/statements/declarations/classes.d.ts.map +1 -1
  169. package/dist/statements/declarations/classes.js +20 -6
  170. package/dist/statements/declarations/classes.js.map +1 -1
  171. package/dist/statements/declarations/functions.d.ts.map +1 -1
  172. package/dist/statements/declarations/functions.js +98 -26
  173. package/dist/statements/declarations/functions.js.map +1 -1
  174. package/dist/statements/declarations/interfaces.d.ts.map +1 -1
  175. package/dist/statements/declarations/interfaces.js +11 -1
  176. package/dist/statements/declarations/interfaces.js.map +1 -1
  177. package/dist/statements/declarations/structs.test.js +7 -5
  178. package/dist/statements/declarations/structs.test.js.map +1 -1
  179. package/dist/statements/declarations/type-aliases.d.ts.map +1 -1
  180. package/dist/statements/declarations/type-aliases.js +18 -9
  181. package/dist/statements/declarations/type-aliases.js.map +1 -1
  182. package/dist/statements/declarations/variables.d.ts.map +1 -1
  183. package/dist/statements/declarations/variables.js +54 -2
  184. package/dist/statements/declarations/variables.js.map +1 -1
  185. package/dist/statements/index.test.js +164 -3
  186. package/dist/statements/index.test.js.map +1 -1
  187. package/dist/types/arrays.d.ts +10 -1
  188. package/dist/types/arrays.d.ts.map +1 -1
  189. package/dist/types/arrays.js +16 -1
  190. package/dist/types/arrays.js.map +1 -1
  191. package/dist/types/dictionaries.d.ts +3 -2
  192. package/dist/types/dictionaries.d.ts.map +1 -1
  193. package/dist/types/dictionaries.js +14 -8
  194. package/dist/types/dictionaries.js.map +1 -1
  195. package/dist/types/emitter.d.ts.map +1 -1
  196. package/dist/types/emitter.js +3 -0
  197. package/dist/types/emitter.js.map +1 -1
  198. package/dist/types/index.test.js +5 -2
  199. package/dist/types/index.test.js.map +1 -1
  200. package/dist/types/parameters.d.ts.map +1 -1
  201. package/dist/types/parameters.js +29 -0
  202. package/dist/types/parameters.js.map +1 -1
  203. package/dist/types/primitives.d.ts +12 -1
  204. package/dist/types/primitives.d.ts.map +1 -1
  205. package/dist/types/primitives.js +14 -1
  206. package/dist/types/primitives.js.map +1 -1
  207. package/dist/types/references.d.ts.map +1 -1
  208. package/dist/types/references.js +136 -30
  209. package/dist/types/references.js.map +1 -1
  210. package/dist/types/references.test.d.ts +11 -0
  211. package/dist/types/references.test.d.ts.map +1 -0
  212. package/dist/types/references.test.js +382 -0
  213. package/dist/types/references.test.js.map +1 -0
  214. package/dist/types/tuples.d.ts +23 -0
  215. package/dist/types/tuples.d.ts.map +1 -0
  216. package/dist/types/tuples.js +54 -0
  217. package/dist/types/tuples.js.map +1 -0
  218. package/dist/types/unions.test.js +62 -15
  219. package/dist/types/unions.test.js.map +1 -1
  220. package/dist/types.d.ts +1 -1
  221. package/dist/types.d.ts.map +1 -1
  222. package/dist/types.js.map +1 -1
  223. package/package.json +7 -3
@@ -0,0 +1,565 @@
1
+ /**
2
+ * Contract Test: Numeric Proof System (Behavioral)
3
+ *
4
+ * These tests enforce the contract between the numeric proof pass (frontend)
5
+ * and the emitter (backend) using BEHAVIOR, not source code pattern matching.
6
+ *
7
+ * Key contract:
8
+ * 1. Only the proof pass determines whether an expression is proven Int32
9
+ * 2. The emitter checks IR markers (numericIntent) and ICEs if missing
10
+ * 3. TSN5107 is triggered based on accessKind, not heuristic name matching
11
+ * 4. TSN5109 is triggered when accessKind is unknown/missing (compiler bug)
12
+ *
13
+ * Test approach:
14
+ * - Create IR fixtures with specific accessKind values
15
+ * - Run proof pass and assert diagnostics or success
16
+ * - Run emitter and verify ICE behavior for unproven indices
17
+ */
18
+ import { describe, it } from "mocha";
19
+ import { expect } from "chai";
20
+ import { runNumericProofPass, } from "@tsonic/frontend";
21
+ import { emitModule } from "../emitter.js";
22
+ /**
23
+ * Create a minimal module with an array access expression.
24
+ * This allows testing different accessKind values and proof states.
25
+ */
26
+ const createModuleWithAccess = (options) => {
27
+ const indexExpr = {
28
+ kind: "literal",
29
+ value: options.indexValue ?? 0,
30
+ raw: options.indexRaw ?? "0",
31
+ // If indexHasProof is true, pre-annotate with int type
32
+ // (simulating what the proof pass would do)
33
+ // INVARIANT: primitiveType(name="int") is the proven integer type
34
+ ...(options.indexHasProof
35
+ ? {
36
+ inferredType: {
37
+ kind: "primitiveType",
38
+ name: "int",
39
+ },
40
+ }
41
+ : {}),
42
+ };
43
+ const memberAccess = {
44
+ kind: "memberAccess",
45
+ object: {
46
+ kind: "identifier",
47
+ name: "arr",
48
+ inferredType: {
49
+ kind: "arrayType",
50
+ elementType: { kind: "primitiveType", name: "number" },
51
+ },
52
+ },
53
+ property: indexExpr,
54
+ isComputed: true,
55
+ isOptional: false,
56
+ // accessKind may be undefined to test missing tag
57
+ ...(options.accessKind !== undefined
58
+ ? { accessKind: options.accessKind }
59
+ : {}),
60
+ inferredType: { kind: "primitiveType", name: "number" },
61
+ };
62
+ return {
63
+ kind: "module",
64
+ filePath: "/test/contract.ts",
65
+ namespace: "Test",
66
+ className: "contract",
67
+ isStaticContainer: true,
68
+ imports: [],
69
+ body: [
70
+ {
71
+ kind: "variableDeclaration",
72
+ declarationKind: "const",
73
+ isExported: false,
74
+ declarations: [
75
+ {
76
+ kind: "variableDeclarator",
77
+ name: { kind: "identifierPattern", name: "arr" },
78
+ type: {
79
+ kind: "arrayType",
80
+ elementType: { kind: "primitiveType", name: "number" },
81
+ },
82
+ initializer: {
83
+ kind: "array",
84
+ elements: [
85
+ { kind: "literal", value: 1 },
86
+ { kind: "literal", value: 2 },
87
+ { kind: "literal", value: 3 },
88
+ ],
89
+ },
90
+ },
91
+ ],
92
+ },
93
+ {
94
+ kind: "variableDeclaration",
95
+ declarationKind: "const",
96
+ isExported: false,
97
+ declarations: [
98
+ {
99
+ kind: "variableDeclarator",
100
+ name: { kind: "identifierPattern", name: "x" },
101
+ initializer: memberAccess,
102
+ },
103
+ ],
104
+ },
105
+ ],
106
+ exports: [],
107
+ };
108
+ };
109
+ /**
110
+ * Create module with identifier index (not literal)
111
+ */
112
+ const createModuleWithIdentifierIndex = (options) => {
113
+ const indexExpr = {
114
+ kind: "identifier",
115
+ name: options.indexName,
116
+ // If indexHasInt32Type, give it int type
117
+ // INVARIANT: primitiveType(name="int") is the proven integer type
118
+ ...(options.indexHasInt32Type
119
+ ? {
120
+ inferredType: {
121
+ kind: "primitiveType",
122
+ name: "int",
123
+ },
124
+ }
125
+ : {
126
+ inferredType: { kind: "primitiveType", name: "number" },
127
+ }),
128
+ };
129
+ const memberAccess = {
130
+ kind: "memberAccess",
131
+ object: {
132
+ kind: "identifier",
133
+ name: "arr",
134
+ inferredType: {
135
+ kind: "arrayType",
136
+ elementType: { kind: "primitiveType", name: "number" },
137
+ },
138
+ },
139
+ property: indexExpr,
140
+ isComputed: true,
141
+ isOptional: false,
142
+ accessKind: options.accessKind,
143
+ inferredType: { kind: "primitiveType", name: "number" },
144
+ };
145
+ return {
146
+ kind: "module",
147
+ filePath: "/test/contract.ts",
148
+ namespace: "Test",
149
+ className: "contract",
150
+ isStaticContainer: true,
151
+ imports: [],
152
+ body: [
153
+ {
154
+ kind: "variableDeclaration",
155
+ declarationKind: "const",
156
+ isExported: false,
157
+ declarations: [
158
+ {
159
+ kind: "variableDeclarator",
160
+ name: { kind: "identifierPattern", name: "arr" },
161
+ type: {
162
+ kind: "arrayType",
163
+ elementType: { kind: "primitiveType", name: "number" },
164
+ },
165
+ initializer: {
166
+ kind: "array",
167
+ elements: [
168
+ { kind: "literal", value: 1 },
169
+ { kind: "literal", value: 2 },
170
+ { kind: "literal", value: 3 },
171
+ ],
172
+ },
173
+ },
174
+ ],
175
+ },
176
+ {
177
+ kind: "variableDeclaration",
178
+ declarationKind: "const",
179
+ isExported: false,
180
+ declarations: [
181
+ {
182
+ kind: "variableDeclarator",
183
+ name: { kind: "identifierPattern", name: "x" },
184
+ initializer: memberAccess,
185
+ },
186
+ ],
187
+ },
188
+ ],
189
+ exports: [],
190
+ };
191
+ };
192
+ describe("Numeric Proof Contract (Behavioral)", () => {
193
+ // ============================================================================
194
+ // ACCESS KINDS THAT REQUIRE Int32 PROOF: clrIndexer, jsRuntimeArray, stringChar
195
+ // ============================================================================
196
+ describe("clrIndexer access (requires Int32 proof)", () => {
197
+ it("double literal (1.5) triggers TSN5107", () => {
198
+ const module = createModuleWithAccess({
199
+ accessKind: "clrIndexer",
200
+ indexHasProof: false,
201
+ indexValue: 1.5,
202
+ indexRaw: "1.5",
203
+ });
204
+ const result = runNumericProofPass([module]);
205
+ expect(result.ok).to.be.false;
206
+ expect(result.diagnostics[0]?.code).to.equal("TSN5107");
207
+ });
208
+ it("unproven identifier triggers TSN5107", () => {
209
+ const module = createModuleWithIdentifierIndex({
210
+ accessKind: "clrIndexer",
211
+ indexName: "i",
212
+ indexHasInt32Type: false,
213
+ });
214
+ const result = runNumericProofPass([module]);
215
+ expect(result.ok).to.be.false;
216
+ expect(result.diagnostics[0]?.code).to.equal("TSN5107");
217
+ });
218
+ it("integer literal (0) passes and gets marker", () => {
219
+ const module = createModuleWithAccess({
220
+ accessKind: "clrIndexer",
221
+ indexHasProof: false,
222
+ indexValue: 0,
223
+ indexRaw: "0",
224
+ });
225
+ const result = runNumericProofPass([module]);
226
+ expect(result.ok).to.be.true;
227
+ expect(result.diagnostics).to.have.length(0);
228
+ // Verify marker was set
229
+ const varDecl = result.modules[0]?.body[1];
230
+ if (varDecl?.kind !== "variableDeclaration") {
231
+ throw new Error("Expected variable declaration");
232
+ }
233
+ const access = varDecl.declarations[0]?.initializer;
234
+ const indexExpr = access.property;
235
+ // Index should have primitiveType(name="int") after proof pass
236
+ expect(indexExpr.inferredType?.kind).to.equal("primitiveType");
237
+ if (indexExpr.inferredType?.kind === "primitiveType") {
238
+ expect(indexExpr.inferredType.name).to.equal("int");
239
+ }
240
+ });
241
+ it("proven identifier passes", () => {
242
+ const module = createModuleWithIdentifierIndex({
243
+ accessKind: "clrIndexer",
244
+ indexName: "i",
245
+ indexHasInt32Type: true,
246
+ });
247
+ const result = runNumericProofPass([module]);
248
+ expect(result.ok).to.be.true;
249
+ });
250
+ });
251
+ describe("jsRuntimeArray access (requires Int32 proof)", () => {
252
+ it("double literal (1.5) triggers TSN5107", () => {
253
+ const module = createModuleWithAccess({
254
+ accessKind: "jsRuntimeArray",
255
+ indexHasProof: false,
256
+ indexValue: 1.5,
257
+ indexRaw: "1.5",
258
+ });
259
+ const result = runNumericProofPass([module]);
260
+ expect(result.ok).to.be.false;
261
+ expect(result.diagnostics[0]?.code).to.equal("TSN5107");
262
+ });
263
+ it("unproven identifier triggers TSN5107", () => {
264
+ const module = createModuleWithIdentifierIndex({
265
+ accessKind: "jsRuntimeArray",
266
+ indexName: "idx",
267
+ indexHasInt32Type: false,
268
+ });
269
+ const result = runNumericProofPass([module]);
270
+ expect(result.ok).to.be.false;
271
+ expect(result.diagnostics[0]?.code).to.equal("TSN5107");
272
+ });
273
+ it("integer literal (1) passes and gets marker", () => {
274
+ const module = createModuleWithAccess({
275
+ accessKind: "jsRuntimeArray",
276
+ indexHasProof: false,
277
+ indexValue: 1,
278
+ indexRaw: "1",
279
+ });
280
+ const result = runNumericProofPass([module]);
281
+ expect(result.ok).to.be.true;
282
+ });
283
+ });
284
+ describe("stringChar access (requires Int32 proof)", () => {
285
+ it("double literal (1.5) triggers TSN5107", () => {
286
+ const module = createModuleWithAccess({
287
+ accessKind: "stringChar",
288
+ indexHasProof: false,
289
+ indexValue: 1.5,
290
+ indexRaw: "1.5",
291
+ });
292
+ const result = runNumericProofPass([module]);
293
+ expect(result.ok).to.be.false;
294
+ expect(result.diagnostics[0]?.code).to.equal("TSN5107");
295
+ });
296
+ it("unproven identifier triggers TSN5107", () => {
297
+ const module = createModuleWithIdentifierIndex({
298
+ accessKind: "stringChar",
299
+ indexName: "charIdx",
300
+ indexHasInt32Type: false,
301
+ });
302
+ const result = runNumericProofPass([module]);
303
+ expect(result.ok).to.be.false;
304
+ expect(result.diagnostics[0]?.code).to.equal("TSN5107");
305
+ });
306
+ it("integer literal (0) passes and gets marker", () => {
307
+ const module = createModuleWithAccess({
308
+ accessKind: "stringChar",
309
+ indexHasProof: false,
310
+ indexValue: 0,
311
+ indexRaw: "0",
312
+ });
313
+ const result = runNumericProofPass([module]);
314
+ expect(result.ok).to.be.true;
315
+ });
316
+ });
317
+ // ============================================================================
318
+ // ACCESS KIND THAT DOES NOT REQUIRE Int32 PROOF: dictionary
319
+ // ============================================================================
320
+ describe("dictionary access (does NOT require Int32 proof)", () => {
321
+ it("double literal passes (no TSN5107)", () => {
322
+ const module = createModuleWithAccess({
323
+ accessKind: "dictionary",
324
+ indexHasProof: false,
325
+ indexValue: 1.5,
326
+ indexRaw: "1.5",
327
+ });
328
+ const result = runNumericProofPass([module]);
329
+ expect(result.ok).to.be.true;
330
+ expect(result.diagnostics.filter((d) => d.code === "TSN5107")).to.have.length(0);
331
+ });
332
+ it("unproven identifier passes (no TSN5107)", () => {
333
+ const module = createModuleWithIdentifierIndex({
334
+ accessKind: "dictionary",
335
+ indexName: "key",
336
+ indexHasInt32Type: false,
337
+ });
338
+ const result = runNumericProofPass([module]);
339
+ expect(result.ok).to.be.true;
340
+ });
341
+ it("integer literal passes (no TSN5107)", () => {
342
+ const module = createModuleWithAccess({
343
+ accessKind: "dictionary",
344
+ indexHasProof: false,
345
+ indexValue: 0,
346
+ indexRaw: "0",
347
+ });
348
+ const result = runNumericProofPass([module]);
349
+ expect(result.ok).to.be.true;
350
+ });
351
+ });
352
+ // ============================================================================
353
+ // UNKNOWN / MISSING ACCESS KIND: TSN5109 (compiler bug)
354
+ // ============================================================================
355
+ describe("unknown/missing accessKind (TSN5109)", () => {
356
+ it("accessKind='unknown' triggers TSN5109 with debug info", () => {
357
+ const module = createModuleWithAccess({
358
+ accessKind: "unknown",
359
+ indexHasProof: false,
360
+ indexValue: 0,
361
+ indexRaw: "0",
362
+ });
363
+ const result = runNumericProofPass([module]);
364
+ expect(result.ok).to.be.false;
365
+ expect(result.diagnostics[0]?.code).to.equal("TSN5109");
366
+ // Verify message includes debug info for diagnosis
367
+ expect(result.diagnostics[0]?.message).to.include("Computed access kind was not classified");
368
+ expect(result.diagnostics[0]?.message).to.include("accessKind=unknown");
369
+ expect(result.diagnostics[0]?.message).to.include("objectType.kind=");
370
+ });
371
+ it("missing accessKind (undefined) triggers TSN5109 with debug info", () => {
372
+ // accessKind is not set at all
373
+ const module = createModuleWithAccess({
374
+ accessKind: undefined,
375
+ indexHasProof: false,
376
+ indexValue: 0,
377
+ indexRaw: "0",
378
+ });
379
+ const result = runNumericProofPass([module]);
380
+ expect(result.ok).to.be.false;
381
+ expect(result.diagnostics[0]?.code).to.equal("TSN5109");
382
+ // Verify message includes "undefined" for missing accessKind
383
+ expect(result.diagnostics[0]?.message).to.include("accessKind=undefined");
384
+ });
385
+ it("REGRESSION: referenceType without resolvedClrType defaults to clrIndexer (safe)", () => {
386
+ // This test guards against unsafe dictionary misclassification.
387
+ // If a referenceType lacks resolvedClrType, classification defaults to clrIndexer
388
+ // (not "unknown") which is SAFE: it requires Int32 proof for the index.
389
+ // This is the conservative safe behavior - Dictionary would fail at compile time
390
+ // if accessed with a non-Int32 key, which is better than runtime unsoundness.
391
+ const indexExpr = {
392
+ kind: "literal",
393
+ value: 0,
394
+ raw: "0", // Valid integer literal - should pass Int32 check
395
+ };
396
+ const memberAccess = {
397
+ kind: "memberAccess",
398
+ object: {
399
+ kind: "identifier",
400
+ name: "list",
401
+ // referenceType WITHOUT resolvedClrType (e.g., tsbindgen type)
402
+ inferredType: {
403
+ kind: "referenceType",
404
+ name: "List",
405
+ // resolvedClrType is MISSING - defaults to clrIndexer (safe)
406
+ },
407
+ },
408
+ property: indexExpr,
409
+ isComputed: true,
410
+ isOptional: false,
411
+ // accessKind is clrIndexer because classifyComputedAccess defaults to it
412
+ // when resolvedClrType is missing on a referenceType
413
+ accessKind: "clrIndexer",
414
+ inferredType: { kind: "primitiveType", name: "number" },
415
+ };
416
+ const module = {
417
+ kind: "module",
418
+ filePath: "/test/list-regression.ts",
419
+ namespace: "Test",
420
+ className: "listRegression",
421
+ isStaticContainer: true,
422
+ imports: [],
423
+ body: [
424
+ {
425
+ kind: "variableDeclaration",
426
+ declarationKind: "const",
427
+ isExported: false,
428
+ declarations: [
429
+ {
430
+ kind: "variableDeclarator",
431
+ name: { kind: "identifierPattern", name: "x" },
432
+ initializer: memberAccess,
433
+ },
434
+ ],
435
+ },
436
+ ],
437
+ exports: [],
438
+ };
439
+ const result = runNumericProofPass([module]);
440
+ // Should PASS because:
441
+ // 1. accessKind is clrIndexer (default for referenceType without resolvedClrType)
442
+ // 2. index is literal 0, which is valid Int32
443
+ expect(result.ok).to.be.true;
444
+ // Verify the index got annotated with int type
445
+ const varDecl = result.modules[0]?.body[0];
446
+ if (varDecl?.kind !== "variableDeclaration") {
447
+ throw new Error("Expected variable declaration");
448
+ }
449
+ const access = varDecl.declarations[0]?.initializer;
450
+ const processedIndex = access.property;
451
+ // Index should have primitiveType(name="int") after proof pass
452
+ expect(processedIndex.inferredType?.kind).to.equal("primitiveType");
453
+ if (processedIndex.inferredType?.kind === "primitiveType") {
454
+ expect(processedIndex.inferredType.name).to.equal("int");
455
+ }
456
+ });
457
+ });
458
+ // ============================================================================
459
+ // EMITTER CONTRACT: ICE when proof marker missing
460
+ // ============================================================================
461
+ describe("Emitter contract enforcement", () => {
462
+ it("emits without ICE when proof marker present", () => {
463
+ const module = createModuleWithAccess({
464
+ accessKind: "clrIndexer",
465
+ indexHasProof: true, // Pre-annotated with Int32 proof
466
+ indexValue: 0,
467
+ indexRaw: "0",
468
+ });
469
+ // Should not throw - proof marker is present
470
+ expect(() => emitModule(module, { runtime: "dotnet" })).to.not.throw();
471
+ });
472
+ it("ICE when proof marker missing - even for literal 0", () => {
473
+ // REGRESSION GUARD: This test ensures nobody "helpfully" re-adds
474
+ // literal parsing to the emitter. Even literal 0 must have the proof
475
+ // marker set by the proof pass, or the emitter ICEs.
476
+ const module = createModuleWithAccess({
477
+ accessKind: "clrIndexer",
478
+ indexHasProof: false, // NO proof marker
479
+ indexValue: 0, // Even though it's 0
480
+ indexRaw: "0",
481
+ });
482
+ // Emitter should ICE because proof marker is missing
483
+ expect(() => emitModule(module, { runtime: "dotnet" })).to.throw(/Internal Compiler Error.*Int32 proof/);
484
+ });
485
+ it("ICE when proof marker missing - even for literal 1", () => {
486
+ // REGRESSION GUARD: Same as above for literal 1
487
+ const module = createModuleWithAccess({
488
+ accessKind: "clrIndexer",
489
+ indexHasProof: false,
490
+ indexValue: 1,
491
+ indexRaw: "1",
492
+ });
493
+ expect(() => emitModule(module, { runtime: "dotnet" })).to.throw(/Internal Compiler Error.*Int32 proof/);
494
+ });
495
+ });
496
+ // ============================================================================
497
+ // PROOF PASS ANNOTATION: Markers set correctly for all access kinds
498
+ // ============================================================================
499
+ describe("Proof pass annotation", () => {
500
+ it("clrIndexer: valid index gets primitiveType(name='int')", () => {
501
+ const module = createModuleWithAccess({
502
+ accessKind: "clrIndexer",
503
+ indexHasProof: false,
504
+ indexValue: 0,
505
+ indexRaw: "0",
506
+ });
507
+ const result = runNumericProofPass([module]);
508
+ expect(result.ok).to.be.true;
509
+ const varDecl = result.modules[0]?.body[1];
510
+ if (varDecl?.kind !== "variableDeclaration") {
511
+ throw new Error("Expected variable declaration");
512
+ }
513
+ const access = varDecl.declarations[0]?.initializer;
514
+ const indexExpr = access.property;
515
+ // Index should have primitiveType(name="int") after proof pass
516
+ expect(indexExpr.inferredType?.kind).to.equal("primitiveType");
517
+ if (indexExpr.inferredType?.kind === "primitiveType") {
518
+ expect(indexExpr.inferredType.name).to.equal("int");
519
+ }
520
+ });
521
+ it("jsRuntimeArray: valid index gets primitiveType(name='int')", () => {
522
+ const module = createModuleWithAccess({
523
+ accessKind: "jsRuntimeArray",
524
+ indexHasProof: false,
525
+ indexValue: 5,
526
+ indexRaw: "5",
527
+ });
528
+ const result = runNumericProofPass([module]);
529
+ expect(result.ok).to.be.true;
530
+ const varDecl = result.modules[0]?.body[1];
531
+ if (varDecl?.kind !== "variableDeclaration") {
532
+ throw new Error("Expected variable declaration");
533
+ }
534
+ const access = varDecl.declarations[0]?.initializer;
535
+ const indexExpr = access.property;
536
+ // Index should have primitiveType(name="int") after proof pass
537
+ expect(indexExpr.inferredType?.kind).to.equal("primitiveType");
538
+ if (indexExpr.inferredType?.kind === "primitiveType") {
539
+ expect(indexExpr.inferredType.name).to.equal("int");
540
+ }
541
+ });
542
+ it("stringChar: valid index gets primitiveType(name='int')", () => {
543
+ const module = createModuleWithAccess({
544
+ accessKind: "stringChar",
545
+ indexHasProof: false,
546
+ indexValue: 2,
547
+ indexRaw: "2",
548
+ });
549
+ const result = runNumericProofPass([module]);
550
+ expect(result.ok).to.be.true;
551
+ const varDecl = result.modules[0]?.body[1];
552
+ if (varDecl?.kind !== "variableDeclaration") {
553
+ throw new Error("Expected variable declaration");
554
+ }
555
+ const access = varDecl.declarations[0]?.initializer;
556
+ const indexExpr = access.property;
557
+ // Index should have primitiveType(name="int") after proof pass
558
+ expect(indexExpr.inferredType?.kind).to.equal("primitiveType");
559
+ if (indexExpr.inferredType?.kind === "primitiveType") {
560
+ expect(indexExpr.inferredType.name).to.equal("int");
561
+ }
562
+ });
563
+ });
564
+ });
565
+ //# sourceMappingURL=numeric-proof-contract.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numeric-proof-contract.test.js","sourceRoot":"","sources":["../../src/invariants/numeric-proof-contract.test.ts"],"names":[],"mappings":"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"}