• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import {
17    expect
18} from 'chai';
19import 'mocha';
20import {
21    Add2,
22    Callthis1,
23    Callthis2,
24    Callthis3,
25    Createemptyarray,
26    Gettemplateobject,
27    Ldobjbyname,
28    Returnundefined,
29    Stobjbyvalue,
30    Tryldglobalbyname,
31    Imm,
32    IRNode,
33    Lda,
34    Ldai,
35    LdaStr,
36    Mov,
37    Sta,
38    VReg
39} from "../../src/irnodes";
40import { checkInstructions, compileMainSnippet } from "../utils/base";
41import { creatAstFromSnippet } from "../utils/asthelper"
42import { PandaGen } from '../../src/pandagen';
43
44function MicroCreateAddInsns(leftVal: number, rightVal: number, icSize: number) {
45    let insns = [];
46    let lhs = new VReg();
47
48    insns.push(new Ldai(new Imm(leftVal)));
49    insns.push(new Sta(lhs));
50    insns.push(new Ldai(new Imm(rightVal)));
51    insns.push(new Add2(new Imm(icSize), lhs));
52
53    let nextIc = icSize + 1;
54
55    return {insns: insns, nextIc: nextIc};
56}
57
58function MicroCreateObjAndPropInsns(icSize: number) {
59    let insns = [];
60    let obj = new VReg();
61    let val = new VReg();
62
63    insns.push(new Tryldglobalbyname(new Imm(icSize), "String"));
64    insns.push(new Sta(obj));
65    insns.push(new Lda(obj));
66    insns.push(new Ldobjbyname(new Imm(icSize + 1), "raw"));
67    insns.push(new Sta(val));
68
69    let nextIc = icSize + 3;
70
71    return {insns: insns, nextIc: nextIc};
72}
73
74function MicroGetTemplateObject(rawArr: VReg, cookedArr: VReg, icSize: number) {
75    let insns = [];
76    let objReg = new VReg();
77    let indexReg = new VReg();
78
79    insns.push(new Createemptyarray(new Imm(icSize)));
80    insns.push(new Sta(objReg));
81
82    insns.push(new Ldai(new Imm(0)));
83    insns.push(new Sta(indexReg));
84    insns.push(new Lda(rawArr));
85    insns.push(new Stobjbyvalue(new Imm(icSize + 1), objReg, indexReg));
86    insns.push(new Ldai(new Imm(1)));
87    insns.push(new Sta(indexReg));
88    insns.push(new Lda(cookedArr));
89    insns.push(new Stobjbyvalue(new Imm(icSize + 3), objReg, indexReg));
90    insns.push(new Lda(objReg));
91    insns.push(new Gettemplateobject(new Imm(icSize + 5)));
92
93    let nextIc = icSize + 6;
94    return {insns: insns, nextIc: nextIc};
95
96}
97
98describe("templateExpressionTest", function () {
99    it("`string text line 1`", function () {
100        let insns = compileMainSnippet("`string text line 1`;");
101        IRNode.pg = new PandaGen("", creatAstFromSnippet("`string text line 1`;"), 0, undefined);
102        let expected = [
103            new LdaStr("string text line 1"),
104            new Returnundefined()
105        ];
106        expect(checkInstructions(insns, expected)).to.be.true;
107    });
108
109    it("`Fifteen is ${5 + 10}`", function () {
110        let insns = compileMainSnippet("`Fifteen is ${5 + 10}`");
111        IRNode.pg = new PandaGen("", creatAstFromSnippet("`Fifteen is ${5 + 10}`"), 0, undefined);
112        let headVal = new VReg();
113        let followedIc = 1;
114
115        let expected = [
116            new LdaStr("Fifteen is "),
117            new Sta(headVal),
118            new Ldai(new Imm(5)),
119            new Sta(new VReg()),
120            new Ldai(new Imm(10)),
121            new Add2(new Imm(0), new VReg()),
122            new Add2(new Imm(followedIc), headVal),
123            new Returnundefined()
124        ]
125
126        expect(checkInstructions(insns, expected)).to.be.true;
127    });
128
129    it("String.raw`string text line 1`", function () {
130        let insns = compileMainSnippet("String.raw`string text line 1`;");
131        IRNode.pg = new PandaGen("", creatAstFromSnippet("String.raw`string text line 1`;"), 0, undefined);
132        let obj = new VReg();
133        let prop = new VReg();
134        let elemIdxReg = new VReg();
135        let rawArr = new VReg();
136        let cookedArr = new VReg();
137        let rawArr1 = new VReg();
138        let cookedArr1 = new VReg();
139        let templateObj = new VReg();
140
141        let followedIc1 = 3;
142        let followedIc2 = 15;
143        let expected = [
144            new Tryldglobalbyname(new Imm(0), "String"),
145            new Sta(new VReg()),
146            new Lda(new VReg()),
147            new Ldobjbyname(new Imm(1), "raw"),
148            new Sta(new VReg()),
149            new Createemptyarray(new Imm(followedIc1)),
150            new Sta(rawArr),
151            new Createemptyarray(new Imm(followedIc1 + 1)),
152            new Sta(cookedArr),
153
154            new Ldai(new Imm(0)),
155            new Sta(elemIdxReg),
156            new LdaStr("string text line 1"),
157            new Stobjbyvalue(new Imm(followedIc1 + 2), rawArr, elemIdxReg),
158
159            new LdaStr("string text line 1"),
160            new Stobjbyvalue(new Imm(followedIc1 + 4), cookedArr, elemIdxReg),
161            new Mov(rawArr1, rawArr),
162            new Mov(cookedArr1, cookedArr),
163
164            new Createemptyarray(new Imm(9)),
165            new Sta(new VReg()),
166            new Ldai(new Imm(0)),
167            new Sta(new VReg()),
168            new Lda(rawArr),
169            new Stobjbyvalue(new Imm(10), new VReg(), new VReg()),
170            new Ldai(new Imm(1)),
171            new Sta(new VReg()),
172            new Lda(cookedArr),
173            new Stobjbyvalue(new Imm(12), new VReg(), new VReg()),
174            new Lda(new VReg()),
175            new Gettemplateobject(new Imm(14)),
176            new Sta(templateObj),
177
178            // structure call
179            new Lda(prop),
180            new Callthis1(new Imm(followedIc2), new VReg(), new VReg()),
181
182            new Returnundefined()
183        ];
184
185        expect(checkInstructions(insns, expected)).to.be.true;
186    });
187
188    it("String.raw`string text line 1\\nstring text line 2`", function () {
189        let insns = compileMainSnippet("String.raw`string text line 1\\nstring text line 2`;");
190        IRNode.pg = new PandaGen("", creatAstFromSnippet("String.raw`string text line 1\\nstring text line 2`;"), 0, undefined);
191        let prop = new VReg();
192        let elemIdxReg = new VReg();
193        let rawArr = new VReg();
194        let cookedArr = new VReg();
195        let rawArr1 = new VReg();
196        let cookedArr1 = new VReg();
197        let templateObj = new VReg();
198
199        let followedIc1 = 3;
200        let followedIc2 = 15;
201
202        let expected = [
203            new Tryldglobalbyname(new Imm(0), "String"),
204            new Sta(new VReg()),
205            new Lda(new VReg()),
206            new Ldobjbyname(new Imm(1), "raw"),
207            new Sta(new VReg()),
208            new Createemptyarray(new Imm(followedIc1)),
209            new Sta(rawArr),
210            new Createemptyarray(new Imm(followedIc1 + 1)),
211            new Sta(cookedArr),
212
213            new Ldai(new Imm(0)),
214            new Sta(elemIdxReg),
215            new LdaStr("string text line 1\\nstring text line 2"),
216            new Stobjbyvalue(new Imm(followedIc1 + 2), rawArr, elemIdxReg),
217
218            new LdaStr("string text line 1\nstring text line 2"),
219            new Stobjbyvalue(new Imm(followedIc1 + 4), cookedArr, elemIdxReg),
220            new Mov(rawArr1, rawArr),
221            new Mov(cookedArr1, cookedArr),
222
223            new Createemptyarray(new Imm(9)),
224            new Sta(new VReg()),
225            new Ldai(new Imm(0)),
226            new Sta(new VReg()),
227            new Lda(rawArr),
228            new Stobjbyvalue(new Imm(10), new VReg(), new VReg()),
229            new Ldai(new Imm(1)),
230            new Sta(new VReg()),
231            new Lda(cookedArr),
232            new Stobjbyvalue(new Imm(12), new VReg(), new VReg()),
233            new Lda(new VReg()),
234            new Gettemplateobject(new Imm(14)),
235            new Sta(templateObj),
236
237            // structure call
238            new Lda(prop),
239            new Callthis1(new Imm(followedIc2), new VReg(), new VReg()),
240
241            new Returnundefined()
242        ];
243
244        expect(checkInstructions(insns, expected)).to.be.true;
245    });
246
247    it("String.raw`Fifteen is ${5 + 10} !!`", function () {
248        let insns = compileMainSnippet("String.raw`Fifteen is ${5 + 10} !!`");
249        IRNode.pg = new PandaGen("", creatAstFromSnippet("String.raw`Fifteen is ${5 + 10} !!`"), 0, undefined);
250        let obj = new VReg();
251        let prop = new VReg();
252        let elemIdxReg = new VReg();
253        let rawArr = new VReg();
254        let cookedArr = new VReg();
255        let rawArr1 = new VReg();
256        let cookedArr1 = new VReg();
257        let addRet = new VReg();
258        let templateObj = new VReg();
259
260        let followedIc1 = 3;
261        let followedIc2 = 19;
262        let followedIc3 = 20;
263        let expected = [
264            new Tryldglobalbyname(new Imm(0), "String"),
265            new Sta(new VReg()),
266            new Lda(new VReg()),
267            new Ldobjbyname(new Imm(1), "raw"),
268            new Sta(new VReg()),
269
270            new Createemptyarray(new Imm(followedIc1)),
271            new Sta(rawArr),
272            new Createemptyarray(new Imm(followedIc1 + 1)),
273            new Sta(cookedArr),
274
275            new Ldai(new Imm(0)),
276            new Sta(elemIdxReg),
277            new LdaStr("Fifteen is "),
278            new Stobjbyvalue(new Imm(followedIc1 + 2), rawArr, elemIdxReg),
279            new LdaStr("Fifteen is "),
280            new Stobjbyvalue(new Imm(followedIc1 + 4), cookedArr, elemIdxReg),
281            new Ldai(new Imm(1)),
282            new Sta(elemIdxReg),
283            new LdaStr(" !!"),
284            new Stobjbyvalue(new Imm(followedIc1 + 6), rawArr, elemIdxReg),
285            new LdaStr(" !!"),
286            new Stobjbyvalue(new Imm(followedIc1 + 8), cookedArr, elemIdxReg),
287            new Mov(rawArr1, rawArr),
288            new Mov(cookedArr1, cookedArr),
289
290            new Createemptyarray(new Imm(13)),
291            new Sta(new VReg()),
292            new Ldai(new Imm(0)),
293            new Sta(new VReg()),
294            new Lda(rawArr),
295            new Stobjbyvalue(new Imm(14), new VReg(), new VReg()),
296            new Ldai(new Imm(1)),
297            new Sta(new VReg()),
298            new Lda(cookedArr),
299            new Stobjbyvalue(new Imm(16), new VReg(), new VReg()),
300            new Lda(new VReg()),
301            new Gettemplateobject(new Imm(18)),
302
303            new Sta(templateObj),
304
305            new Ldai(new Imm(5)),
306            new Sta(new VReg()),
307            new Ldai(new Imm(10)),
308            new Add2(new Imm(followedIc2), new VReg()),
309
310            new Sta(addRet),
311
312            // structure call
313            new Lda(prop),
314            new Callthis2(new Imm(followedIc3), new VReg(), new VReg(), new VReg()),
315            new Returnundefined()
316        ];
317        expect(checkInstructions(insns, expected)).to.be.true;
318    });
319
320    it("String.raw`Fifteen is ${5 + 10} !!\\n Is not ${15 + 10} !!!`", function () {
321        let insns = compileMainSnippet("String.raw`Fifteen is ${5 + 10} !!\\n Is not ${15 + 10} !!!\\n`");
322        IRNode.pg = new PandaGen("", creatAstFromSnippet("String.raw`Fifteen is ${5 + 10} !!\\n Is not ${15 + 10} !!!\\n`"), 0, undefined);
323        let obj = new VReg();
324        let prop = new VReg();
325        let elemIdxReg = new VReg();
326        let rawArr = new VReg();
327        let cookedArr = new VReg();
328        let rawArr1 = new VReg();
329        let cookedArr1 = new VReg();
330        let addRet1 = new VReg();
331        let addRet2 = new VReg();
332        let templateObj = new VReg();
333
334        let followedIc1 = 3;
335        let followedIc2 = 23;
336        let followedIc3 = 24;
337        let followedIc4 = 25;
338        let expected = [
339            new Tryldglobalbyname(new Imm(0), "String"),
340            new Sta(obj),
341            new Lda(obj),
342            new Ldobjbyname(new Imm(1), "raw"),
343            new Sta(new VReg()),
344
345            new Createemptyarray(new Imm(followedIc1)),
346            new Sta(rawArr),
347            new Createemptyarray(new Imm(followedIc1 + 1)),
348            new Sta(cookedArr),
349
350            new Ldai(new Imm(0)),
351            new Sta(elemIdxReg),
352            new LdaStr("Fifteen is "),
353            new Stobjbyvalue(new Imm(followedIc1 + 2), rawArr, elemIdxReg),
354            new LdaStr("Fifteen is "),
355            new Stobjbyvalue(new Imm(followedIc1 + 4), cookedArr, elemIdxReg),
356            new Ldai(new Imm(1)),
357            new Sta(elemIdxReg),
358            new LdaStr(" !!\\n Is not "),
359            new Stobjbyvalue(new Imm(followedIc1 + 6), rawArr, elemIdxReg),
360            new LdaStr(" !!\n Is not "),
361            new Stobjbyvalue(new Imm(followedIc1 + 8), cookedArr, elemIdxReg),
362            new Ldai(new Imm(2)),
363            new Sta(elemIdxReg),
364            new LdaStr(" !!!\\n"),
365            new Stobjbyvalue(new Imm(followedIc1 + 10), rawArr, elemIdxReg),
366            new LdaStr(" !!!\n"),
367            new Stobjbyvalue(new Imm(followedIc1 + 12), cookedArr, elemIdxReg),
368            new Mov(rawArr1, rawArr),
369            new Mov(cookedArr1, cookedArr),
370
371            new Createemptyarray(new Imm(17)),
372            new Sta(new VReg()),
373            new Ldai(new Imm(0)),
374            new Sta(new VReg()),
375            new Lda(rawArr),
376            new Stobjbyvalue(new Imm(18), new VReg(), new VReg()),
377            new Ldai(new Imm(1)),
378            new Sta(new VReg()),
379            new Lda(cookedArr),
380            new Stobjbyvalue(new Imm(20), new VReg(), new VReg()),
381            new Lda(new VReg()),
382            new Gettemplateobject(new Imm(22)),
383            new Sta(templateObj),
384
385            new Ldai(new Imm(5)),
386            new Sta(new VReg()),
387            new Ldai(new Imm(10)),
388            new Add2(new Imm(followedIc2), new VReg()),
389            new Sta(addRet1),
390            new Ldai(new Imm(15)),
391            new Sta(new VReg()),
392            new Ldai(new Imm(10)),
393            new Add2(new Imm(followedIc3), new VReg()),
394            new Sta(addRet2),
395
396            // structure call
397            new Lda(prop),
398            new Callthis3(new Imm(followedIc4), new VReg(), new VReg(), new VReg(), new VReg()),
399            new Returnundefined()
400        ];
401
402        expect(checkInstructions(insns, expected)).to.be.true;
403    });
404});