1/*
2* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development 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*/
15let genDir = '../../src/gen/';
16const { readFile, writeFile } = require(genDir + 'tools/FileRW');
17const { getArrayType, getArrayTypeTwo } = require(genDir + 'tools/common');
18const { isEnum, enumIndex, getMapType, checkFileError } = require(genDir + 'tools/common');
19const { search, match, removeReg, getReg } = require(genDir + 'tools/re');
20const { replaceAll, all } = require(genDir + 'tools/re');
21const { checkOutBody, removeExplains, replaceTab } = require(genDir + 'tools/tool');
22const { removeEmptyLine, print, getLicense, removeEmptyLine2 } = require(genDir + 'tools/tool');
23const assert = require('assert');
24const rewire = require('rewire');
25const { json } = require('stream/consumers');
26
27var correctResult;
28
29function before() {
30    let data = readFile('test/unittest/result.json');
31    if (data) {
32        correctResult = JSON.parse(data);
33    }
34}
35describe('Tools', function () {
36
37    before(function () {
38        before();
39    });
40
41    it('test gen/tools/re search', function () {
42        let ret = search('@ohos([.a-z_A-Z0-9]+).d.ts', '@ohos.input_sample.d.ts');
43        assert.strictEqual(JSON.stringify(ret), `{'regs':[[0,23],[5,18]]}`);
44    });
45
46    it('test gen/tools/re match', function () {
47        let ret = match('@ohos([.a-z_A-Z0-9]+).d.ts', '@ohos.input_sample.d.ts');
48        assert.strictEqual(JSON.stringify(ret), `{'regs':[[0,23],[5,18]]}`);
49    });
50
51    partOfReTest();
52
53    partOfCommonTest();
54
55    partOfToolsTest(correctResult);
56
57    it('test gen/tools/tool removeExplains', function () {
58        let param = correctResult.ParamIn.removeExplains;
59        let ret = removeExplains(param);
60        let result = correctResult.tools.removeExplains;
61        assert.strictEqual(JSON.stringify(ret), JSON.stringify(result));
62    });
63
64    it('test gen/tools/FileRW readFile', function () {
65        let aaa = Math.random() * 10000;
66        let content = '时间 = %^(^*%*&^*' + aaa;
67        writeFile('test/unittest/testrw.txt', content);
68        let ret = readFile('test/unittest/testrw.txt');
69        assert.strictEqual(ret, content);
70    });
71
72});
73
74function partOfReTest() {
75    it('test gen/tools/re removeReg', function () {
76        let ret = removeReg('export default napitest;', [4, 22]);
77
78        assert.strictEqual(JSON.stringify(ret), `'expot;'`);
79    });
80
81    it('test gen/tools/re getReg', function () {
82        let data = 'declare namespace napitest {function fun6(v2: string): void;}export default napitest;';
83        assert.strictEqual(JSON.stringify(getReg(data, [0, 10])), `'declare na'`);
84    });
85
86    it('test gen/tools/re replaceAll', function () {
87        let ret = replaceAll('\n *//([a-zA-Z .]+)\n', '\\.', '\\.');
88        let retJson = JSON.stringify(ret);
89        assert.strictEqual(retJson, `'\\n *//([a-zA-Z \\\\.]+)\\n'`);
90    });
91
92    it('test gen/tools/re all', function () {
93        assert.strictEqual(JSON.stringify(all('\\.')), '{}');
94    });
95}
96
97function partOfCommonTest() {
98    it('test gen/tools/common getArrayType', function () {
99        let ret = getArrayType('Array<number>');
100        assert.strictEqual(ret, 'number');
101    });
102
103    it('test gen/tools/common getArrayTypeTwo', function () {
104        let ret = getArrayTypeTwo('string[]');
105        assert.strictEqual(ret, 'string');
106    });
107
108    it('test gen/tools/common isEnum', function () {
109        let enumElement = [{ name: 'STATUS0', value: '0', type: 'NUMBER_TYPE_1' }];
110        let data = {
111            class: [],
112            const: [],
113            enum: [{ name: 'HttpStatus', body: { element: enumElement, function: [], enumValueType: 0 } }],
114            exports: ['HttpStatus'],
115            function: [],
116            interface: [],
117            namespace: [],
118        };
119        let ret = isEnum('HttpStatus', data);
120        assert.strictEqual(ret, true);
121    });
122
123    it('test gen/tools/common enumIndex', function () {
124        let enumElement = [{ name: 'STATUS0', value: '0', type: 'NUMBER_TYPE_1' }];
125        let data = {
126            class: [],
127            const: [],
128            enum: [{ name: 'HttpStatus', body: { element: enumElement, function: [], enumValueType: 0 } }],
129            exports: ['HttpStatus'],
130            function: [],
131            interface: [],
132            namespace: [],
133        };
134        let ret = enumIndex('HttpStatus', data);
135        assert.strictEqual(ret, '0');
136    });
137
138    partOfCommonTwo();
139}
140
141function partOfCommonTwo() {
142    it('test gen/tools/common getMapType', function () {
143        let result = ['string', 'NUMBER_TYPE_1', undefined, undefined];
144        let ret = getMapType('{[key:string]:NUMBER_TYPE_1}');
145        assert.strictEqual(JSON.stringify(ret), JSON.stringify(result));
146    });
147
148    it('test gen/tools/common checkFileError', function () {
149        let result = [
150            false,
151            "File 'napi_generator-master/test/unittest/@ohos.input_sample.d.ts' not found.\n" +
152            '  The file is in the program because:\n' +
153            '    Root file specified for compilation\n'
154        ];
155        let ret = checkFileError('napi_generator-master\\test\\unittest\\@ohos.input_sample.d.ts');
156        this.timeout(5000);
157        assert.strictEqual(JSON.stringify(ret), JSON.stringify(result));
158    });
159}
160
161function partOfToolsTest(correctResult) {
162    it('test gen/tools/tool print', function () {
163        let lib = rewire(genDir + 'tools/tool.js');
164        let print = lib.__get__('print');
165        print('tool test print');
166    });
167
168    it('test gen/tools/tool checkOutBody', function () {
169        let body = correctResult.ParamIn.checkOutBody;
170        let ret = checkOutBody(body, 27, null, true);
171        let result = 'function fun1(v1: { [key: string]: Array<string> }):void;';
172        assert.strictEqual(JSON.stringify(ret), JSON.stringify(result));
173    });
174
175    it('test gen/tools/tool removeEmptyLine', function () {
176        param = correctResult.ParamIn.removeEmptyLine;
177        let retJson = JSON.stringify(removeEmptyLine(param));
178        let result = 'declare namespace napitest {\nfunction fun1(v1: string):void;\n}\nexport default napitest;\n';
179        assert.strictEqual(retJson, JSON.stringify(result));
180    });
181
182    it('test gen/tools/tool getLicense', function () {
183        param = correctResult.ParamIn.getLicense;
184        let retJson = JSON.stringify(getLicense(param));
185        let result = '/*\n* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. \n*/';
186        assert.strictEqual(retJson, JSON.stringify(result));
187    });
188
189    it('test gen/tools/tool replaceTab', function () {
190        param = 'declare namespace napitest {\tfunction fun1():void;}export default napitest;';
191        let retJson = JSON.stringify(replaceTab(param));
192        let result = 'declare namespace napitest {    function fun1():void;}export default napitest;';
193        assert.strictEqual(retJson, JSON.stringify(result));
194    });
195
196    it('test gen/tools/tool replaceAll', function () {
197        param = correctResult.toolsParam.replaceAll;
198        let ret = replaceAll(JSON.stringify(param), '[funcName]', 'if_direct');
199        assert.strictEqual(JSON.stringify(ret), correctResult.tools.replaceAll);
200    });
201}