c-next 0.1.65 → 0.1.67
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.
- package/package.json +5 -1
- package/src/transpiler/Transpiler.ts +49 -42
- package/src/transpiler/logic/symbols/cnext/__tests__/TSymbolAdapter.test.ts +129 -0
- package/src/transpiler/logic/symbols/cnext/adapters/TSymbolAdapter.ts +27 -3
- package/src/transpiler/output/codegen/CodeGenerator.ts +131 -186
- package/src/transpiler/output/codegen/TypeResolver.ts +2 -2
- package/src/transpiler/output/codegen/TypeValidator.ts +1 -1
- package/src/transpiler/output/codegen/__tests__/CodeGenerator.coverage.test.ts +1087 -0
- package/src/transpiler/output/codegen/__tests__/CodeGenerator.test.ts +665 -1315
- package/src/transpiler/output/codegen/__tests__/TypeResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/__tests__/TypeValidator.resolution.test.ts +1 -1
- package/src/transpiler/output/codegen/__tests__/TypeValidator.test.ts +1 -1
- package/src/transpiler/output/codegen/analysis/MemberChainAnalyzer.ts +1 -1
- package/src/transpiler/output/codegen/analysis/StringLengthCounter.ts +1 -1
- package/src/transpiler/output/codegen/analysis/__tests__/MemberChainAnalyzer.test.ts +1 -1
- package/src/transpiler/output/codegen/analysis/__tests__/StringLengthCounter.test.ts +1 -1
- package/src/transpiler/output/codegen/assignment/AssignmentClassifier.ts +1 -1
- package/src/transpiler/output/codegen/assignment/__tests__/AssignmentClassifier.test.ts +1 -1
- package/src/transpiler/output/codegen/assignment/handlers/AccessPatternHandlers.ts +24 -27
- package/src/transpiler/output/codegen/assignment/handlers/ArrayHandlers.ts +25 -18
- package/src/transpiler/output/codegen/assignment/handlers/BitAccessHandlers.ts +27 -33
- package/src/transpiler/output/codegen/assignment/handlers/BitmapHandlers.ts +39 -42
- package/src/transpiler/output/codegen/assignment/handlers/RegisterHandlers.ts +39 -97
- package/src/transpiler/output/codegen/assignment/handlers/RegisterUtils.ts +75 -0
- package/src/transpiler/output/codegen/assignment/handlers/SimpleHandler.ts +9 -6
- package/src/transpiler/output/codegen/assignment/handlers/SpecialHandlers.ts +30 -22
- package/src/transpiler/output/codegen/assignment/handlers/StringHandlers.ts +42 -50
- package/src/transpiler/output/codegen/assignment/handlers/TAssignmentHandler.ts +6 -5
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/AccessPatternHandlers.test.ts +81 -134
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/ArrayHandlers.test.ts +85 -124
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitAccessHandlers.test.ts +82 -124
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/BitmapHandlers.test.ts +135 -297
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/RegisterHandlers.test.ts +105 -227
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/RegisterUtils.test.ts +214 -1
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/SpecialHandlers.test.ts +66 -127
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/StringHandlers.test.ts +37 -83
- package/src/transpiler/output/codegen/assignment/handlers/__tests__/handlerTestUtils.ts +162 -0
- package/src/transpiler/output/codegen/generators/expressions/PostfixExpressionGenerator.ts +618 -12
- package/src/transpiler/output/codegen/generators/expressions/__tests__/PostfixExpressionGenerator.test.ts +819 -0
- package/src/transpiler/output/codegen/helpers/ArrayInitHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/AssignmentExpectedTypeResolver.ts +1 -1
- package/src/transpiler/output/codegen/helpers/AssignmentValidator.ts +1 -1
- package/src/transpiler/output/codegen/helpers/CppModeHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/EnumAssignmentValidator.ts +1 -1
- package/src/transpiler/output/codegen/helpers/FloatBitHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/ParameterInputAdapter.ts +337 -0
- package/src/transpiler/output/codegen/helpers/ParameterSignatureBuilder.ts +135 -0
- package/src/transpiler/output/codegen/helpers/StringDeclHelper.ts +1 -1
- package/src/transpiler/output/codegen/helpers/VariableDeclarationFormatter.ts +118 -0
- package/src/transpiler/output/codegen/helpers/__tests__/ArrayInitHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/AssignmentExpectedTypeResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/AssignmentValidator.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/CppModeHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/EnumAssignmentValidator.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/FloatBitHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/ParameterInputAdapter.test.ts +426 -0
- package/src/transpiler/output/codegen/helpers/__tests__/ParameterSignatureBuilder.test.ts +315 -0
- package/src/transpiler/output/codegen/helpers/__tests__/StringDeclHelper.test.ts +1 -1
- package/src/transpiler/output/codegen/helpers/__tests__/VariableDeclarationFormatter.test.ts +333 -0
- package/src/transpiler/output/codegen/resolution/EnumTypeResolver.ts +1 -1
- package/src/transpiler/output/codegen/resolution/ScopeResolver.ts +1 -1
- package/src/transpiler/output/codegen/resolution/SizeofResolver.ts +1 -1
- package/src/transpiler/output/codegen/resolution/__tests__/EnumTypeResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/resolution/__tests__/SizeofResolver.test.ts +1 -1
- package/src/transpiler/output/codegen/types/ICodeGenApi.ts +57 -0
- package/src/transpiler/output/codegen/types/IParameterInput.ts +58 -0
- package/src/transpiler/output/codegen/types/IVariableFormatInput.ts +51 -0
- package/src/transpiler/output/headers/BaseHeaderGenerator.ts +20 -35
- package/src/transpiler/output/headers/HeaderGeneratorUtils.ts +21 -48
- package/src/transpiler/output/headers/__tests__/HeaderGeneratorUtils.test.ts +0 -64
- package/src/transpiler/{output/codegen → state}/CodeGenState.ts +46 -26
- package/src/transpiler/{output/codegen → state}/__tests__/CodeGenState.test.ts +12 -2
- package/src/transpiler/output/codegen/assignment/handlers/IHandlerDeps.ts +0 -161
|
@@ -3,40 +3,12 @@
|
|
|
3
3
|
* Tests the string assignment handler functions.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { describe, expect, it
|
|
6
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
7
7
|
import stringHandlers from "../StringHandlers";
|
|
8
8
|
import AssignmentKind from "../../AssignmentKind";
|
|
9
9
|
import IAssignmentContext from "../../IAssignmentContext";
|
|
10
|
-
import
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Create mock dependencies for testing.
|
|
14
|
-
* Uses type casting to allow partial mocks for testing.
|
|
15
|
-
*/
|
|
16
|
-
function createMockDeps(overrides: Record<string, unknown> = {}): IHandlerDeps {
|
|
17
|
-
const base = {
|
|
18
|
-
typeRegistry: new Map(),
|
|
19
|
-
symbols: {
|
|
20
|
-
structFields: new Map(),
|
|
21
|
-
structFieldDimensions: new Map(),
|
|
22
|
-
registerMemberAccess: new Map(),
|
|
23
|
-
registerBaseAddresses: new Map(),
|
|
24
|
-
registerMemberOffsets: new Map(),
|
|
25
|
-
},
|
|
26
|
-
currentScope: undefined,
|
|
27
|
-
generateAssignmentTarget: vi.fn().mockReturnValue("target"),
|
|
28
|
-
generateExpression: vi.fn().mockReturnValue("0"),
|
|
29
|
-
markNeedsString: vi.fn(),
|
|
30
|
-
isKnownScope: vi.fn().mockReturnValue(false),
|
|
31
|
-
validateCrossScopeVisibility: vi.fn(),
|
|
32
|
-
analyzeMemberChainForBitAccess: vi.fn().mockReturnValue({
|
|
33
|
-
isBitAccess: false,
|
|
34
|
-
}),
|
|
35
|
-
tryEvaluateConstant: vi.fn().mockReturnValue(undefined),
|
|
36
|
-
...overrides,
|
|
37
|
-
};
|
|
38
|
-
return base as unknown as IHandlerDeps;
|
|
39
|
-
}
|
|
10
|
+
import CodeGenState from "../../../../../state/CodeGenState";
|
|
11
|
+
import HandlerTestUtils from "./handlerTestUtils";
|
|
40
12
|
|
|
41
13
|
/**
|
|
42
14
|
* Create mock context for testing
|
|
@@ -57,6 +29,12 @@ function createMockContext(
|
|
|
57
29
|
}
|
|
58
30
|
|
|
59
31
|
describe("StringHandlers", () => {
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
CodeGenState.reset();
|
|
34
|
+
HandlerTestUtils.setupMockGenerator();
|
|
35
|
+
HandlerTestUtils.setupMockSymbols();
|
|
36
|
+
});
|
|
37
|
+
|
|
60
38
|
describe("handler registration", () => {
|
|
61
39
|
it("registers all expected string assignment kinds", () => {
|
|
62
40
|
const kinds = stringHandlers.map(([kind]) => kind);
|
|
@@ -83,35 +61,33 @@ describe("StringHandlers", () => {
|
|
|
83
61
|
|
|
84
62
|
describe("handleSimpleStringAssignment (STRING_SIMPLE)", () => {
|
|
85
63
|
it("generates strncpy with null terminator", () => {
|
|
86
|
-
|
|
64
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
87
65
|
["testVar", { stringCapacity: 32, baseType: "string" }],
|
|
88
66
|
]);
|
|
89
|
-
const deps = createMockDeps({ typeRegistry });
|
|
90
67
|
const ctx = createMockContext();
|
|
91
68
|
|
|
92
69
|
const handler = stringHandlers.find(
|
|
93
70
|
([kind]) => kind === AssignmentKind.STRING_SIMPLE,
|
|
94
71
|
)?.[1];
|
|
95
|
-
const result = handler!(ctx
|
|
72
|
+
const result = handler!(ctx);
|
|
96
73
|
|
|
97
74
|
expect(result).toContain("strncpy");
|
|
98
75
|
expect(result).toContain("target");
|
|
99
76
|
expect(result).toContain("32");
|
|
100
|
-
expect(
|
|
77
|
+
expect(CodeGenState.needsString).toBe(true);
|
|
101
78
|
});
|
|
102
79
|
|
|
103
80
|
it("throws on compound assignment", () => {
|
|
104
|
-
|
|
81
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
105
82
|
["testVar", { stringCapacity: 32, baseType: "string" }],
|
|
106
83
|
]);
|
|
107
|
-
const deps = createMockDeps({ typeRegistry });
|
|
108
84
|
const ctx = createMockContext({ isCompound: true, cnextOp: "+<-" });
|
|
109
85
|
|
|
110
86
|
const handler = stringHandlers.find(
|
|
111
87
|
([kind]) => kind === AssignmentKind.STRING_SIMPLE,
|
|
112
88
|
)?.[1];
|
|
113
89
|
|
|
114
|
-
expect(() => handler!(ctx
|
|
90
|
+
expect(() => handler!(ctx)).toThrow(
|
|
115
91
|
"Compound operators not supported for string assignment",
|
|
116
92
|
);
|
|
117
93
|
});
|
|
@@ -119,34 +95,31 @@ describe("StringHandlers", () => {
|
|
|
119
95
|
|
|
120
96
|
describe("handleStringThisMember (STRING_THIS_MEMBER)", () => {
|
|
121
97
|
it("generates strncpy for scoped member", () => {
|
|
122
|
-
|
|
98
|
+
CodeGenState.currentScope = "TestScope";
|
|
99
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
123
100
|
["TestScope_memberName", { stringCapacity: 64, baseType: "string" }],
|
|
124
101
|
]);
|
|
125
|
-
const deps = createMockDeps({
|
|
126
|
-
typeRegistry,
|
|
127
|
-
currentScope: "TestScope",
|
|
128
|
-
});
|
|
129
102
|
const ctx = createMockContext({ identifiers: ["memberName"] });
|
|
130
103
|
|
|
131
104
|
const handler = stringHandlers.find(
|
|
132
105
|
([kind]) => kind === AssignmentKind.STRING_THIS_MEMBER,
|
|
133
106
|
)?.[1];
|
|
134
|
-
const result = handler!(ctx
|
|
107
|
+
const result = handler!(ctx);
|
|
135
108
|
|
|
136
109
|
expect(result).toContain("strncpy");
|
|
137
110
|
expect(result).toContain("64");
|
|
138
|
-
expect(
|
|
111
|
+
expect(CodeGenState.needsString).toBe(true);
|
|
139
112
|
});
|
|
140
113
|
|
|
141
114
|
it("throws when used outside scope", () => {
|
|
142
|
-
|
|
115
|
+
CodeGenState.currentScope = null;
|
|
143
116
|
const ctx = createMockContext();
|
|
144
117
|
|
|
145
118
|
const handler = stringHandlers.find(
|
|
146
119
|
([kind]) => kind === AssignmentKind.STRING_THIS_MEMBER,
|
|
147
120
|
)?.[1];
|
|
148
121
|
|
|
149
|
-
expect(() => handler!(ctx
|
|
122
|
+
expect(() => handler!(ctx)).toThrow(
|
|
150
123
|
"'this' can only be used inside a scope",
|
|
151
124
|
);
|
|
152
125
|
});
|
|
@@ -154,42 +127,31 @@ describe("StringHandlers", () => {
|
|
|
154
127
|
|
|
155
128
|
describe("handleStringStructField (STRING_STRUCT_FIELD)", () => {
|
|
156
129
|
it("generates strncpy for struct field", () => {
|
|
157
|
-
|
|
158
|
-
["person", { baseType: "Person"
|
|
130
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
131
|
+
["person", { baseType: "Person" }],
|
|
159
132
|
]);
|
|
160
|
-
|
|
161
|
-
["Person", new Map([["name", "string<50>"]])],
|
|
162
|
-
]);
|
|
163
|
-
const deps = createMockDeps({
|
|
164
|
-
typeRegistry,
|
|
165
|
-
symbols: {
|
|
166
|
-
structFields,
|
|
167
|
-
structFieldDimensions: new Map(),
|
|
168
|
-
registerMemberAccess: new Map(),
|
|
169
|
-
registerBaseAddresses: new Map(),
|
|
170
|
-
registerMemberOffsets: new Map(),
|
|
171
|
-
},
|
|
133
|
+
HandlerTestUtils.setupMockSymbols({
|
|
134
|
+
structFields: new Map([["Person", new Map([["name", "string<50>"]])]]),
|
|
172
135
|
});
|
|
173
136
|
const ctx = createMockContext({ identifiers: ["person", "name"] });
|
|
174
137
|
|
|
175
138
|
const handler = stringHandlers.find(
|
|
176
139
|
([kind]) => kind === AssignmentKind.STRING_STRUCT_FIELD,
|
|
177
140
|
)?.[1];
|
|
178
|
-
const result = handler!(ctx
|
|
141
|
+
const result = handler!(ctx);
|
|
179
142
|
|
|
180
143
|
expect(result).toContain("strncpy");
|
|
181
144
|
expect(result).toContain("person");
|
|
182
145
|
expect(result).toContain("name");
|
|
183
|
-
expect(
|
|
146
|
+
expect(CodeGenState.needsString).toBe(true);
|
|
184
147
|
});
|
|
185
148
|
});
|
|
186
149
|
|
|
187
150
|
describe("handleStringArrayElement (STRING_ARRAY_ELEMENT)", () => {
|
|
188
151
|
it("generates strncpy for array element", () => {
|
|
189
|
-
|
|
152
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
190
153
|
["names", { stringCapacity: 20, baseType: "string" }],
|
|
191
154
|
]);
|
|
192
|
-
const deps = createMockDeps({ typeRegistry });
|
|
193
155
|
const ctx = createMockContext({
|
|
194
156
|
identifiers: ["names"],
|
|
195
157
|
subscripts: [{} as never],
|
|
@@ -198,32 +160,24 @@ describe("StringHandlers", () => {
|
|
|
198
160
|
const handler = stringHandlers.find(
|
|
199
161
|
([kind]) => kind === AssignmentKind.STRING_ARRAY_ELEMENT,
|
|
200
162
|
)?.[1];
|
|
201
|
-
const result = handler!(ctx
|
|
163
|
+
const result = handler!(ctx);
|
|
202
164
|
|
|
203
165
|
expect(result).toContain("strncpy");
|
|
204
166
|
expect(result).toContain("names");
|
|
205
167
|
expect(result).toContain("20");
|
|
206
|
-
expect(
|
|
168
|
+
expect(CodeGenState.needsString).toBe(true);
|
|
207
169
|
});
|
|
208
170
|
});
|
|
209
171
|
|
|
210
172
|
describe("handleStringStructArrayElement (STRING_STRUCT_ARRAY_ELEMENT)", () => {
|
|
211
173
|
it("generates strncpy for struct field array element", () => {
|
|
212
|
-
|
|
213
|
-
["config", { baseType: "Config"
|
|
214
|
-
]);
|
|
215
|
-
const structFieldDimensions = new Map([
|
|
216
|
-
["Config", new Map([["items", [10, 33]]])], // 10 items, capacity 32+1
|
|
174
|
+
HandlerTestUtils.setupMockTypeRegistry([
|
|
175
|
+
["config", { baseType: "Config" }],
|
|
217
176
|
]);
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
structFieldDimensions,
|
|
223
|
-
registerMemberAccess: new Map(),
|
|
224
|
-
registerBaseAddresses: new Map(),
|
|
225
|
-
registerMemberOffsets: new Map(),
|
|
226
|
-
},
|
|
177
|
+
HandlerTestUtils.setupMockSymbols({
|
|
178
|
+
structFieldDimensions: new Map([
|
|
179
|
+
["Config", new Map([["items", [10, 33]]])], // 10 items, capacity 32+1
|
|
180
|
+
]),
|
|
227
181
|
});
|
|
228
182
|
const ctx = createMockContext({
|
|
229
183
|
identifiers: ["config", "items"],
|
|
@@ -233,14 +187,14 @@ describe("StringHandlers", () => {
|
|
|
233
187
|
const handler = stringHandlers.find(
|
|
234
188
|
([kind]) => kind === AssignmentKind.STRING_STRUCT_ARRAY_ELEMENT,
|
|
235
189
|
)?.[1];
|
|
236
|
-
const result = handler!(ctx
|
|
190
|
+
const result = handler!(ctx);
|
|
237
191
|
|
|
238
192
|
expect(result).toContain("strncpy");
|
|
239
193
|
expect(result).toContain("config");
|
|
240
194
|
expect(result).toContain("items");
|
|
241
195
|
// Capacity should be 33 - 1 = 32
|
|
242
196
|
expect(result).toContain("32");
|
|
243
|
-
expect(
|
|
197
|
+
expect(CodeGenState.needsString).toBe(true);
|
|
244
198
|
});
|
|
245
199
|
});
|
|
246
200
|
});
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared test utilities for assignment handler tests.
|
|
3
|
+
* Provides common mock setup functions to reduce duplication.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { vi } from "vitest";
|
|
7
|
+
import CodeGenState from "../../../../../state/CodeGenState";
|
|
8
|
+
import type ICodeGenApi from "../../../types/ICodeGenApi";
|
|
9
|
+
import type ICodeGenSymbols from "../../../../../types/ICodeGenSymbols";
|
|
10
|
+
import type TTypeInfo from "../../../types/TTypeInfo";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Default mock symbols with all required ICodeGenSymbols fields.
|
|
14
|
+
* Override specific fields as needed for individual tests.
|
|
15
|
+
*/
|
|
16
|
+
function createDefaultMockSymbols(): ICodeGenSymbols {
|
|
17
|
+
return {
|
|
18
|
+
// Known type names
|
|
19
|
+
knownScopes: new Set(),
|
|
20
|
+
knownStructs: new Set(),
|
|
21
|
+
knownRegisters: new Set(),
|
|
22
|
+
knownEnums: new Set(),
|
|
23
|
+
knownBitmaps: new Set(),
|
|
24
|
+
|
|
25
|
+
// Scope information
|
|
26
|
+
scopeMembers: new Map(),
|
|
27
|
+
scopeMemberVisibility: new Map(),
|
|
28
|
+
|
|
29
|
+
// Struct information
|
|
30
|
+
structFields: new Map(),
|
|
31
|
+
structFieldArrays: new Map(),
|
|
32
|
+
structFieldDimensions: new Map(),
|
|
33
|
+
|
|
34
|
+
// Enum information
|
|
35
|
+
enumMembers: new Map(),
|
|
36
|
+
|
|
37
|
+
// Bitmap information
|
|
38
|
+
bitmapFields: new Map(),
|
|
39
|
+
bitmapBackingType: new Map(),
|
|
40
|
+
bitmapBitWidth: new Map(),
|
|
41
|
+
|
|
42
|
+
// Register information
|
|
43
|
+
scopedRegisters: new Map(),
|
|
44
|
+
registerMemberAccess: new Map(),
|
|
45
|
+
registerMemberTypes: new Map(),
|
|
46
|
+
registerBaseAddresses: new Map(),
|
|
47
|
+
registerMemberOffsets: new Map(),
|
|
48
|
+
registerMemberCTypes: new Map(),
|
|
49
|
+
|
|
50
|
+
// Scope variable analysis
|
|
51
|
+
scopeVariableUsage: new Map(),
|
|
52
|
+
scopePrivateConstValues: new Map(),
|
|
53
|
+
|
|
54
|
+
// Function return types
|
|
55
|
+
functionReturnTypes: new Map(),
|
|
56
|
+
|
|
57
|
+
// Methods
|
|
58
|
+
getSingleFunctionForVariable: () => null,
|
|
59
|
+
hasPublicSymbols: () => false,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Set up mock symbols on CodeGenState.
|
|
65
|
+
* Provides comprehensive defaults that can be overridden.
|
|
66
|
+
*/
|
|
67
|
+
function setupMockSymbols(overrides: Partial<ICodeGenSymbols> = {}): void {
|
|
68
|
+
CodeGenState.symbols = {
|
|
69
|
+
...createDefaultMockSymbols(),
|
|
70
|
+
...overrides,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Set up mock generator on CodeGenState.
|
|
76
|
+
* Common generator methods are pre-mocked with sensible defaults.
|
|
77
|
+
*/
|
|
78
|
+
function setupMockGenerator(overrides: Record<string, unknown> = {}): void {
|
|
79
|
+
CodeGenState.generator = {
|
|
80
|
+
generateAssignmentTarget: vi.fn().mockReturnValue("target"),
|
|
81
|
+
generateExpression: vi
|
|
82
|
+
.fn()
|
|
83
|
+
.mockImplementation((ctx) => ctx?.mockValue ?? "0"),
|
|
84
|
+
tryEvaluateConstant: vi.fn().mockReturnValue(undefined),
|
|
85
|
+
validateBitmapFieldLiteral: vi.fn(),
|
|
86
|
+
validateCrossScopeVisibility: vi.fn(),
|
|
87
|
+
getMemberTypeInfo: vi.fn().mockReturnValue(null),
|
|
88
|
+
checkArrayBounds: vi.fn(),
|
|
89
|
+
analyzeMemberChainForBitAccess: vi
|
|
90
|
+
.fn()
|
|
91
|
+
.mockReturnValue({ isBitAccess: false }),
|
|
92
|
+
generateFloatBitWrite: vi.fn().mockReturnValue(null),
|
|
93
|
+
generateAtomicRMW: vi.fn().mockReturnValue("atomic_rmw_result"),
|
|
94
|
+
isKnownScope: vi.fn().mockReturnValue(false),
|
|
95
|
+
isKnownStruct: vi.fn().mockReturnValue(false),
|
|
96
|
+
...overrides,
|
|
97
|
+
} as unknown as ICodeGenApi;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Combined setup for both symbols and generator.
|
|
102
|
+
* Convenience function for tests that need both.
|
|
103
|
+
*/
|
|
104
|
+
function setupMockState(
|
|
105
|
+
symbolOverrides: Partial<ICodeGenSymbols> = {},
|
|
106
|
+
generatorOverrides: Record<string, unknown> = {},
|
|
107
|
+
): void {
|
|
108
|
+
setupMockSymbols(symbolOverrides);
|
|
109
|
+
setupMockGenerator(generatorOverrides);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Common type bit widths for test mocks */
|
|
113
|
+
const TYPE_BIT_WIDTHS: Record<string, number> = {
|
|
114
|
+
u8: 8,
|
|
115
|
+
i8: 8,
|
|
116
|
+
u16: 16,
|
|
117
|
+
i16: 16,
|
|
118
|
+
u32: 32,
|
|
119
|
+
i32: 32,
|
|
120
|
+
u64: 64,
|
|
121
|
+
i64: 64,
|
|
122
|
+
f32: 32,
|
|
123
|
+
f64: 64,
|
|
124
|
+
bool: 1,
|
|
125
|
+
string: 0,
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Create a TTypeInfo with sensible defaults.
|
|
130
|
+
* Only override the fields you care about in tests.
|
|
131
|
+
*/
|
|
132
|
+
function createTypeInfo(overrides: Partial<TTypeInfo> = {}): TTypeInfo {
|
|
133
|
+
const baseType = overrides.baseType ?? "u32";
|
|
134
|
+
return {
|
|
135
|
+
baseType,
|
|
136
|
+
bitWidth: overrides.bitWidth ?? TYPE_BIT_WIDTHS[baseType] ?? 32,
|
|
137
|
+
isArray: overrides.isArray ?? false,
|
|
138
|
+
isConst: overrides.isConst ?? false,
|
|
139
|
+
...overrides,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Set up CodeGenState.typeRegistry with typed entries.
|
|
145
|
+
* Entries only need to specify the fields relevant to the test.
|
|
146
|
+
*/
|
|
147
|
+
function setupMockTypeRegistry(
|
|
148
|
+
entries: Array<[string, Partial<TTypeInfo>]>,
|
|
149
|
+
): void {
|
|
150
|
+
CodeGenState.typeRegistry = new Map(
|
|
151
|
+
entries.map(([name, partial]) => [name, createTypeInfo(partial)]),
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export default class HandlerTestUtils {
|
|
156
|
+
static readonly setupMockSymbols = setupMockSymbols;
|
|
157
|
+
static readonly setupMockGenerator = setupMockGenerator;
|
|
158
|
+
static readonly setupMockState = setupMockState;
|
|
159
|
+
static readonly createDefaultMockSymbols = createDefaultMockSymbols;
|
|
160
|
+
static readonly createTypeInfo = createTypeInfo;
|
|
161
|
+
static readonly setupMockTypeRegistry = setupMockTypeRegistry;
|
|
162
|
+
}
|