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 { checkInstructions, SnippetCompiler } from "./utils/base"; 21import { 22 Callarg1, 23 Callthis3, 24 Createemptyarray, 25 Definefunc, 26 Returnundefined, 27 Stobjbyname, 28 Stownbyindex, 29 Tryldglobalbyname, 30 Imm, 31 Lda, 32 Ldai, 33 LdaStr, 34 Ldobjbyname, 35 Mov, 36 Sta, 37 VReg, 38 IRNode 39} from "../src/irnodes"; 40import { CmdOptions } from '../src/cmdOptions'; 41import { creatAstFromSnippet } from "./utils/asthelper"; 42import { PandaGen } from '../src/pandagen'; 43 44 45describe("CommonJsTest", function () { 46 47 it("mainFunc", function() { 48 CmdOptions.isCommonJs = () => {return true}; 49 let snippetCompiler = new SnippetCompiler(); 50 snippetCompiler.compileCommonjs(`let a = 1`, 'cjs.js'); 51 IRNode.pg = new PandaGen("foo", creatAstFromSnippet(`let a = 1`), 0, undefined); 52 53 CmdOptions.isCommonJs = () => {return false}; 54 let funcMainInsns = snippetCompiler.getGlobalInsns(); 55 let expected = [ 56 new Tryldglobalbyname(new Imm(0), "Reflect"), 57 new Sta(new VReg()), 58 new Lda(new VReg()), 59 new Ldobjbyname(new Imm(1), "apply"), 60 new Sta(new VReg()), 61 new Definefunc(new Imm(3), 'UnitTest.#1#', new Imm(5)), 62 new Sta(new VReg()), 63 new Lda(new VReg()), 64 new Sta(new VReg()), 65 new Createemptyarray(new Imm(4)), 66 new Sta(new VReg()), 67 new Lda(new VReg()), 68 new Stownbyindex(new Imm(5), new VReg(), new Imm(0)), 69 new Lda(new VReg()), 70 new Stownbyindex(new Imm(7), new VReg(), new Imm(1)), 71 new Lda(new VReg()), 72 new Stownbyindex(new Imm(9), new VReg(), new Imm(2)), 73 new Lda(new VReg()), 74 new Stownbyindex(new Imm(11), new VReg(), new Imm(3)), 75 new Lda(new VReg()), 76 new Stownbyindex(new Imm(13), new VReg(), new Imm(4)), 77 new Lda(new VReg()), 78 new Sta(new VReg()), 79 new Lda(new VReg()), 80 new Callthis3(new Imm(15), new VReg(), new VReg(), new VReg(), new VReg()), 81 new Returnundefined(), 82 ]; 83 expect(checkInstructions(funcMainInsns, expected)).to.be.true; 84 }); 85 86 it("requireTest", function() { 87 CmdOptions.isCommonJs = () => {return true}; 88 let snippetCompiler = new SnippetCompiler(); 89 snippetCompiler.compileCommonjs(`let a = require('a.js')`, 'cjs.js'); 90 IRNode.pg = new PandaGen("foo", creatAstFromSnippet(`let a = require('a.js')`), 0, undefined); 91 CmdOptions.isCommonJs = () => {return false}; 92 let execInsns = snippetCompiler.getPandaGenByName('UnitTest.#1#')!.getInsns(); 93 let requirePara = new VReg(); 94 let requireReg = new VReg(); 95 let moduleRequest = new VReg(); 96 let expected = [ 97 new Lda(requirePara), 98 new Sta(requireReg), 99 new LdaStr("a.js"), 100 new Sta(moduleRequest), 101 new Lda(new VReg()), 102 new Callarg1(new Imm(0), moduleRequest), 103 new Sta(new VReg()), 104 new Returnundefined() 105 ]; 106 expect(checkInstructions(execInsns, expected)).to.be.true; 107 }); 108 109 it("exportTest", function() { 110 CmdOptions.isCommonJs = () => {return true}; 111 let snippetCompiler = new SnippetCompiler(); 112 snippetCompiler.compileCommonjs(`let a = 1; exports.a = a;`, 'cjs.js'); 113 IRNode.pg = new PandaGen("foo", creatAstFromSnippet(`let a = 1; exports.a = a;`), 0, undefined); 114 CmdOptions.isCommonJs = () => {return false}; 115 let execInsns = snippetCompiler.getPandaGenByName('UnitTest.#1#')!.getInsns(); 116 let exportsPara = new VReg(); 117 let exportsReg = new VReg(); 118 let tmpReg = new VReg(); 119 let a = new VReg(); 120 let expected = [ 121 new Ldai(new Imm(1)), 122 new Sta(a), 123 new Lda(exportsPara), 124 new Sta(exportsReg), 125 new Mov(tmpReg, exportsReg), 126 new Lda(a), 127 new Stobjbyname(new Imm(0), "a", tmpReg), 128 new Returnundefined() 129 ]; 130 expect(checkInstructions(execInsns, expected)).to.be.true; 131 }); 132});