17c804472Sopenharmony_ci/* 27c804472Sopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 47c804472Sopenharmony_ci * you may not use this file except in compliance with the License. 57c804472Sopenharmony_ci * You may obtain a copy of the License at 67c804472Sopenharmony_ci * 77c804472Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 87c804472Sopenharmony_ci * 97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 127c804472Sopenharmony_ci * See the License for the specific language governing permissions and 137c804472Sopenharmony_ci * limitations under the License. 147c804472Sopenharmony_ci */ 157c804472Sopenharmony_ci 167c804472Sopenharmony_ciimport fs from 'fs'; 177c804472Sopenharmony_ciimport path from 'path'; 187c804472Sopenharmony_ciimport { describe, expect, test } from '@jest/globals'; 197c804472Sopenharmony_ciimport { createSourceFile, ScriptTarget } from 'typescript'; 207c804472Sopenharmony_ciimport { 217c804472Sopenharmony_ci checkIsGenericSymbol, 227c804472Sopenharmony_ci generateGenericTypeToMockValue, 237c804472Sopenharmony_ci generateSymbolIterator, 247c804472Sopenharmony_ci getBaseReturnValue, 257c804472Sopenharmony_ci getCallbackStatement, 267c804472Sopenharmony_ci getOverloadedFunctionCallbackStatement, 277c804472Sopenharmony_ci getReturnData, 287c804472Sopenharmony_ci getReturnStatement, 297c804472Sopenharmony_ci getTheRealReferenceFromImport, 307c804472Sopenharmony_ci getWarnConsole, 317c804472Sopenharmony_ci hasExportDefaultKeyword, 327c804472Sopenharmony_ci propertyTypeWhiteList 337c804472Sopenharmony_ci} from '../generate/generateCommonUtil'; 347c804472Sopenharmony_ci 357c804472Sopenharmony_cidescribe('generateCommonUtil.ts file test', (): void => { 367c804472Sopenharmony_ci test('Test the getWarnConsole function', (): void => { 377c804472Sopenharmony_ci const interfaceNameOrClassName = 'setInterval'; 387c804472Sopenharmony_ci const functionNameOrPropertyName = 'setInterval'; 397c804472Sopenharmony_ci const result = getWarnConsole(interfaceNameOrClassName, functionNameOrPropertyName); 407c804472Sopenharmony_ci const expectedResult = `console.warn('The setInterval.setInterval interface in the Previewer is a mocked implementation and may behave differently than on a real device.'); 417c804472Sopenharmony_ci`; 427c804472Sopenharmony_ci expect(result).toBe(expectedResult); 437c804472Sopenharmony_ci }); 447c804472Sopenharmony_ci 457c804472Sopenharmony_ci test('Test the getReturnStatement function', (): void => { 467c804472Sopenharmony_ci const filePath = path.join(__dirname, './api/global.d.ts'); 477c804472Sopenharmony_ci const code = fs.readFileSync(filePath); 487c804472Sopenharmony_ci const sourceFile = createSourceFile(filePath, code.toString(), ScriptTarget.Latest); 497c804472Sopenharmony_ci const returnType = { 507c804472Sopenharmony_ci returnKind: 144, 517c804472Sopenharmony_ci returnKindName: 'number' 527c804472Sopenharmony_ci }; 537c804472Sopenharmony_ci const result = getReturnStatement(returnType, sourceFile); 547c804472Sopenharmony_ci expect(result).toBe('return 0;'); 557c804472Sopenharmony_ci }); 567c804472Sopenharmony_ci 577c804472Sopenharmony_ci test('Test the propertyTypeWhiteList function', (): void => { 587c804472Sopenharmony_ci const propertyTypeName = 'formBindingData.FormBindingData'; 597c804472Sopenharmony_ci const result = propertyTypeWhiteList(propertyTypeName); 607c804472Sopenharmony_ci expect(result).toBe('formBindingData.FormBindingData'); 617c804472Sopenharmony_ci }); 627c804472Sopenharmony_ci 637c804472Sopenharmony_ci test('Test the getBaseReturnValue function', (): void => { 647c804472Sopenharmony_ci const value = 'rpc.RemoteObject'; 657c804472Sopenharmony_ci const result = getBaseReturnValue(value); 667c804472Sopenharmony_ci expect(result).toBe('rpc.RemoteObject'); 677c804472Sopenharmony_ci }); 687c804472Sopenharmony_ci 697c804472Sopenharmony_ci test('Test the getTheRealReferenceFromImport function', (): void => { 707c804472Sopenharmony_ci const filePath = path.join(__dirname, './api/lifecycle.d.ts'); 717c804472Sopenharmony_ci const code = fs.readFileSync(filePath); 727c804472Sopenharmony_ci const sourceFile = createSourceFile(filePath, code.toString(), ScriptTarget.Latest); 737c804472Sopenharmony_ci const typeName = 'formBindingData.FormBindingData'; 747c804472Sopenharmony_ci const result = getTheRealReferenceFromImport(sourceFile, typeName); 757c804472Sopenharmony_ci expect(result).toBe('mockFormBindingData().FormBindingData'); 767c804472Sopenharmony_ci }); 777c804472Sopenharmony_ci 787c804472Sopenharmony_ci test('Test the checkIsGenericSymbol function', (): void => { 797c804472Sopenharmony_ci const type = 'formBindingData.FormBindingData'; 807c804472Sopenharmony_ci const result = checkIsGenericSymbol(type); 817c804472Sopenharmony_ci expect(result).toBe(false); 827c804472Sopenharmony_ci }); 837c804472Sopenharmony_ci 847c804472Sopenharmony_ci test('Test the generateGenericTypeToMockValue function', (): void => { 857c804472Sopenharmony_ci const kindName = 'Array<AccessibilityAbilityInfo>'; 867c804472Sopenharmony_ci const result = generateGenericTypeToMockValue(kindName); 877c804472Sopenharmony_ci expect(result).toBe(''); 887c804472Sopenharmony_ci }); 897c804472Sopenharmony_ci 907c804472Sopenharmony_ci test('Test the getCallbackStatement function', (): void => { 917c804472Sopenharmony_ci const mockApi = 'import { mockWant } from \'../../ohos_app_ability_Want\'' 927c804472Sopenharmony_ci + 'import { ResultSet } from \'../../data/rdb/resultSet\'' 937c804472Sopenharmony_ci + 'import { AbilityInfo } from \'../../bundle/abilityInfo\'' 947c804472Sopenharmony_ci + 'import { DataAbilityResult } from \'../../ability/dataAbilityResult\'' 957c804472Sopenharmony_ci + 'import { DataAbilityOperation } from \'../../ability/dataAbilityOperation\'' 967c804472Sopenharmony_ci + 'import { mockDataAbility } from \'../../ohos_data_dataAbility\'' 977c804472Sopenharmony_ci + 'import { mockFormBindingData } from \'../../ohos_application_formBindingData\'' 987c804472Sopenharmony_ci + 'import { mockFormInfo } from \'../../ohos_app_form_formInfo\'' 997c804472Sopenharmony_ci + 'import { mockRdb } from \'../../ohos_data_rdb\'' 1007c804472Sopenharmony_ci + 'import { mockRpc } from \'../../ohos_rpc\'' 1017c804472Sopenharmony_ci + 'import { mockResourceManager } from \'../../ohos_resourceManager\'' 1027c804472Sopenharmony_ci + 'import { PacMap } from \'../../ability/dataAbilityHelper\'' 1037c804472Sopenharmony_ci + 'import { AsyncCallback } from \'../../ohos_base\''; 1047c804472Sopenharmony_ci const paramTypeString = 'AsyncCallback<number>'; 1057c804472Sopenharmony_ci const result = getCallbackStatement(mockApi, paramTypeString); 1067c804472Sopenharmony_ci const expectedResult = `if (args && typeof args[args.length - 1] === 'function') { 1077c804472Sopenharmony_ci args[args.length - 1].call(this, {'code': '','data': '','name': '','message': '','stack': ''}, 0); 1087c804472Sopenharmony_ci}`; 1097c804472Sopenharmony_ci expect(result).toBe(expectedResult); 1107c804472Sopenharmony_ci }); 1117c804472Sopenharmony_ci 1127c804472Sopenharmony_ci test('Test the getOverloadedFunctionCallbackStatement function', (): void => { 1137c804472Sopenharmony_ci const filePath = path.join(__dirname, './api/@ohos.account.appAccount.d.ts'); 1147c804472Sopenharmony_ci const code = fs.readFileSync(filePath); 1157c804472Sopenharmony_ci const sourceFile = createSourceFile(filePath, code.toString(), ScriptTarget.Latest); 1167c804472Sopenharmony_ci const mockApi = 'import { AsyncCallback, Callback } from \'./ohos_base\'' 1177c804472Sopenharmony_ci + 'import { mockWant } from \'./ohos_app_ability_Want\'' 1187c804472Sopenharmony_ci + 'import { mockRpc } from \'./ohos_rpc\''; 1197c804472Sopenharmony_ci const entityArray = [ 1207c804472Sopenharmony_ci { 1217c804472Sopenharmony_ci returnType: { 1227c804472Sopenharmony_ci returnKind: 113, 1237c804472Sopenharmony_ci returnKindName: 'void' 1247c804472Sopenharmony_ci }, 1257c804472Sopenharmony_ci args: [ 1267c804472Sopenharmony_ci { 1277c804472Sopenharmony_ci paramName: 'type', 1287c804472Sopenharmony_ci paramTypeKind: 191, 1297c804472Sopenharmony_ci paramTypeString: '\'change\'' 1307c804472Sopenharmony_ci }, 1317c804472Sopenharmony_ci { 1327c804472Sopenharmony_ci paramName: 'owners', 1337c804472Sopenharmony_ci paramTypeKind: 173, 1347c804472Sopenharmony_ci paramTypeString: 'Array<string>' 1357c804472Sopenharmony_ci }, 1367c804472Sopenharmony_ci { 1377c804472Sopenharmony_ci paramName: 'callback', 1387c804472Sopenharmony_ci paramTypeKind: 173, 1397c804472Sopenharmony_ci paramTypeString: 'Callback<Array<AppAccountInfo>>' 1407c804472Sopenharmony_ci } 1417c804472Sopenharmony_ci ], 1427c804472Sopenharmony_ci functionName: 'on' 1437c804472Sopenharmony_ci }, 1447c804472Sopenharmony_ci { 1457c804472Sopenharmony_ci functionName: 'on', 1467c804472Sopenharmony_ci args: [ 1477c804472Sopenharmony_ci { 1487c804472Sopenharmony_ci paramName: 'type', 1497c804472Sopenharmony_ci paramTypeKind: 191, 1507c804472Sopenharmony_ci paramTypeString: '\'accountChange\'' 1517c804472Sopenharmony_ci }, 1527c804472Sopenharmony_ci { 1537c804472Sopenharmony_ci paramName: 'callback', 1547c804472Sopenharmony_ci paramTypeKind: 173, 1557c804472Sopenharmony_ci paramTypeString: 'Callback<Array<AppAccountInfo>>' 1567c804472Sopenharmony_ci }, 1577c804472Sopenharmony_ci { 1587c804472Sopenharmony_ci paramName: 'owners', 1597c804472Sopenharmony_ci paramTypeKind: 173, 1607c804472Sopenharmony_ci paramTypeString: 'Array<string>' 1617c804472Sopenharmony_ci } 1627c804472Sopenharmony_ci ], 1637c804472Sopenharmony_ci returnType: { 1647c804472Sopenharmony_ci returnKind: 113, 1657c804472Sopenharmony_ci returnKindName: 'void' 1667c804472Sopenharmony_ci } 1677c804472Sopenharmony_ci } 1687c804472Sopenharmony_ci ]; 1697c804472Sopenharmony_ci const result = getOverloadedFunctionCallbackStatement(entityArray, sourceFile, mockApi); 1707c804472Sopenharmony_ci const expectedResult = `if (args && ['change'].includes(args[0])) { 1717c804472Sopenharmony_ciif (args && typeof args[args.length - 1] === 'function') { 1727c804472Sopenharmony_ci args[args.length - 1].call(this, []); 1737c804472Sopenharmony_ci} 1747c804472Sopenharmony_ci}if (args && ['accountChange'].includes(args[0])) { 1757c804472Sopenharmony_ciif (args && typeof args[args.length - 1] === 'function') { 1767c804472Sopenharmony_ci args[args.length - 1].call(this, []); 1777c804472Sopenharmony_ci} 1787c804472Sopenharmony_ci} 1797c804472Sopenharmony_ci`; 1807c804472Sopenharmony_ci expect(result).toBe(expectedResult); 1817c804472Sopenharmony_ci }); 1827c804472Sopenharmony_ci 1837c804472Sopenharmony_ci test('Test the generateSymbolIterator function', (): void => { 1847c804472Sopenharmony_ci const methodEntity = { 1857c804472Sopenharmony_ci args: [], 1867c804472Sopenharmony_ci functionName: { 1877c804472Sopenharmony_ci name: 'Symbol.iterator', 1887c804472Sopenharmony_ci kind: 158, 1897c804472Sopenharmony_ci expressionKind: 201 1907c804472Sopenharmony_ci }, 1917c804472Sopenharmony_ci modifiers: [], 1927c804472Sopenharmony_ci returnType: { 1937c804472Sopenharmony_ci returnKindName: 'IterableIterator<[string, string]>', 1947c804472Sopenharmony_ci returnKind: 173 1957c804472Sopenharmony_ci } 1967c804472Sopenharmony_ci }; 1977c804472Sopenharmony_ci const result = generateSymbolIterator(methodEntity); 1987c804472Sopenharmony_ci const expectedResult = `let index = 0; 1997c804472Sopenharmony_ci const IteratorMock = { 2007c804472Sopenharmony_ci next: () => { 2017c804472Sopenharmony_ci if (index < 1) { 2027c804472Sopenharmony_ci const returnValue = ['[PC Previwe] unknown iterableiterator_k', '[PC Previwe] unknown iterableiterator_v']; 2037c804472Sopenharmony_ci index++; 2047c804472Sopenharmony_ci return { 2057c804472Sopenharmony_ci value: returnValue, 2067c804472Sopenharmony_ci done: false 2077c804472Sopenharmony_ci }; 2087c804472Sopenharmony_ci } else { 2097c804472Sopenharmony_ci return { 2107c804472Sopenharmony_ci done: true 2117c804472Sopenharmony_ci }; 2127c804472Sopenharmony_ci } 2137c804472Sopenharmony_ci } 2147c804472Sopenharmony_ci }; 2157c804472Sopenharmony_ci return IteratorMock;`; 2167c804472Sopenharmony_ci expect(result).toBe(expectedResult); 2177c804472Sopenharmony_ci }); 2187c804472Sopenharmony_ci 2197c804472Sopenharmony_ci test('Test the getReturnData function', (): void => { 2207c804472Sopenharmony_ci const filePath = path.join(__dirname, './api/@ohos.account.appAccount.d.ts'); 2217c804472Sopenharmony_ci const code = fs.readFileSync(filePath); 2227c804472Sopenharmony_ci const sourceFile = createSourceFile(filePath, code.toString(), ScriptTarget.Latest); 2237c804472Sopenharmony_ci const returnType = { 2247c804472Sopenharmony_ci returnKind: 113, 2257c804472Sopenharmony_ci returnKindName: 'void' 2267c804472Sopenharmony_ci }; 2277c804472Sopenharmony_ci const mockApi = 'import { AsyncCallback, Callback } from \'./ohos_base\'' 2287c804472Sopenharmony_ci + 'import { mockWant } from \'./ohos_app_ability_Want\'' 2297c804472Sopenharmony_ci + 'import { mockRpc } from \'./ohos_rpc\''; 2307c804472Sopenharmony_ci const result = getReturnData(true, false, returnType, sourceFile, mockApi); 2317c804472Sopenharmony_ci expect(result).toBe(`return '[PC Preview] unknown type'`); 2327c804472Sopenharmony_ci }); 2337c804472Sopenharmony_ci 2347c804472Sopenharmony_ci test('Test the hasExportDefaultKeyword function', (): void => { 2357c804472Sopenharmony_ci const filePath = path.join(__dirname, './api/@ohos.ability.errorCode.d.ts'); 2367c804472Sopenharmony_ci const code = fs.readFileSync(filePath); 2377c804472Sopenharmony_ci const sourceFile = createSourceFile(filePath, code.toString(), ScriptTarget.Latest); 2387c804472Sopenharmony_ci const mockName = 'errorCode'; 2397c804472Sopenharmony_ci const result = hasExportDefaultKeyword(mockName, sourceFile); 2407c804472Sopenharmony_ci expect(result).toBe(true); 2417c804472Sopenharmony_ci }); 2427c804472Sopenharmony_ci}); 243