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