-
Notifications
You must be signed in to change notification settings - Fork 68
Expand file tree
/
Copy pathbslibInline.spec.ts
More file actions
199 lines (163 loc) · 7.44 KB
/
Copy pathbslibInline.spec.ts
File metadata and controls
199 lines (163 loc) · 7.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
import { expect } from './chai-config.spec';
import { Program } from './Program';
describe('BslibInline', () => {
describe('configuration', () => {
it('should use shared mode by default', () => {
const program = new Program({});
expect(program.options.bslibHandling?.mode).to.equal('shared');
});
it('should use md5 strategy by default for unique-per-file', () => {
const program = new Program({
bslibHandling: {
mode: 'unique-per-file'
}
});
expect(program.options.bslibHandling?.uniqueStrategy).to.equal('md5');
});
});
describe('shared mode', () => {
it('should not inline functions in shared mode', () => {
const program = new Program({
bslibHandling: {
mode: 'shared'
}
});
program.setFile('source/main.bs', `
function main()
message = \`Hello \${m.top.name}\`
result = true ? "yes" : "no"
fallback = value ?? "default"
end function
`);
const file = program.getFile('source/main.bs') as any;
const result = program['_getTranspiledFileContents'](file);
// Should use regular bslib function calls without suffix
expect(result.code).to.include('bslib_toString(');
expect(result.code).to.include('bslib_coalesce(');
// Note: Simple ternary expressions expand to if/else instead of using bslib_ternary
// Should not contain inline function definitions
expect(result.code).to.not.include('function bslib_toString');
expect(result.code).to.not.include('function bslib_ternary');
expect(result.code).to.not.include('function bslib_coalesce');
program.dispose();
});
});
describe('unique-per-file mode', () => {
it('should inline only used bslib functions', () => {
const program = new Program({
bslibHandling: {
mode: 'unique-per-file',
uniqueStrategy: 'md5'
}
});
program.setFile('source/main.bs', `
function main()
message = \`Hello \${m.top.name}\`
end function
`);
const file = program.getFile('source/main.bs') as any;
const result = program['_getTranspiledFileContents'](file);
// Should contain inline toString function with unique suffix
expect(result.code).to.include('bslib_toString_');
expect(result.code).to.include('function bslib_toString_');
// Should not contain unused functions
expect(result.code).to.not.include('function bslib_ternary_');
expect(result.code).to.not.include('function bslib_coalesce_');
program.dispose();
});
it('should inline multiple bslib functions when used', () => {
const program = new Program({
bslibHandling: {
mode: 'unique-per-file',
uniqueStrategy: 'md5'
}
});
program.setFile('source/main.bs', `
function main()
message = \`Hello \${m.top.name}\`
result = true ? "yes" : "no"
fallback = value ?? "default"
end function
`);
const file = program.getFile('source/main.bs') as any;
const result = program['_getTranspiledFileContents'](file);
// Should contain inline functions with same unique suffix
const toStringMatch = result.code.match(/bslib_toString_([a-f0-9]+)/);
const coalesceMatch = result.code.match(/bslib_coalesce_([a-f0-9]+)/);
expect(toStringMatch).to.not.be.null;
expect(coalesceMatch).to.not.be.null;
// All functions should have the same suffix
expect(toStringMatch![1]).to.equal(coalesceMatch![1]);
// Should contain function definitions
expect(result.code).to.include('function bslib_toString_');
expect(result.code).to.include('function bslib_coalesce_');
// Note: Simple ternary expressions expand to if/else, so no bslib_ternary function needed
program.dispose();
});
it('should not include unused bslib functions in output', () => {
const program = new Program({
bslibHandling: {
mode: 'unique-per-file'
}
});
program.setFile('source/main.bs', `
function main()
print "No bslib functions used"
end function
`);
const file = program.getFile('source/main.bs') as any;
const result = program['_getTranspiledFileContents'](file);
// Should not contain any bslib function definitions
expect(result.code).to.not.include('function bslib_');
expect(result.code).to.not.include('bslib_toString');
expect(result.code).to.not.include('bslib_ternary');
expect(result.code).to.not.include('bslib_coalesce');
program.dispose();
});
it('should validate that inlined functions work correctly', () => {
const program = new Program({
bslibHandling: {
mode: 'unique-per-file'
}
});
program.setFile('source/main.bs', `
function main()
message = \`Hello \${m.top.name}\`
result = true ? "yes" : "no"
fallback = value ?? "default"
end function
`);
const file = program.getFile('source/main.bs') as any;
const result = program['_getTranspiledFileContents'](file);
// Verify the transpiled output contains the expected structure
expect(result.code).to.include('function main()');
expect(result.code).to.include('message = ("Hello " + bslib_toString_');
expect(result.code).to.include('fallback = bslib_coalesce_');
expect(result.code).to.include('end function');
// Note: Simple ternary expressions expand to if/else, so result uses if/then/else/end if
program.dispose();
});
});
describe('XML file handling', () => {
it('should handle XML transpilation in unique-per-file mode', () => {
// For now, just test that the mode is correctly set
const program = new Program({
bslibHandling: {
mode: 'unique-per-file'
}
});
expect(program.options.bslibHandling?.mode).to.equal('unique-per-file');
program.dispose();
});
it('should handle XML transpilation in shared mode', () => {
// For now, just test that the mode is correctly set
const program = new Program({
bslibHandling: {
mode: 'shared'
}
});
expect(program.options.bslibHandling?.mode).to.equal('shared');
program.dispose();
});
});
});