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 Createobjectwithbuffer, 23 Defineclasswithbuffer, 24 Returnundefined, 25 Stmodulevar, 26 ThrowUndefinedifholewithname, 27 Imm, 28 Lda, 29 LdaStr, 30 Mov, 31 Sta, 32 VReg, 33 IRNode, 34 Ldexternalmodulevar, 35 Ldlocalmodulevar, 36 Stobjbyname 37} from "../src/irnodes"; 38import { CmdOptions } from '../src/cmdOptions'; 39import { creatAstFromSnippet } from "./utils/asthelper"; 40import { PandaGen } from '../src/pandagen'; 41 42 43describe("ExportDeclaration", function () { 44 45 it("exportClassTest", function() { 46 CmdOptions.isModules = () => {return true}; 47 CmdOptions.parseUserCmd([""]); 48 let snippetCompiler = new SnippetCompiler(); 49 snippetCompiler.compile(`class C {}; export {C}`); 50 IRNode.pg = new PandaGen("foo", creatAstFromSnippet(`class C {}; export {C}`), 0, undefined); 51 CmdOptions.isModules = () => {return false}; 52 let funcMainInsns = snippetCompiler.getGlobalInsns(); 53 let classReg = new VReg(); 54 let expected = [ 55 new Mov(new VReg(), new VReg()), 56 new Defineclasswithbuffer(new Imm(0), "UnitTest.#1#C", "snippet_1", new Imm(0), new VReg()), 57 new Sta(classReg), 58 new Lda(classReg), 59 new Stmodulevar(new Imm(0)), 60 new Returnundefined(), 61 ]; 62 expect(checkInstructions(funcMainInsns, expected)).to.be.true; 63 }); 64 65 it("Re-exportImportVarTest", function() { 66 CmdOptions.isModules = () => {return true}; 67 let snippetCompiler = new SnippetCompiler(); 68 snippetCompiler.compile(`import a from 'test.js'; let v = a; export {a};`); 69 CmdOptions.isModules = () => {return false}; 70 let funcMainInsns = snippetCompiler.getGlobalInsns(); 71 let v = new VReg(); 72 let expected = [ 73 new Ldexternalmodulevar(new Imm(0)), 74 new ThrowUndefinedifholewithname("a"), 75 new Sta(v), 76 new Returnundefined(), 77 ]; 78 expect(checkInstructions(funcMainInsns, expected)).to.be.true; 79 }); 80 81 it("Re-exportImportVaribaleIndexTest", function() { 82 CmdOptions.isModules = () => {return true}; 83 let snippetCompiler = new SnippetCompiler(); 84 snippetCompiler.compile( 85 `import { Graphics } from 'module1'; 86 import { graphicsAssembler as graphics } from 'module2'; 87 export { earcut } from 'module3'; 88 const graphicsAssemblerManager = { 89 getAssembler(sprite) { 90 return graphics; 91 }, 92 }; 93 Graphics.Assembler = graphicsAssemblerManager; 94 export { graphics, graphicsAssemblerManager as graphicsAssembler, };`); 95 CmdOptions.isModules = () => {return false}; 96 IRNode.pg = new PandaGen("test", creatAstFromSnippet(""), 0, undefined); 97 let funcMainInsns = snippetCompiler.getGlobalInsns(); 98 let graphicsAssemblerManager = new VReg(); 99 let v = new VReg(); 100 let expected = [ 101 new Createobjectwithbuffer(new Imm(0), "snippet_1"), 102 new Sta(graphicsAssemblerManager), 103 new Lda(graphicsAssemblerManager), 104 new Stmodulevar(new Imm(0)), 105 new Ldexternalmodulevar(new Imm(0)), 106 new ThrowUndefinedifholewithname("Graphics"), 107 new Sta(v), 108 new Mov(graphicsAssemblerManager, v), 109 new Ldlocalmodulevar(new Imm(0)), 110 new Stobjbyname(new Imm(1), "Assembler", graphicsAssemblerManager), 111 new Returnundefined() 112 ]; 113 expect(checkInstructions(funcMainInsns, expected)).to.be.true; 114 }); 115});