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