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});