1/*
2 * Copyright (c) 2024 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 { ApiExtractor } from '../../../src/common/ApiExtractor';
17import {assert} from 'chai';
18import { readProjectPropertiesByCollectedPaths } from '../../../src/common/ApiReader';
19import { NameGeneratorType } from '../../../src/generator/NameFactory';
20
21function collectApi(apiPath: string): void {
22  clearAll();
23  ApiExtractor.traverseApiFiles(apiPath, ApiExtractor.ApiType.API);
24}
25
26function clearAll(): void {
27  ApiExtractor.mPropertySet.clear();
28  ApiExtractor.mSystemExportSet.clear();
29}
30
31describe('test for ApiExtractor', function () {
32  describe('test for visitExport', function () {
33    it('export {ExportDeclarationClass1, ExportDeclarationClass2}', function () {
34      let exportDeclarationAst: string = 'test/ut/utils/apiTest_visitExport/exportDeclarationAst.d.ts';
35      collectApi(exportDeclarationAst);
36      assert.strictEqual(ApiExtractor.mSystemExportSet.has('ExportDeclarationClass1'), true);
37      assert.strictEqual(ApiExtractor.mSystemExportSet.has('ExportDeclarationClass2'), true);
38      clearAll();
39    });
40
41    it('export {ExportDeclarationClass1 as class1, ExportDeclarationClass2} from `./exportDeclarationFrom`',
42     function () {
43      let exportDeclarationFromAst: string = 'test/ut/utils/apiTest_visitExport/exportDeclarationFrom.d.ts';
44      collectApi(exportDeclarationFromAst);
45      assert.strictEqual(ApiExtractor.mSystemExportSet.has('ExportDeclarationClass1'), false);
46      assert.strictEqual(ApiExtractor.mSystemExportSet.has('class1'), true);
47      assert.strictEqual(ApiExtractor.mSystemExportSet.has('ExportDeclarationClass2'), true);
48      clearAll();
49    });
50
51    it('export {default as name1, ExportDeclarationClass2, exportName} from `./exportDefaultDeclarationAst`',
52     function () {
53      let exportDeclarationDefault: string = 'test/ut/utils/apiTest_visitExport/exportDeclarationDefault.d.ts';
54      collectApi(exportDeclarationDefault);
55      assert.strictEqual(ApiExtractor.mSystemExportSet.has('default'), false);
56      assert.strictEqual(ApiExtractor.mSystemExportSet.has('name1'), true);
57      assert.strictEqual(ApiExtractor.mSystemExportSet.has('ExportDeclarationClass2'), true);
58      assert.strictEqual(ApiExtractor.mSystemExportSet.has('exportName'), true);
59      clearAll();
60    });
61
62    it('export {ExportDeclarationClass1 as exportName, ExportDeclarationClass2, ExportDeclarationClass3 as default}',
63     function () {
64      let exportDefaultDeclarationAst: string = 'test/ut/utils/apiTest_visitExport/exportDefaultDeclarationAst.d.ts';
65      collectApi(exportDefaultDeclarationAst);
66      assert.strictEqual(ApiExtractor.mSystemExportSet.has('ExportDeclarationClass1'), false);
67      assert.strictEqual(ApiExtractor.mSystemExportSet.has('exportName'), true);
68      assert.strictEqual(ApiExtractor.mSystemExportSet.has('ExportDeclarationClass2'), true);
69      assert.strictEqual(ApiExtractor.mSystemExportSet.has('ExportDeclarationClass3'), false);
70      assert.strictEqual(ApiExtractor.mSystemExportSet.has('default'), true);
71      clearAll();
72    });
73
74    it('export * as name1', function () {
75      let exportAllAst: string = 'test/ut/utils/apiTest_visitExport/exportAll.d.ts';
76      collectApi(exportAllAst);
77      assert.strictEqual(ApiExtractor.mSystemExportSet.has('name1'), true);
78      clearAll();
79    });
80
81    it('export * from `export*.ts`', function () {
82      let exportFile: string = 'test/ut/utils/apiTest_visitExport/export.d.ts';
83      collectApi(exportFile);
84      assert.strictEqual(ApiExtractor.mSystemExportSet.size === 0, true);
85      assert.strictEqual(ApiExtractor.mPropertySet.size === 0, true);
86      clearAll();
87    });
88
89    it('doubleUnderscoreTest', function () {
90      let doubleUnderscoreTestAst: string = 'test/ut/utils/apiTest_visitExport/doubleUnderscoreTest.d.ts';
91      collectApi(doubleUnderscoreTestAst);
92      assert.strictEqual(ApiExtractor.mPropertySet.has('__Admin'), true);
93      assert.strictEqual(ApiExtractor.mPropertySet.has('___Admin'), false);
94      assert.strictEqual(ApiExtractor.mPropertySet.has('__Moderator'), true);
95      assert.strictEqual(ApiExtractor.mPropertySet.has('___Moderator'), false);
96      assert.strictEqual(ApiExtractor.mPropertySet.has('__User'), true);
97      assert.strictEqual(ApiExtractor.mPropertySet.has('___User'), false);
98      assert.strictEqual(ApiExtractor.mPropertySet.has('__name'), true);
99      assert.strictEqual(ApiExtractor.mPropertySet.has('___name'), false);
100      assert.strictEqual(ApiExtractor.mPropertySet.has('__Admin'), true);
101      assert.strictEqual(ApiExtractor.mPropertySet.has('___Admin'), false);
102      assert.strictEqual(ApiExtractor.mPropertySet.has('__age'), true);
103      assert.strictEqual(ApiExtractor.mPropertySet.has('___age'), false);
104      assert.strictEqual(ApiExtractor.mPropertySet.has('__greet'), true);
105      assert.strictEqual(ApiExtractor.mPropertySet.has('___greet'), false);
106      assert.strictEqual(ApiExtractor.mPropertySet.has('__typeProp1'), true);
107      assert.strictEqual(ApiExtractor.mPropertySet.has('___typeProp1'), false);
108      assert.strictEqual(ApiExtractor.mPropertySet.has('__typeProp2'), true);
109      assert.strictEqual(ApiExtractor.mPropertySet.has('___typeProp2'), false);
110      assert.strictEqual(ApiExtractor.mPropertySet.has('__speak'), true);
111      assert.strictEqual(ApiExtractor.mPropertySet.has('___speak'), false);
112      assert.strictEqual(ApiExtractor.mPropertySet.has('__appName'), true);
113      assert.strictEqual(ApiExtractor.mPropertySet.has('___appName'), false);
114      assert.strictEqual(ApiExtractor.mPropertySet.has('__version'), true);
115      assert.strictEqual(ApiExtractor.mPropertySet.has('___version'), false);
116      assert.strictEqual(ApiExtractor.mPropertySet.has('__logDetails'), true);
117      assert.strictEqual(ApiExtractor.mPropertySet.has('___logDetails'), false);
118      clearAll();
119    });
120  });
121
122  describe('test for visitPropertyAndName', function () {
123    it('Class Test', function () {
124      let filePath: string = 'test/ut/utils/apiTest_visitPropertyAndName/classTest.d.ts';
125      collectApi(filePath);
126      assert.strictEqual(ApiExtractor.mSystemExportSet.has('TestClass1'), true);
127      assert.strictEqual(ApiExtractor.mSystemExportSet.has('TestClass2'), false);
128      assert.strictEqual(ApiExtractor.mSystemExportSet.has('AbstractClass'), false);
129      assert.strictEqual(ApiExtractor.mPropertySet.has('prop1'), true);
130      assert.strictEqual(ApiExtractor.mPropertySet.has('prop2'), true);
131      assert.strictEqual(ApiExtractor.mPropertySet.has('abstractProp'), true);
132      assert.strictEqual(ApiExtractor.mPropertySet.has('foo1'), true);
133      assert.strictEqual(ApiExtractor.mPropertySet.has('foo2'), true);
134      assert.strictEqual(ApiExtractor.mPropertySet.has('param1'), true);
135      assert.strictEqual(ApiExtractor.mPropertySet.has('param2'), false);
136      clearAll();
137    });
138
139    it('Interface Test', function () {
140      let filePath: string = 'test/ut/utils/apiTest_visitPropertyAndName/interfaceTest.d.ts';
141      collectApi(filePath);
142      assert.strictEqual(ApiExtractor.mSystemExportSet.has('TestInterface1'), true);
143      assert.strictEqual(ApiExtractor.mSystemExportSet.has('TestInterface2'), false);
144      assert.strictEqual(ApiExtractor.mPropertySet.has('prop1'), true);
145      assert.strictEqual(ApiExtractor.mPropertySet.has('prop2'), true);
146      assert.strictEqual(ApiExtractor.mPropertySet.has('foo1'), true);
147      assert.strictEqual(ApiExtractor.mPropertySet.has('foo2'), true);
148      assert.strictEqual(ApiExtractor.mPropertySet.has('param1'), true);
149      assert.strictEqual(ApiExtractor.mPropertySet.has('param2'), false);
150      clearAll();
151    });
152
153    it('TypeLiteral Test', function () {
154      let filePath: string = 'test/ut/utils/apiTest_visitPropertyAndName/typeLiteralTest.d.ts';
155      collectApi(filePath);
156      assert.strictEqual(ApiExtractor.mSystemExportSet.has('TestType1'), true);
157      assert.strictEqual(ApiExtractor.mSystemExportSet.has('TestType2'), false);
158      assert.strictEqual(ApiExtractor.mPropertySet.has('collectProp1'), true);
159      assert.strictEqual(ApiExtractor.mPropertySet.has('collectProp2'), true);
160      assert.strictEqual(ApiExtractor.mPropertySet.has('testFunc1'), true);
161      assert.strictEqual(ApiExtractor.mPropertySet.has('testFunc2'), true);
162      assert.strictEqual(ApiExtractor.mPropertySet.has('message1'), true);
163      assert.strictEqual(ApiExtractor.mPropertySet.has('message2'), false);
164      clearAll();
165    });
166
167    it('Enum Test', function () {
168      let filePath: string = 'test/ut/utils/apiTest_visitPropertyAndName/enumTest.d.ts';
169      collectApi(filePath);
170      assert.strictEqual(ApiExtractor.mSystemExportSet.has('TestEnum1'), true);
171      assert.strictEqual(ApiExtractor.mSystemExportSet.has('TestEnum2'), false);
172      assert.strictEqual(ApiExtractor.mPropertySet.has('PARAM1'), true);
173      assert.strictEqual(ApiExtractor.mPropertySet.has('PARAM2'), true);
174      clearAll();
175    });
176
177    it('ObjectLiteral Test', function () {
178      let filePath: string = 'test/ut/utils/apiTest_visitPropertyAndName/objectLiteral.d.ts';
179      collectApi(filePath);
180      assert.strictEqual(ApiExtractor.mSystemExportSet.has('obj1'), true);
181      assert.strictEqual(ApiExtractor.mSystemExportSet.has('obj2'), false);
182      assert.strictEqual(ApiExtractor.mPropertySet.has('prop1'), true);
183      assert.strictEqual(ApiExtractor.mPropertySet.has('prop2'), true);
184      assert.strictEqual(ApiExtractor.mPropertySet.has('prop3'), true);
185      assert.strictEqual(ApiExtractor.mPropertySet.has('prop4'), true);
186      assert.strictEqual(ApiExtractor.mPropertySet.has('innerProp1'), true);
187      assert.strictEqual(ApiExtractor.mPropertySet.has('innerProp2'), true);
188      assert.strictEqual(ApiExtractor.mPropertySet.has('innerProp3'), true);
189      assert.strictEqual(ApiExtractor.mPropertySet.has('innerProp4'), true);
190      clearAll();
191    });
192
193    it('Module Test', function () {
194      let filePath: string = 'test/ut/utils/apiTest_visitPropertyAndName/moduleTest.d.ts';
195      collectApi(filePath);
196      assert.strictEqual(ApiExtractor.mSystemExportSet.has('ns1'), true);
197      assert.strictEqual(ApiExtractor.mSystemExportSet.has('ns2'), false);
198      assert.strictEqual(ApiExtractor.mPropertySet.has('TestClass1'), true);
199      assert.strictEqual(ApiExtractor.mPropertySet.has('TestInterface1'), true);
200      assert.strictEqual(ApiExtractor.mPropertySet.has('prop1'), true);
201      assert.strictEqual(ApiExtractor.mPropertySet.has('prop2'), true);
202      assert.strictEqual(ApiExtractor.mPropertySet.has('prop3'), true);
203      assert.strictEqual(ApiExtractor.mPropertySet.has('TestClass2'), false);
204      assert.strictEqual(ApiExtractor.mPropertySet.has('TestInterface2'), false);
205      assert.strictEqual(ApiExtractor.mPropertySet.has('prop4'), true);
206      assert.strictEqual(ApiExtractor.mPropertySet.has('prop5'), true);
207      clearAll();
208    });
209  });
210
211  describe('test for visitProjectExport', function () {
212    const fileList: Set<string> = new Set([
213      "test/ut/utils/module_exports_test/exportFile1.js",
214      "test/ut/utils/oh_modules/exportFile.js"
215    ]);
216    it('test for module.exports(property)', function () {
217      let projectAndLibs = readProjectPropertiesByCollectedPaths(fileList,
218        {
219          mNameObfuscation: {
220            mEnable: true,
221            mReservedProperties: [],
222            mRenameProperties: true,
223            mKeepStringProperty: false,
224            mNameGeneratorType: NameGeneratorType.ORDERED,
225            mReservedNames: [], 
226            mReservedToplevelNames: []
227          },
228          mExportObfuscation: false,
229          mKeepFileSourceCode: {
230            mKeepSourceOfPaths: new Set(),
231            mkeepFilesAndDependencies: new Set(),
232          }
233        }, true);
234      let reservedProperties = projectAndLibs.exportNameAndPropSet == undefined? new Set<string> : projectAndLibs.exportNameAndPropSet;
235      let reservedExportNames = projectAndLibs.exportNameSet == undefined? new Set<string> : projectAndLibs.exportNameSet;
236      assert.strictEqual(reservedProperties.has('projectPropertyAssignment1'), true);
237      assert.strictEqual(reservedProperties.has('projectPropertyAssignment2'), true);
238      assert.strictEqual(reservedProperties.has('projectPropertyAssignment3'), true);
239      assert.strictEqual(reservedProperties.has('projectPropertyAssignment4'), true);
240      assert.strictEqual(reservedProperties.has('projectIndirectObj'), false);
241      assert.strictEqual(reservedProperties.has('indirectProp1'), true);
242      assert.strictEqual(reservedProperties.has('projectShorthand'), true);
243      assert.strictEqual(reservedProperties.has('projectShorthandProp'), true);
244      assert.strictEqual(reservedProperties.has('projectMethod1'), true);
245      assert.strictEqual(reservedProperties.has('projectMethod2'), true);
246      assert.strictEqual(reservedProperties.has('projectMethod3'), true);
247      assert.strictEqual(reservedProperties.has('projectGetProp1'), true);
248      assert.strictEqual(reservedProperties.has('projectGetProp2'), true);
249      assert.strictEqual(reservedProperties.has('projectGetProp3'), true);
250      assert.strictEqual(reservedProperties.has('projectSetProp1'), true);
251      assert.strictEqual(reservedProperties.has('projectSetProp2'), true);
252      assert.strictEqual(reservedProperties.has('projectSetProp3'), true);
253      assert.strictEqual(reservedProperties.has('projectExportElement1'), true);
254      assert.strictEqual(reservedProperties.has('projectExportElement2'), true);
255      assert.strictEqual(reservedProperties.has('indirectClass1'), false);
256      assert.strictEqual(reservedProperties.has('indirectProp2'), true);
257      assert.strictEqual(reservedProperties.has('projectExportElement3'), true);
258      assert.strictEqual(reservedProperties.has('indirectClass2'), false);
259      assert.strictEqual(reservedProperties.has('indirectProp3'), true);
260      assert.strictEqual(reservedProperties.has('projectExportElement4'), true);
261      assert.strictEqual(reservedProperties.has('indirectProp4'), true);
262      assert.strictEqual(reservedProperties.has('projectExportElement5'), true);
263      assert.strictEqual(reservedProperties.has('projectExportElement6'), true);
264      assert.strictEqual(reservedProperties.has('projectExportElement7'), true);
265      assert.strictEqual(reservedProperties.has('indirectClass3'), false);
266      assert.strictEqual(reservedProperties.has('indirectProp5'), true);
267      assert.strictEqual(reservedProperties.has('projectExportElement8'), true);
268      assert.strictEqual(reservedProperties.has('indirectClass4'), false);
269      assert.strictEqual(reservedProperties.has('indirectProp6'), true);
270      assert.strictEqual(reservedProperties.has('projectExportElement9'), true);
271      assert.strictEqual(reservedProperties.has('indirectProp7'), true);
272      assert.strictEqual(reservedProperties.has('ohPropertyAssignment1'), true);
273      assert.strictEqual(reservedProperties.has('ohPropertyAssignment2'), true);
274      assert.strictEqual(reservedProperties.has('ohPropertyAssignment3'), true);
275      assert.strictEqual(reservedProperties.has('ohPropertyAssignment4'), true);
276      assert.strictEqual(reservedProperties.has('ohIndirectObj'), false);
277      assert.strictEqual(reservedProperties.has('ohIndirectProp1'), true);
278      assert.strictEqual(reservedProperties.has('ohShorthand'), true);
279      assert.strictEqual(reservedProperties.has('ohShorthandProp'), true);
280      assert.strictEqual(reservedProperties.has('ohMethod1'), true);
281      assert.strictEqual(reservedProperties.has('ohMethod2'), true);
282      assert.strictEqual(reservedProperties.has('ohMethod3'), true);
283      assert.strictEqual(reservedProperties.has('ohGetProp1'), true);
284      assert.strictEqual(reservedProperties.has('ohGetProp2'), true);
285      assert.strictEqual(reservedProperties.has('ohGetProp3'), true);
286      assert.strictEqual(reservedProperties.has('ohSetProp1'), true);
287      assert.strictEqual(reservedProperties.has('ohSetProp2'), true);
288      assert.strictEqual(reservedProperties.has('ohSetProp3'), true);
289      assert.strictEqual(reservedProperties.has('ohExportElement1'), true);
290      assert.strictEqual(reservedProperties.has('ohExportElement2'), true);
291      assert.strictEqual(reservedProperties.has('ohIndirectClass1'), false);
292      assert.strictEqual(reservedProperties.has('ohIndirectProp2'), true);
293      assert.strictEqual(reservedProperties.has('ohExportElement3'), true);
294      assert.strictEqual(reservedProperties.has('ohIndirectClass2'), false);
295      assert.strictEqual(reservedProperties.has('ohIndirectProp3'), true);
296      assert.strictEqual(reservedProperties.has('ohExportElement4'), true);
297      assert.strictEqual(reservedProperties.has('ohIndirectProp4'), true);
298      assert.strictEqual(reservedProperties.has('ohExportElement5'), true);
299      assert.strictEqual(reservedProperties.has('ohExportElement6'), true);
300      assert.strictEqual(reservedProperties.has('ohExportElement7'), true);
301      assert.strictEqual(reservedProperties.has('ohIndirectClass3'), false);
302      assert.strictEqual(reservedProperties.has('ohIndirectProp5'), true);
303      assert.strictEqual(reservedProperties.has('ohExportElement8'), true);
304      assert.strictEqual(reservedProperties.has('ohIndirectClass4'), false);
305      assert.strictEqual(reservedProperties.has('ohIndirectProp6'), true);
306      assert.strictEqual(reservedExportNames.size === 0, true);
307    });
308
309    it('test for module.exports(export)', function () {
310      let projectAndLibs = readProjectPropertiesByCollectedPaths(fileList,
311        {
312          mNameObfuscation: {
313            mEnable: true,
314            mReservedProperties: [],
315            mRenameProperties: false,
316            mKeepStringProperty: false,
317            mNameGeneratorType: NameGeneratorType.ORDERED,
318            mReservedNames: [], 
319            mReservedToplevelNames: []
320          },
321          mExportObfuscation: true,
322          mKeepFileSourceCode: {
323            mKeepSourceOfPaths: new Set(),
324            mkeepFilesAndDependencies: new Set(["test/ut/utils/module_exports_test/exportFile3.js"]),
325          }
326        }, true);
327      let reservedProperties = projectAndLibs.exportNameAndPropSet == undefined? new Set<string> : projectAndLibs.exportNameAndPropSet;
328      let reservedExportNames = projectAndLibs.exportNameSet == undefined? new Set<string> : projectAndLibs.exportNameSet;
329      assert.strictEqual(reservedExportNames.has('projectPropertyAssignment1'), false);
330      assert.strictEqual(reservedExportNames.has('projectPropertyAssignment2'), false);
331      assert.strictEqual(reservedExportNames.has('projectPropertyAssignment3'), false);
332      assert.strictEqual(reservedExportNames.has('projectPropertyAssignment4'), false);
333      assert.strictEqual(reservedExportNames.has('projectIndirectObj'), false);
334      assert.strictEqual(reservedExportNames.has('indirectProp1'), false);
335      assert.strictEqual(reservedExportNames.has('projectShorthand'), false);
336      assert.strictEqual(reservedExportNames.has('projectShorthandProp'), false);
337      assert.strictEqual(reservedExportNames.has('projectMethod1'), false);
338      assert.strictEqual(reservedExportNames.has('projectMethod2'), false);
339      assert.strictEqual(reservedExportNames.has('projectMethod3'), false);
340      assert.strictEqual(reservedExportNames.has('projectGetProp1'), false);
341      assert.strictEqual(reservedExportNames.has('projectGetProp2'), false);
342      assert.strictEqual(reservedExportNames.has('projectGetProp3'), false);
343      assert.strictEqual(reservedExportNames.has('projectSetProp1'), false);
344      assert.strictEqual(reservedExportNames.has('projectSetProp2'), false);
345      assert.strictEqual(reservedExportNames.has('projectSetProp3'), false);
346      assert.strictEqual(reservedExportNames.has('projectExportElement1'), false);
347      assert.strictEqual(reservedExportNames.has('projectExportElement2'), false);
348      assert.strictEqual(reservedExportNames.has('indirectClass1'), false);
349      assert.strictEqual(reservedExportNames.has('indirectProp2'), false);
350      assert.strictEqual(reservedExportNames.has('projectExportElement3'), false);
351      assert.strictEqual(reservedExportNames.has('indirectClass2'), false);
352      assert.strictEqual(reservedExportNames.has('indirectProp3'), false);
353      assert.strictEqual(reservedExportNames.has('projectExportElement4'), false);
354      assert.strictEqual(reservedExportNames.has('indirectProp4'), false);
355      assert.strictEqual(reservedExportNames.has('projectExportElement5'), false);
356      assert.strictEqual(reservedExportNames.has('projectExportElement6'), false);
357      assert.strictEqual(reservedExportNames.has('projectExportElement7'), false);
358      assert.strictEqual(reservedExportNames.has('indirectClass3'), false);
359      assert.strictEqual(reservedExportNames.has('indirectProp5'), false);
360      assert.strictEqual(reservedExportNames.has('projectExportElement8'), false);
361      assert.strictEqual(reservedExportNames.has('indirectClass4'), false);
362      assert.strictEqual(reservedExportNames.has('indirectProp6'), false);
363      assert.strictEqual(reservedExportNames.has('projectExportElement9'), false);
364      assert.strictEqual(reservedExportNames.has('indirectProp7'), false);
365      assert.strictEqual(reservedExportNames.has('ohPropertyAssignment1'), true);
366      assert.strictEqual(reservedExportNames.has('ohPropertyAssignment2'), true);
367      assert.strictEqual(reservedExportNames.has('ohPropertyAssignment3'), true);
368      assert.strictEqual(reservedExportNames.has('ohPropertyAssignment4'), true);
369      assert.strictEqual(reservedExportNames.has('ohIndirectObj'), false);
370      assert.strictEqual(reservedExportNames.has('ohIndirectProp1'), false);
371      assert.strictEqual(reservedExportNames.has('ohShorthand'), true);
372      assert.strictEqual(reservedExportNames.has('ohShorthandProp'), false);
373      assert.strictEqual(reservedExportNames.has('ohMethod1'), true);
374      assert.strictEqual(reservedExportNames.has('ohMethod2'), true);
375      assert.strictEqual(reservedExportNames.has('ohMethod3'), true);
376      assert.strictEqual(reservedExportNames.has('ohGetProp1'), true);
377      assert.strictEqual(reservedExportNames.has('ohGetProp2'), true);
378      assert.strictEqual(reservedExportNames.has('ohGetProp3'), true);
379      assert.strictEqual(reservedExportNames.has('ohSetProp1'), true);
380      assert.strictEqual(reservedExportNames.has('ohSetProp2'), true);
381      assert.strictEqual(reservedExportNames.has('ohSetProp3'), true);
382      assert.strictEqual(reservedExportNames.has('ohExportElement1'), true);
383      assert.strictEqual(reservedExportNames.has('ohExportElement2'), true);
384      assert.strictEqual(reservedExportNames.has('ohIndirectClass1'), true);
385      assert.strictEqual(reservedExportNames.has('ohIndirectProp2'), false);
386      assert.strictEqual(reservedExportNames.has('ohExportElement3'), true);
387      assert.strictEqual(reservedExportNames.has('ohIndirectClass2'), false);
388      assert.strictEqual(reservedExportNames.has('ohIndirectProp3'), false);
389      assert.strictEqual(reservedExportNames.has('ohExportElement4'), true);
390      assert.strictEqual(reservedExportNames.has('ohIndirectProp4'), false);
391      assert.strictEqual(reservedExportNames.has('ohExportElement5'), true);
392      assert.strictEqual(reservedExportNames.has('ohExportElement6'), true);
393      assert.strictEqual(reservedExportNames.has('ohExportElement7'), true);
394      assert.strictEqual(reservedExportNames.has('ohIndirectClass3'), true);
395      assert.strictEqual(reservedExportNames.has('ohIndirectProp5'), false);
396      assert.strictEqual(reservedExportNames.has('ohExportElement8'), true);
397      assert.strictEqual(reservedExportNames.has('ohIndirectClass4'), false);
398      assert.strictEqual(reservedExportNames.has('ohIndirectProp6'), false);
399      assert.strictEqual(reservedExportNames.has('ohExportElement9'), true);
400      assert.strictEqual(reservedExportNames.has('ohIndirectProp7'), false);
401      assert.strictEqual(reservedProperties.size === 0, true);
402    });
403
404    it('test for module.exports(property + export)', function () {
405      let projectAndLibs = readProjectPropertiesByCollectedPaths(fileList,
406        {
407          mNameObfuscation: {
408            mEnable: true,
409            mReservedProperties: [],
410            mRenameProperties: true,
411            mKeepStringProperty: false,
412            mNameGeneratorType: NameGeneratorType.ORDERED,
413            mReservedNames: [], 
414            mReservedToplevelNames: []
415          },
416          mExportObfuscation: true,
417          mKeepFileSourceCode: {
418            mKeepSourceOfPaths: new Set(),
419            mkeepFilesAndDependencies: new Set(["test/ut/utils/module_exports_test/exportFile3.js"]),
420          }
421        }, true);
422      let reservedProperties = projectAndLibs.exportNameAndPropSet == undefined? new Set<string> : projectAndLibs.exportNameAndPropSet;
423      let reservedExportNames = projectAndLibs.exportNameSet == undefined? new Set<string> : projectAndLibs.exportNameSet;
424      assert.strictEqual(reservedProperties.has('projectPropertyAssignment1'), false);
425      assert.strictEqual(reservedProperties.has('projectPropertyAssignment2'), false);
426      assert.strictEqual(reservedProperties.has('projectPropertyAssignment3'), false);
427      assert.strictEqual(reservedProperties.has('projectPropertyAssignment4'), false);
428      assert.strictEqual(reservedProperties.has('projectIndirectObj'), false);
429      assert.strictEqual(reservedProperties.has('indirectProp1'), false);
430      assert.strictEqual(reservedProperties.has('projectShorthand'), false);
431      assert.strictEqual(reservedProperties.has('projectShorthandProp'), false);
432      assert.strictEqual(reservedProperties.has('projectMethod1'), false);
433      assert.strictEqual(reservedProperties.has('projectMethod2'), false);
434      assert.strictEqual(reservedProperties.has('projectMethod3'), false);
435      assert.strictEqual(reservedProperties.has('projectGetProp1'), false);
436      assert.strictEqual(reservedProperties.has('projectGetProp2'), false);
437      assert.strictEqual(reservedProperties.has('projectGetProp3'), false);
438      assert.strictEqual(reservedProperties.has('projectSetProp1'), false);
439      assert.strictEqual(reservedProperties.has('projectSetProp2'), false);
440      assert.strictEqual(reservedProperties.has('projectSetProp3'), false);
441      assert.strictEqual(reservedProperties.has('projectExportElement1'), false);
442      assert.strictEqual(reservedProperties.has('projectExportElement2'), false);
443      assert.strictEqual(reservedProperties.has('indirectClass1'), false);
444      assert.strictEqual(reservedProperties.has('indirectProp2'), false);
445      assert.strictEqual(reservedProperties.has('projectExportElement3'), false);
446      assert.strictEqual(reservedProperties.has('indirectClass2'), false);
447      assert.strictEqual(reservedProperties.has('indirectProp3'), false);
448      assert.strictEqual(reservedProperties.has('projectExportElement4'), false);
449      assert.strictEqual(reservedProperties.has('indirectProp4'), false);
450      assert.strictEqual(reservedProperties.has('projectExportElement5'), false);
451      assert.strictEqual(reservedProperties.has('projectExportElement6'), false);
452      assert.strictEqual(reservedProperties.has('projectExportElement7'), false);
453      assert.strictEqual(reservedProperties.has('indirectClass3'), false);
454      assert.strictEqual(reservedProperties.has('indirectProp5'), false);
455      assert.strictEqual(reservedProperties.has('projectExportElement8'), false);
456      assert.strictEqual(reservedProperties.has('indirectClass4'), false);
457      assert.strictEqual(reservedProperties.has('indirectProp6'), false);
458      assert.strictEqual(reservedProperties.has('projectExportElement9'), false);
459      assert.strictEqual(reservedProperties.has('indirectProp7'), false);
460      assert.strictEqual(reservedProperties.has('ohPropertyAssignment1'), true);
461      assert.strictEqual(reservedProperties.has('ohPropertyAssignment2'), true);
462      assert.strictEqual(reservedProperties.has('ohPropertyAssignment3'), true);
463      assert.strictEqual(reservedProperties.has('ohPropertyAssignment4'), true);
464      assert.strictEqual(reservedProperties.has('ohIndirectObj'), false);
465      assert.strictEqual(reservedProperties.has('ohIndirectProp1'), true);
466      assert.strictEqual(reservedProperties.has('ohShorthand'), true);
467      assert.strictEqual(reservedProperties.has('ohShorthandProp'), true);
468      assert.strictEqual(reservedProperties.has('ohMethod1'), true);
469      assert.strictEqual(reservedProperties.has('ohMethod2'), true);
470      assert.strictEqual(reservedProperties.has('ohMethod3'), true);
471      assert.strictEqual(reservedProperties.has('ohGetProp1'), true);
472      assert.strictEqual(reservedProperties.has('ohGetProp2'), true);
473      assert.strictEqual(reservedProperties.has('ohGetProp3'), true);
474      assert.strictEqual(reservedProperties.has('ohSetProp1'), true);
475      assert.strictEqual(reservedProperties.has('ohSetProp2'), true);
476      assert.strictEqual(reservedProperties.has('ohSetProp3'), true);
477      assert.strictEqual(reservedProperties.has('ohExportElement1'), true);
478      assert.strictEqual(reservedProperties.has('ohExportElement2'), true);
479      assert.strictEqual(reservedProperties.has('ohIndirectClass1'), false);
480      assert.strictEqual(reservedProperties.has('ohIndirectProp2'), true);
481      assert.strictEqual(reservedProperties.has('ohExportElement3'), true);
482      assert.strictEqual(reservedProperties.has('ohIndirectClass2'), false);
483      assert.strictEqual(reservedProperties.has('ohIndirectProp3'), true);
484      assert.strictEqual(reservedProperties.has('ohExportElement4'), true);
485      assert.strictEqual(reservedProperties.has('ohIndirectProp4'), true);
486      assert.strictEqual(reservedProperties.has('ohExportElement5'), true);
487      assert.strictEqual(reservedProperties.has('ohExportElement6'), true);
488      assert.strictEqual(reservedProperties.has('ohExportElement7'), true);
489      assert.strictEqual(reservedProperties.has('ohIndirectClass3'), false);
490      assert.strictEqual(reservedProperties.has('ohIndirectProp5'), true);
491      assert.strictEqual(reservedProperties.has('ohExportElement8'), true);
492      assert.strictEqual(reservedProperties.has('ohIndirectClass4'), false);
493      assert.strictEqual(reservedProperties.has('ohIndirectProp6'), true);
494      assert.strictEqual(reservedExportNames.has('projectPropertyAssignment1'), false);
495      assert.strictEqual(reservedExportNames.has('projectPropertyAssignment2'), false);
496      assert.strictEqual(reservedExportNames.has('projectPropertyAssignment3'), false);
497      assert.strictEqual(reservedExportNames.has('projectPropertyAssignment4'), false);
498      assert.strictEqual(reservedExportNames.has('projectIndirectObj'), false);
499      assert.strictEqual(reservedExportNames.has('indirectProp1'), false);
500      assert.strictEqual(reservedExportNames.has('projectShorthand'), false);
501      assert.strictEqual(reservedExportNames.has('projectShorthandProp'), false);
502      assert.strictEqual(reservedExportNames.has('projectMethod1'), false);
503      assert.strictEqual(reservedExportNames.has('projectMethod2'), false);
504      assert.strictEqual(reservedExportNames.has('projectMethod3'), false);
505      assert.strictEqual(reservedExportNames.has('projectGetProp1'), false);
506      assert.strictEqual(reservedExportNames.has('projectGetProp2'), false);
507      assert.strictEqual(reservedExportNames.has('projectGetProp3'), false);
508      assert.strictEqual(reservedExportNames.has('projectSetProp1'), false);
509      assert.strictEqual(reservedExportNames.has('projectSetProp2'), false);
510      assert.strictEqual(reservedExportNames.has('projectSetProp3'), false);
511      assert.strictEqual(reservedExportNames.has('projectExportElement1'), false);
512      assert.strictEqual(reservedExportNames.has('projectExportElement2'), false);
513      assert.strictEqual(reservedExportNames.has('indirectClass1'), false);
514      assert.strictEqual(reservedExportNames.has('indirectProp2'), false);
515      assert.strictEqual(reservedExportNames.has('projectExportElement3'), false);
516      assert.strictEqual(reservedExportNames.has('indirectClass2'), false);
517      assert.strictEqual(reservedExportNames.has('indirectProp3'), false);
518      assert.strictEqual(reservedExportNames.has('projectExportElement4'), false);
519      assert.strictEqual(reservedExportNames.has('indirectProp4'), false);
520      assert.strictEqual(reservedExportNames.has('projectExportElement5'), false);
521      assert.strictEqual(reservedExportNames.has('projectExportElement6'), false);
522      assert.strictEqual(reservedExportNames.has('projectExportElement7'), false);
523      assert.strictEqual(reservedExportNames.has('indirectClass3'), false);
524      assert.strictEqual(reservedExportNames.has('indirectProp5'), false);
525      assert.strictEqual(reservedExportNames.has('projectExportElement8'), false);
526      assert.strictEqual(reservedExportNames.has('indirectClass4'), false);
527      assert.strictEqual(reservedExportNames.has('indirectProp6'), false);
528      assert.strictEqual(reservedExportNames.has('projectExportElement9'), false);
529      assert.strictEqual(reservedExportNames.has('indirectProp7'), false);
530      assert.strictEqual(reservedExportNames.has('ohPropertyAssignment1'), true);
531      assert.strictEqual(reservedExportNames.has('ohPropertyAssignment2'), true);
532      assert.strictEqual(reservedExportNames.has('ohPropertyAssignment3'), true);
533      assert.strictEqual(reservedExportNames.has('ohPropertyAssignment4'), true);
534      assert.strictEqual(reservedExportNames.has('ohIndirectObj'), false);
535      assert.strictEqual(reservedExportNames.has('ohIndirectProp1'), false);
536      assert.strictEqual(reservedExportNames.has('ohShorthand'), true);
537      assert.strictEqual(reservedExportNames.has('ohShorthandProp'), false);
538      assert.strictEqual(reservedExportNames.has('ohMethod1'), true);
539      assert.strictEqual(reservedExportNames.has('ohMethod2'), true);
540      assert.strictEqual(reservedExportNames.has('ohMethod3'), true);
541      assert.strictEqual(reservedExportNames.has('ohGetProp1'), true);
542      assert.strictEqual(reservedExportNames.has('ohGetProp2'), true);
543      assert.strictEqual(reservedExportNames.has('ohGetProp3'), true);
544      assert.strictEqual(reservedExportNames.has('ohSetProp1'), true);
545      assert.strictEqual(reservedExportNames.has('ohSetProp2'), true);
546      assert.strictEqual(reservedExportNames.has('ohSetProp3'), true);
547      assert.strictEqual(reservedExportNames.has('ohExportElement1'), true);
548      assert.strictEqual(reservedExportNames.has('ohExportElement2'), true);
549      assert.strictEqual(reservedExportNames.has('ohIndirectClass1'), true);
550      assert.strictEqual(reservedExportNames.has('ohIndirectProp2'), false);
551      assert.strictEqual(reservedExportNames.has('ohExportElement3'), true);
552      assert.strictEqual(reservedExportNames.has('ohIndirectClass2'), false);
553      assert.strictEqual(reservedExportNames.has('ohIndirectProp3'), false);
554      assert.strictEqual(reservedExportNames.has('ohExportElement4'), true);
555      assert.strictEqual(reservedExportNames.has('ohIndirectProp4'), false);
556      assert.strictEqual(reservedExportNames.has('ohExportElement5'), true);
557      assert.strictEqual(reservedExportNames.has('ohExportElement6'), true);
558      assert.strictEqual(reservedExportNames.has('ohExportElement7'), true);
559      assert.strictEqual(reservedExportNames.has('ohIndirectClass3'), true);
560      assert.strictEqual(reservedExportNames.has('ohIndirectProp5'), false);
561      assert.strictEqual(reservedExportNames.has('ohExportElement8'), true);
562      assert.strictEqual(reservedExportNames.has('ohIndirectClass4'), false);
563      assert.strictEqual(reservedExportNames.has('ohIndirectProp6'), false);
564      assert.strictEqual(reservedExportNames.has('ohExportElement9'), true);
565      assert.strictEqual(reservedExportNames.has('ohIndirectProp7'), false);
566    });
567  });
568});