17c804472Sopenharmony_ci/*
27c804472Sopenharmony_ci * Copyright (c) 2023 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 type { SourceFile } from 'typescript';
177c804472Sopenharmony_ciimport { SyntaxKind } from 'typescript';
187c804472Sopenharmony_ciimport { firstCharacterToUppercase, getClassNameSet, specialType } from '../common/commonUtils';
197c804472Sopenharmony_ciimport type { ReturnTypeEntity } from '../common/commonUtils';
207c804472Sopenharmony_ciimport { getImportDeclarationArray } from '../declaration-node/importAndExportDeclaration';
217c804472Sopenharmony_ciimport type { ImportElementEntity } from '../declaration-node/importAndExportDeclaration';
227c804472Sopenharmony_ciimport type { MethodEntity } from '../declaration-node/methodDeclaration';
237c804472Sopenharmony_ciimport type { FunctionEntity } from '../declaration-node/functionDeclaration';
247c804472Sopenharmony_ciimport type { MethodSignatureEntity } from '../declaration-node/methodSignatureDeclaration';
257c804472Sopenharmony_ci
267c804472Sopenharmony_ciconst repeatReturn = `} else {
277c804472Sopenharmony_ci        return {
287c804472Sopenharmony_ci          done: true
297c804472Sopenharmony_ci        };
307c804472Sopenharmony_ci      }`;
317c804472Sopenharmony_ci
327c804472Sopenharmony_ciconst repeatString = `index++;
337c804472Sopenharmony_ci        return {
347c804472Sopenharmony_ci          value: returnValue,
357c804472Sopenharmony_ci          done: false
367c804472Sopenharmony_ci        };
377c804472Sopenharmony_ci      ${repeatReturn}
387c804472Sopenharmony_ci    }
397c804472Sopenharmony_ci  };`;
407c804472Sopenharmony_ci
417c804472Sopenharmony_ciconst iteratorEntriesMock = `
427c804472Sopenharmony_ci  let index = 0;
437c804472Sopenharmony_ci  const IteratorEntriesMock = {
447c804472Sopenharmony_ci    *[Symbol.iterator]() {
457c804472Sopenharmony_ci      yield ['[PC Preview] unknown paramIterMock_K', '[PC Preview] unknown paramIterMock_V'];
467c804472Sopenharmony_ci    },
477c804472Sopenharmony_ci    next: () => {
487c804472Sopenharmony_ci      if (index < 1) {
497c804472Sopenharmony_ci        const returnValue = ['[PC Previwe] unknown paramIterMock_K', '[PC Previwe] unknown paramIterMock_V'];
507c804472Sopenharmony_ci        ${repeatString}
517c804472Sopenharmony_ci  return IteratorEntriesMock;
527c804472Sopenharmony_ci`;
537c804472Sopenharmony_ci
547c804472Sopenharmony_ciconst iteratorStringMock = `
557c804472Sopenharmony_ci  let index = 0;
567c804472Sopenharmony_ci  const IteratorStringMock = {
577c804472Sopenharmony_ci    *[Symbol.iterator]() {
587c804472Sopenharmony_ci      yield '[PC Preview] unknown string';
597c804472Sopenharmony_ci    },
607c804472Sopenharmony_ci    next: () => {
617c804472Sopenharmony_ci      if (index < 1) {
627c804472Sopenharmony_ci        const returnValue = '[PC Previwe] unknown string';
637c804472Sopenharmony_ci        ${repeatString}
647c804472Sopenharmony_ci  return IteratorStringMock;
657c804472Sopenharmony_ci`;
667c804472Sopenharmony_ci
677c804472Sopenharmony_ci/**
687c804472Sopenharmony_ci * get warn console template
697c804472Sopenharmony_ci * @param interfaceNameOrClassName
707c804472Sopenharmony_ci * @param functionNameOrPropertyName
717c804472Sopenharmony_ci * @returns
727c804472Sopenharmony_ci */
737c804472Sopenharmony_ciexport function getWarnConsole(interfaceNameOrClassName: string, functionNameOrPropertyName: string): string {
747c804472Sopenharmony_ci  return `console.warn('The ${interfaceNameOrClassName}.${functionNameOrPropertyName} interface in the Previewer is a mocked implementation and may behave differently than on a real device.');\n`;
757c804472Sopenharmony_ci}
767c804472Sopenharmony_ci
777c804472Sopenharmony_cifunction handlePromiseParams(returnType: ReturnTypeEntity): string {
787c804472Sopenharmony_ci  const returnKindName = returnType.returnKindName.slice(0, returnType.returnKindName.length - 1).slice(8).trim();
797c804472Sopenharmony_ci  let returnName = `return new Promise((resolve, reject) => {
807c804472Sopenharmony_ci    resolve('[PC Preview] unknown type');
817c804472Sopenharmony_ci  })`;
827c804472Sopenharmony_ci  Object.keys(paramsTypeStart).forEach(key => {
837c804472Sopenharmony_ci    if (returnKindName.startsWith(key)) {
847c804472Sopenharmony_ci      const data = paramsTypeStart[key] === '[PC Preview] unknown type' ? `'${paramsTypeStart[key]}'` : `${paramsTypeStart[key]}`;
857c804472Sopenharmony_ci      returnName = `return new Promise((resolve, reject) => {
867c804472Sopenharmony_ci        resolve(${data});
877c804472Sopenharmony_ci      })`;
887c804472Sopenharmony_ci    }
897c804472Sopenharmony_ci  });
907c804472Sopenharmony_ci  return returnName;
917c804472Sopenharmony_ci}
927c804472Sopenharmony_ci
937c804472Sopenharmony_ci/**
947c804472Sopenharmony_ci * generate return statement;
957c804472Sopenharmony_ci * @param returnType
967c804472Sopenharmony_ci * @param sourceFile
977c804472Sopenharmony_ci * @returns
987c804472Sopenharmony_ci */
997c804472Sopenharmony_ciexport function getReturnStatement(returnType: ReturnTypeEntity, sourceFile: SourceFile): string {
1007c804472Sopenharmony_ci  if (returnType.returnKind === SyntaxKind.TypeReference) {
1017c804472Sopenharmony_ci    return handleTypeReferenceReturnBody(returnType, sourceFile);
1027c804472Sopenharmony_ci  } else if (returnType.returnKind === SyntaxKind.UnionType) {
1037c804472Sopenharmony_ci    return handleUnionTypeReturnBody(returnType);
1047c804472Sopenharmony_ci  }
1057c804472Sopenharmony_ci  let returnName = returnType.returnKindName.trim();
1067c804472Sopenharmony_ci  let temp = true;
1077c804472Sopenharmony_ci  if (returnName.endsWith(']')) {
1087c804472Sopenharmony_ci    returnName = '[]';
1097c804472Sopenharmony_ci    temp = false;
1107c804472Sopenharmony_ci  } else {
1117c804472Sopenharmony_ci    Object.keys(paramsTypeStart).forEach(key => {
1127c804472Sopenharmony_ci      if (returnType.returnKindName.startsWith(key)) {
1137c804472Sopenharmony_ci        returnName = paramsTypeStart[key];
1147c804472Sopenharmony_ci        temp = false;
1157c804472Sopenharmony_ci      }
1167c804472Sopenharmony_ci    });
1177c804472Sopenharmony_ci  }
1187c804472Sopenharmony_ci  if (temp) {
1197c804472Sopenharmony_ci    return 'return \'[PC Preview] unknown type\'';
1207c804472Sopenharmony_ci  }
1217c804472Sopenharmony_ci  return `return ${returnName};`;
1227c804472Sopenharmony_ci}
1237c804472Sopenharmony_ci
1247c804472Sopenharmony_ci/**
1257c804472Sopenharmony_ci * TypeReference return statement;
1267c804472Sopenharmony_ci * @param returnType
1277c804472Sopenharmony_ci * @param sourceFile
1287c804472Sopenharmony_ci * @returns
1297c804472Sopenharmony_ci */
1307c804472Sopenharmony_cifunction handleTypeReferenceReturnBody(returnType: ReturnTypeEntity, sourceFile: SourceFile): string {
1317c804472Sopenharmony_ci  if (returnType.returnKindName.startsWith('Promise')) {
1327c804472Sopenharmony_ci    return handlePromiseParams(returnType);
1337c804472Sopenharmony_ci  }
1347c804472Sopenharmony_ci  const judgmentResult = judgmentReturnBody(returnType);
1357c804472Sopenharmony_ci  if (judgmentResult !== '') {
1367c804472Sopenharmony_ci    return judgmentResult;
1377c804472Sopenharmony_ci  }
1387c804472Sopenharmony_ci  const substepResult = substepReturnBody(returnType);
1397c804472Sopenharmony_ci  if (substepResult !== '') {
1407c804472Sopenharmony_ci    return substepResult;
1417c804472Sopenharmony_ci  }
1427c804472Sopenharmony_ci  if (returnType.returnKindName.includes('<')) {
1437c804472Sopenharmony_ci    return returnType.returnKindName.includes(',')
1447c804472Sopenharmony_ci      ? 'return {};'
1457c804472Sopenharmony_ci      : `return new ${returnType.returnKindName.split('<')[0]}()`;
1467c804472Sopenharmony_ci  } else {
1477c804472Sopenharmony_ci    return generateReturnType(returnType, sourceFile);
1487c804472Sopenharmony_ci  }
1497c804472Sopenharmony_ci}
1507c804472Sopenharmony_ci
1517c804472Sopenharmony_ci/**
1527c804472Sopenharmony_ci * generate return type
1537c804472Sopenharmony_ci * @param returnType
1547c804472Sopenharmony_ci * @param sourceFile
1557c804472Sopenharmony_ci * @returns
1567c804472Sopenharmony_ci */
1577c804472Sopenharmony_cifunction generateReturnType(returnType: ReturnTypeEntity, sourceFile: SourceFile): string {
1587c804472Sopenharmony_ci  if (getClassNameSet().has(returnType.returnKindName) && !specialType.includes(returnType.returnKindName)) {
1597c804472Sopenharmony_ci    return returnType.returnKindName === 'Want'
1607c804472Sopenharmony_ci      ? 'return mockWant().Want'
1617c804472Sopenharmony_ci      : `return new ${returnType.returnKindName}()`;
1627c804472Sopenharmony_ci  } else if (getClassNameSet().has(returnType.returnKindName) && specialType.includes(returnType.returnKindName)) {
1637c804472Sopenharmony_ci    return `return ${returnType.returnKindName}`;
1647c804472Sopenharmony_ci  } else if (propertyTypeWhiteList(returnType.returnKindName) === returnType.returnKindName) {
1657c804472Sopenharmony_ci    return `return ${getTheRealReferenceFromImport(sourceFile, returnType.returnKindName)}`;
1667c804472Sopenharmony_ci  } else {
1677c804472Sopenharmony_ci    return `return ${propertyTypeWhiteList(returnType.returnKindName)}`;
1687c804472Sopenharmony_ci  }
1697c804472Sopenharmony_ci}
1707c804472Sopenharmony_ci
1717c804472Sopenharmony_cifunction judgmentReturnBody(returnType: ReturnTypeEntity): string {
1727c804472Sopenharmony_ci  if (returnType.returnKindName === 'T') {
1737c804472Sopenharmony_ci    return 'return \'[PC Preview] unknown type\'';
1747c804472Sopenharmony_ci  } else if (returnType.returnKindName === 'object' || returnType.returnKindName === 'Object') {
1757c804472Sopenharmony_ci    return 'return {}';
1767c804472Sopenharmony_ci  } else if (returnType.returnKindName === 'Function') {
1777c804472Sopenharmony_ci    return 'return \'[PC Preview] unknown type\'';
1787c804472Sopenharmony_ci  } else if (returnType.returnKindName === 'String' || returnType.returnKindName === 'string') {
1797c804472Sopenharmony_ci    return `return ${returnType.returnKindName}(...args)`;
1807c804472Sopenharmony_ci  } else if (returnType.returnKindName === 'number' || returnType.returnKindName === 'Number') {
1817c804472Sopenharmony_ci    return 'return 0';
1827c804472Sopenharmony_ci  } else if (returnType.returnKindName === 'boolean' || returnType.returnKindName === 'Boolean') {
1837c804472Sopenharmony_ci    return 'return false';
1847c804472Sopenharmony_ci  } else if (returnType.returnKindName === 'ArrayBuffer') {
1857c804472Sopenharmony_ci    return `return new ${returnType.returnKindName}(0)`;
1867c804472Sopenharmony_ci  } else {
1877c804472Sopenharmony_ci    return '';
1887c804472Sopenharmony_ci  }
1897c804472Sopenharmony_ci}
1907c804472Sopenharmony_ci
1917c804472Sopenharmony_cifunction substepReturnBody(returnType: ReturnTypeEntity): string {
1927c804472Sopenharmony_ci  if (returnType.returnKindName.startsWith('Array')) {
1937c804472Sopenharmony_ci    if (returnType.returnKindName.includes('<') && returnType.returnKindName.includes('>')) {
1947c804472Sopenharmony_ci      return `return [${generateGenericTypeToMockValue(returnType.returnKindName)}]`;
1957c804472Sopenharmony_ci    } else {
1967c804472Sopenharmony_ci      return `return new ${returnType.returnKindName}()`;
1977c804472Sopenharmony_ci    }
1987c804472Sopenharmony_ci  } else if (returnType.returnKindName.startsWith('Readonly')) {
1997c804472Sopenharmony_ci    return `return ${returnType.returnKindName.split('<')[1].split('>')[0]}`;
2007c804472Sopenharmony_ci  } else if (checkIsGenericSymbol(returnType.returnKindName)) {
2017c804472Sopenharmony_ci    return `return '[PC Preview] unknown iterableiterator_${returnType.returnKindName}'`;
2027c804472Sopenharmony_ci  } else if (returnType.returnKindName.startsWith('Uint8Array')) {
2037c804472Sopenharmony_ci    return `return new ${returnType.returnKindName}()`;
2047c804472Sopenharmony_ci  } else if (returnType.returnKindName.startsWith('IterableIterator')) {
2057c804472Sopenharmony_ci    return returnType.returnKindName.includes(',') ? iteratorEntriesMock : iteratorStringMock;
2067c804472Sopenharmony_ci  } else if (returnType.returnKindName.includes('<T>')) {
2077c804472Sopenharmony_ci    const tmpReturn = returnType.returnKindName.split('<')[0];
2087c804472Sopenharmony_ci    return tmpReturn.startsWith('Array') ? 'return []' : 'return {}';
2097c804472Sopenharmony_ci  } else {
2107c804472Sopenharmony_ci    return '';
2117c804472Sopenharmony_ci  }
2127c804472Sopenharmony_ci}
2137c804472Sopenharmony_ci
2147c804472Sopenharmony_ci/**
2157c804472Sopenharmony_ci * UnionType return statement;
2167c804472Sopenharmony_ci * @param returnType
2177c804472Sopenharmony_ci * @returns
2187c804472Sopenharmony_ci */
2197c804472Sopenharmony_cifunction handleUnionTypeReturnBody(returnType: ReturnTypeEntity): string {
2207c804472Sopenharmony_ci  const returnNames = returnType.returnKindName.split('|');
2217c804472Sopenharmony_ci  let returnName = returnNames[0];
2227c804472Sopenharmony_ci  for (let i = 0; i < returnNames.length; i++) {
2237c804472Sopenharmony_ci    if (!returnNames[i].includes('[]') && !returnNames[i].includes('<')) {
2247c804472Sopenharmony_ci      returnName = returnNames[i];
2257c804472Sopenharmony_ci      break;
2267c804472Sopenharmony_ci    }
2277c804472Sopenharmony_ci  }
2287c804472Sopenharmony_ci  if (returnName.trim() === 'void') {
2297c804472Sopenharmony_ci    return '';
2307c804472Sopenharmony_ci  }
2317c804472Sopenharmony_ci  if (getClassNameSet().has(returnName)) {
2327c804472Sopenharmony_ci    return `return new ${returnName}()`;
2337c804472Sopenharmony_ci  } else {
2347c804472Sopenharmony_ci    return `return ${getBaseReturnValue(returnName.trim())}`;
2357c804472Sopenharmony_ci  }
2367c804472Sopenharmony_ci}
2377c804472Sopenharmony_ci
2387c804472Sopenharmony_ci/**
2397c804472Sopenharmony_ci * special property whitelist
2407c804472Sopenharmony_ci * @param propertyTypeName
2417c804472Sopenharmony_ci * @returns
2427c804472Sopenharmony_ci */
2437c804472Sopenharmony_ciexport function propertyTypeWhiteList(propertyTypeName: string): boolean | number | string {
2447c804472Sopenharmony_ci  const whiteList = ['GLboolean', 'GLuint', 'GLenum', 'GLint', 'NotificationFlags'];
2457c804472Sopenharmony_ci  if (whiteList.includes(propertyTypeName)) {
2467c804472Sopenharmony_ci    if (propertyTypeName === 'NotificationFlags' || propertyTypeName === 'GLenum') {
2477c804472Sopenharmony_ci      return `'[PC Preview] unknown ${propertyTypeName}'`;
2487c804472Sopenharmony_ci    } else if (propertyTypeName === 'GLboolean') {
2497c804472Sopenharmony_ci      return true;
2507c804472Sopenharmony_ci    } else {
2517c804472Sopenharmony_ci      return 0;
2527c804472Sopenharmony_ci    }
2537c804472Sopenharmony_ci  } else {
2547c804472Sopenharmony_ci    return propertyTypeName;
2557c804472Sopenharmony_ci  }
2567c804472Sopenharmony_ci}
2577c804472Sopenharmony_ci
2587c804472Sopenharmony_ci/**
2597c804472Sopenharmony_ci * get basic return value
2607c804472Sopenharmony_ci * @param value
2617c804472Sopenharmony_ci * @returns
2627c804472Sopenharmony_ci */
2637c804472Sopenharmony_ciexport function getBaseReturnValue(value: string): string | number | boolean {
2647c804472Sopenharmony_ci  if (value === 'string') {
2657c804472Sopenharmony_ci    return '\'\'';
2667c804472Sopenharmony_ci  } else if (value === 'number') {
2677c804472Sopenharmony_ci    return 0;
2687c804472Sopenharmony_ci  } else if (value === 'boolean') {
2697c804472Sopenharmony_ci    return true;
2707c804472Sopenharmony_ci  } else if (value === 'Object' || value === 'object') {
2717c804472Sopenharmony_ci    return '{}';
2727c804472Sopenharmony_ci  } else if (checkIsGenericSymbol(value)) {
2737c804472Sopenharmony_ci    return '\'[PC Preview] unknown type\'';
2747c804472Sopenharmony_ci  } else if (value === 'WebGLActiveInfo') {
2757c804472Sopenharmony_ci    return '{size: \'[PC Preview] unknown GLint\', type: 0, name: \'[PC Preview] unknown name\'}';
2767c804472Sopenharmony_ci  } else {
2777c804472Sopenharmony_ci    return value;
2787c804472Sopenharmony_ci  }
2797c804472Sopenharmony_ci}
2807c804472Sopenharmony_ci
2817c804472Sopenharmony_ci/**
2827c804472Sopenharmony_ci * get current sourceFile import data
2837c804472Sopenharmony_ci * @param sourceFile
2847c804472Sopenharmony_ci * @param typeName
2857c804472Sopenharmony_ci * @returns
2867c804472Sopenharmony_ci */
2877c804472Sopenharmony_ciexport function getTheRealReferenceFromImport(sourceFile: SourceFile, typeName: string): string {
2887c804472Sopenharmony_ci  const importArray = getImportDeclarationArray(sourceFile);
2897c804472Sopenharmony_ci  let returnName = '';
2907c804472Sopenharmony_ci  let isFromImport = false;
2917c804472Sopenharmony_ci  let isOhos = false;
2927c804472Sopenharmony_ci  let mockMockName = '';
2937c804472Sopenharmony_ci  importArray.forEach(value => {
2947c804472Sopenharmony_ci    if (typeName.includes('.') && typeName.split('.')[0] === value.importElements) {
2957c804472Sopenharmony_ci      isFromImport = true;
2967c804472Sopenharmony_ci      if (value.importPath.includes('@ohos')) {
2977c804472Sopenharmony_ci        isOhos = true;
2987c804472Sopenharmony_ci      }
2997c804472Sopenharmony_ci      if (value.importElements.trim() === typeName.split('.')[0]) {
3007c804472Sopenharmony_ci        const tmpArr = value.importPath.split('.');
3017c804472Sopenharmony_ci        mockMockName = tmpArr[tmpArr.length - 1].replace(/["']/g, '');
3027c804472Sopenharmony_ci      }
3037c804472Sopenharmony_ci    }
3047c804472Sopenharmony_ci  });
3057c804472Sopenharmony_ci  if (isFromImport) {
3067c804472Sopenharmony_ci    const splitReturnKindName = typeName.split('.');
3077c804472Sopenharmony_ci    let left = '';
3087c804472Sopenharmony_ci    for (let i = 1; i < splitReturnKindName.length; i++) {
3097c804472Sopenharmony_ci      left += `.${splitReturnKindName[i]}`;
3107c804472Sopenharmony_ci    }
3117c804472Sopenharmony_ci    if (isOhos) {
3127c804472Sopenharmony_ci      if (mockMockName === 'observer') {
3137c804472Sopenharmony_ci        returnName = `${mockMockName}()${left}`;
3147c804472Sopenharmony_ci      } else {
3157c804472Sopenharmony_ci        returnName = `mock${firstCharacterToUppercase(mockMockName)}()${left}`;
3167c804472Sopenharmony_ci      }
3177c804472Sopenharmony_ci    }
3187c804472Sopenharmony_ci  } else {
3197c804472Sopenharmony_ci    returnName = getImportTypeAliasNameFromImportElements(importArray, typeName);
3207c804472Sopenharmony_ci  }
3217c804472Sopenharmony_ci  return returnName.split('<')[0];
3227c804472Sopenharmony_ci}
3237c804472Sopenharmony_ci
3247c804472Sopenharmony_ci/**
3257c804472Sopenharmony_ci * get return type alias, for example: {Context as _Context} return _Context
3267c804472Sopenharmony_ci * @param importElementEntity
3277c804472Sopenharmony_ci * @param typeName
3287c804472Sopenharmony_ci * @returns
3297c804472Sopenharmony_ci */
3307c804472Sopenharmony_cifunction getImportTypeAliasNameFromImportElements(
3317c804472Sopenharmony_ci  importElementEntity: ImportElementEntity[],
3327c804472Sopenharmony_ci  typeName: string
3337c804472Sopenharmony_ci): string {
3347c804472Sopenharmony_ci  for (let i = 0; i < importElementEntity.length; i++) {
3357c804472Sopenharmony_ci    if (importElementEntity[i].importElements.includes('_')) {
3367c804472Sopenharmony_ci      const importElements = importElementEntity[i].importElements.replace('{', '').replace('}', '').split(',');
3377c804472Sopenharmony_ci      typeName = getTypeName(importElements, typeName);
3387c804472Sopenharmony_ci    }
3397c804472Sopenharmony_ci  }
3407c804472Sopenharmony_ci  if (typeName === 'Want') {
3417c804472Sopenharmony_ci    typeName = 'mockWant().Want';
3427c804472Sopenharmony_ci  } else if (typeName === 'InputMethodExtensionContext') {
3437c804472Sopenharmony_ci    typeName = 'mockInputMethodExtensionContext().InputMethodExtensionContext';
3447c804472Sopenharmony_ci  } else if (typeName.includes('<') && typeName.includes(',')) {
3457c804472Sopenharmony_ci    typeName = '{}';
3467c804472Sopenharmony_ci  }
3477c804472Sopenharmony_ci  return typeName;
3487c804472Sopenharmony_ci}
3497c804472Sopenharmony_ci
3507c804472Sopenharmony_ci/**
3517c804472Sopenharmony_ci * get type name , for example: {Context as _Context} return _Context
3527c804472Sopenharmony_ci * @param importElements
3537c804472Sopenharmony_ci * @param typeName
3547c804472Sopenharmony_ci * @returns
3557c804472Sopenharmony_ci */
3567c804472Sopenharmony_cifunction getTypeName(importElements: string[], typeName: string): string {
3577c804472Sopenharmony_ci  for (let j = 0; j < importElements.length; j++) {
3587c804472Sopenharmony_ci    const element = importElements[j].trim();
3597c804472Sopenharmony_ci    if (!element) {
3607c804472Sopenharmony_ci      continue;
3617c804472Sopenharmony_ci    }
3627c804472Sopenharmony_ci    if (`_${typeName}` === element.trim()) {
3637c804472Sopenharmony_ci      return `_${typeName}`;
3647c804472Sopenharmony_ci    }
3657c804472Sopenharmony_ci    if (element.includes(' as ') && `_${typeName}` === element.split('as')[1].trim()) {
3667c804472Sopenharmony_ci      return `_${typeName}`;
3677c804472Sopenharmony_ci    }
3687c804472Sopenharmony_ci  }
3697c804472Sopenharmony_ci  return typeName;
3707c804472Sopenharmony_ci}
3717c804472Sopenharmony_ci
3727c804472Sopenharmony_ci/**
3737c804472Sopenharmony_ci * check is generic symbol
3747c804472Sopenharmony_ci * @param type
3757c804472Sopenharmony_ci * @returns
3767c804472Sopenharmony_ci */
3777c804472Sopenharmony_ciexport function checkIsGenericSymbol(type: string): boolean {
3787c804472Sopenharmony_ci  const words = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
3797c804472Sopenharmony_ci  return words.includes(type);
3807c804472Sopenharmony_ci}
3817c804472Sopenharmony_ci
3827c804472Sopenharmony_ci/**
3837c804472Sopenharmony_ci * generate basic type default value
3847c804472Sopenharmony_ci * @param kindName
3857c804472Sopenharmony_ci * @returns
3867c804472Sopenharmony_ci */
3877c804472Sopenharmony_ciexport function generateGenericTypeToMockValue(kindName: string): string | number | boolean {
3887c804472Sopenharmony_ci  const genericTypeName = kindName.split('<')[1].split('>')[0];
3897c804472Sopenharmony_ci  if (genericTypeName === 'string') {
3907c804472Sopenharmony_ci    return '\'\'';
3917c804472Sopenharmony_ci  } else if (genericTypeName === 'number') {
3927c804472Sopenharmony_ci    return 0;
3937c804472Sopenharmony_ci  } else if (genericTypeName === 'boolean') {
3947c804472Sopenharmony_ci    return true;
3957c804472Sopenharmony_ci  } else if (genericTypeName === 'Object' || genericTypeName === 'object') {
3967c804472Sopenharmony_ci    return '{}';
3977c804472Sopenharmony_ci  } else {
3987c804472Sopenharmony_ci    return '';
3997c804472Sopenharmony_ci  }
4007c804472Sopenharmony_ci}
4017c804472Sopenharmony_ci
4027c804472Sopenharmony_ciexport const paramsTypeStart = {
4037c804472Sopenharmony_ci  'void': '\'[PC Preview] unknown type\'',
4047c804472Sopenharmony_ci  'Array': '[]',
4057c804472Sopenharmony_ci  'Object': '{}',
4067c804472Sopenharmony_ci  'object': '{}',
4077c804472Sopenharmony_ci  '{': '{}',
4087c804472Sopenharmony_ci  'string': '""',
4097c804472Sopenharmony_ci  'String': '""',
4107c804472Sopenharmony_ci  'number': 0,
4117c804472Sopenharmony_ci  'Number': 0,
4127c804472Sopenharmony_ci  'boolean': false,
4137c804472Sopenharmony_ci  'Boolean': false,
4147c804472Sopenharmony_ci  'ArrayBuffer': 'new ArrayBuffer(0)',
4157c804472Sopenharmony_ci  'Uint8Array': 'new Uint8Array()',
4167c804472Sopenharmony_ci  'unknown': '\'[PC Preview] unknown type\''
4177c804472Sopenharmony_ci};
4187c804472Sopenharmony_ci
4197c804472Sopenharmony_ciconst removeCallback = (str: string): { type: string; value: string } => {
4207c804472Sopenharmony_ci  const callbackParams = {
4217c804472Sopenharmony_ci    type: 'Callback',
4227c804472Sopenharmony_ci    value: ''
4237c804472Sopenharmony_ci  };
4247c804472Sopenharmony_ci  if (str.startsWith('Callback')) {
4257c804472Sopenharmony_ci    if (str.lastIndexOf('>') < str.lastIndexOf(' | ')) {
4267c804472Sopenharmony_ci      callbackParams.value = str.slice(0, str.lastIndexOf('>')).slice(9).trim();
4277c804472Sopenharmony_ci      callbackParams.type = 'Callback';
4287c804472Sopenharmony_ci    } else {
4297c804472Sopenharmony_ci      callbackParams.value = str.slice(0, str.length - 1).slice(9).trim();
4307c804472Sopenharmony_ci      callbackParams.type = 'Callback';
4317c804472Sopenharmony_ci    }
4327c804472Sopenharmony_ci  } else if (str.startsWith('AsyncCallback')) {
4337c804472Sopenharmony_ci    callbackParams.value = str.slice(0, str.length - 1).slice(14).trim();
4347c804472Sopenharmony_ci    callbackParams.type = 'AsyncCallback';
4357c804472Sopenharmony_ci  }
4367c804472Sopenharmony_ci  let isHaveAnglebrackets = false;
4377c804472Sopenharmony_ci  if (callbackParams.value.includes('<') && callbackParams.value.includes(',')) {
4387c804472Sopenharmony_ci    isHaveAnglebrackets = true;
4397c804472Sopenharmony_ci  }
4407c804472Sopenharmony_ci  if (callbackParams.value.includes(',') && !isHaveAnglebrackets) {
4417c804472Sopenharmony_ci    callbackParams.value = callbackParams.value.split(',')[0].trim();
4427c804472Sopenharmony_ci  }
4437c804472Sopenharmony_ci  return callbackParams;
4447c804472Sopenharmony_ci};
4457c804472Sopenharmony_ci
4467c804472Sopenharmony_ciconst isInImportType = (mockApi: string, value: string): string => {
4477c804472Sopenharmony_ci  let hasDotFirstWorld = '';
4487c804472Sopenharmony_ci  if (value.includes('.')) {
4497c804472Sopenharmony_ci    hasDotFirstWorld = value.split('.')[0].trim();
4507c804472Sopenharmony_ci  }
4517c804472Sopenharmony_ci  if (hasDotFirstWorld && mockApi.includes(`import { mock${firstLetterWord(hasDotFirstWorld)} `)) {
4527c804472Sopenharmony_ci    return 'isHasDotImportMock';
4537c804472Sopenharmony_ci  }
4547c804472Sopenharmony_ci  if (hasDotFirstWorld && mockApi.includes(`import { ${firstLetterWord(hasDotFirstWorld)} `)) {
4557c804472Sopenharmony_ci    return 'isNoHasDotImportMock';
4567c804472Sopenharmony_ci  }
4577c804472Sopenharmony_ci  if (mockApi.includes(`import { mock${firstLetterWord(value)} `)) {
4587c804472Sopenharmony_ci    return 'isImportMock';
4597c804472Sopenharmony_ci  }
4607c804472Sopenharmony_ci  if (mockApi.includes(`import { ${value} `)) {
4617c804472Sopenharmony_ci    return 'isImport';
4627c804472Sopenharmony_ci  }
4637c804472Sopenharmony_ci  return 'noImport';
4647c804472Sopenharmony_ci};
4657c804472Sopenharmony_ci
4667c804472Sopenharmony_ciconst firstLetterWord = (word: string): string => {
4677c804472Sopenharmony_ci  return word.slice(0, 1).toUpperCase() + word.slice(1);
4687c804472Sopenharmony_ci};
4697c804472Sopenharmony_ci
4707c804472Sopenharmony_ciconst hasDotFirstWord = (str: string): string => {
4717c804472Sopenharmony_ci  return str.includes('.') ? str.split('.')[0] : str;
4727c804472Sopenharmony_ci};
4737c804472Sopenharmony_ci
4747c804472Sopenharmony_cifunction callbackHasNoImportType(callbackParams: { type: string; value: string }): string {
4757c804472Sopenharmony_ci  let callbackData = '';
4767c804472Sopenharmony_ci  let paramsTypeHasType = true;
4777c804472Sopenharmony_ci  if (callbackParams.value.endsWith(']')) {
4787c804472Sopenharmony_ci    callbackData = '[]';
4797c804472Sopenharmony_ci  } else {
4807c804472Sopenharmony_ci    Object.keys(paramsTypeStart).forEach(item => {
4817c804472Sopenharmony_ci      if (callbackParams.value.startsWith(item)) {
4827c804472Sopenharmony_ci        callbackData = paramsTypeStart[item];
4837c804472Sopenharmony_ci        paramsTypeHasType = false;
4847c804472Sopenharmony_ci      }
4857c804472Sopenharmony_ci    });
4867c804472Sopenharmony_ci    if (paramsTypeHasType) {
4877c804472Sopenharmony_ci      callbackData = callbackParams.value;
4887c804472Sopenharmony_ci      if (callbackParams.value.includes('<')) {
4897c804472Sopenharmony_ci        callbackData = `${callbackParams.value.split('<')[0]}`;
4907c804472Sopenharmony_ci      }
4917c804472Sopenharmony_ci      if (callbackParams.value.includes('<') && callbackParams.value.includes(',')) {
4927c804472Sopenharmony_ci        callbackData = '{}';
4937c804472Sopenharmony_ci      }
4947c804472Sopenharmony_ci    }
4957c804472Sopenharmony_ci    if (callbackParams.value === 'Date') {
4967c804472Sopenharmony_ci      callbackData = 'new Date()';
4977c804472Sopenharmony_ci    }
4987c804472Sopenharmony_ci    if (callbackParams.value === 'Uint8Array') {
4997c804472Sopenharmony_ci      callbackData = 'new Uint8Array()';
5007c804472Sopenharmony_ci    }
5017c804472Sopenharmony_ci    if (callbackParams.value === 'T') {
5027c804472Sopenharmony_ci      callbackData = '[PC Preview] unknown type';
5037c804472Sopenharmony_ci    }
5047c804472Sopenharmony_ci  }
5057c804472Sopenharmony_ci  return callbackData;
5067c804472Sopenharmony_ci}
5077c804472Sopenharmony_ci
5087c804472Sopenharmony_ci/**
5097c804472Sopenharmony_ci * get callback parameters data
5107c804472Sopenharmony_ci * @returns data: parameters data: type: AsyncCallback or Callback
5117c804472Sopenharmony_ci */
5127c804472Sopenharmony_ciconst setCallbackData = (mockApi: string, paramTypeString: string): { data: string; type: string } => {
5137c804472Sopenharmony_ci  const callbackParams = removeCallback(paramTypeString);
5147c804472Sopenharmony_ci  let callbackData = '';
5157c804472Sopenharmony_ci  let importType = '';
5167c804472Sopenharmony_ci  if (callbackParams.value) {
5177c804472Sopenharmony_ci    importType = isInImportType(mockApi, callbackParams.value);
5187c804472Sopenharmony_ci  }
5197c804472Sopenharmony_ci  if (importType === 'isHasDotImportMock') {
5207c804472Sopenharmony_ci    const upperWord = firstLetterWord(callbackParams.value); // Image.PixelMap
5217c804472Sopenharmony_ci    const firstWord = hasDotFirstWord(upperWord); // Image
5227c804472Sopenharmony_ci    callbackData = `mock${firstWord}()${upperWord.slice(firstWord.length)}`;
5237c804472Sopenharmony_ci  } else if (importType === 'isNoHasDotImportMock') {
5247c804472Sopenharmony_ci    callbackData = callbackParams.value;
5257c804472Sopenharmony_ci  } else if (importType === 'isImportMock') {
5267c804472Sopenharmony_ci    callbackData = `mock${firstLetterWord(callbackParams.value)}()`;
5277c804472Sopenharmony_ci  } else if (importType === 'isImport') {
5287c804472Sopenharmony_ci    callbackData = callbackParams.value;
5297c804472Sopenharmony_ci  } else if (importType === 'noImport') {
5307c804472Sopenharmony_ci    callbackData = callbackHasNoImportType(callbackParams);
5317c804472Sopenharmony_ci  } else {
5327c804472Sopenharmony_ci    callbackData = '[PC Preview] unknown type';
5337c804472Sopenharmony_ci  }
5347c804472Sopenharmony_ci  return {
5357c804472Sopenharmony_ci    data: callbackData,
5367c804472Sopenharmony_ci    type: callbackParams.type
5377c804472Sopenharmony_ci  };
5387c804472Sopenharmony_ci};
5397c804472Sopenharmony_ci
5407c804472Sopenharmony_ci/**
5417c804472Sopenharmony_ci * get callback statement
5427c804472Sopenharmony_ci * @returns callback statement
5437c804472Sopenharmony_ci */
5447c804472Sopenharmony_ciexport function getCallbackStatement(mockApi: string, paramTypeString?: string): string {
5457c804472Sopenharmony_ci  let outPut = `if (args && typeof args[args.length - 1] === 'function') {
5467c804472Sopenharmony_ci    args[args.length - 1].call(this,`;
5477c804472Sopenharmony_ci  const callbackError = "{'code': '','data': '','name': '','message': '','stack': ''}";
5487c804472Sopenharmony_ci  let callbackDataParams = {
5497c804472Sopenharmony_ci    type: '',
5507c804472Sopenharmony_ci    data: '[PC Preview] unknown type'
5517c804472Sopenharmony_ci  };
5527c804472Sopenharmony_ci  if (paramTypeString) {
5537c804472Sopenharmony_ci    callbackDataParams = setCallbackData(mockApi, paramTypeString);
5547c804472Sopenharmony_ci  }
5557c804472Sopenharmony_ci  if (callbackDataParams?.type === 'AsyncCallback') {
5567c804472Sopenharmony_ci    outPut += ` ${callbackError},`;
5577c804472Sopenharmony_ci  }
5587c804472Sopenharmony_ci  outPut +=
5597c804472Sopenharmony_ci    callbackDataParams.data === '[PC Preview] unknown type'
5607c804472Sopenharmony_ci      ? ` '${callbackDataParams.data}');\n}`
5617c804472Sopenharmony_ci      : ` ${callbackDataParams.data});\n}`;
5627c804472Sopenharmony_ci  return outPut;
5637c804472Sopenharmony_ci}
5647c804472Sopenharmony_ci
5657c804472Sopenharmony_ci/**
5667c804472Sopenharmony_ci * get callback statement
5677c804472Sopenharmony_ci * @returns callback statement
5687c804472Sopenharmony_ci */
5697c804472Sopenharmony_ciexport function getOverloadedFunctionCallbackStatement(
5707c804472Sopenharmony_ci  entityArray: Array<FunctionEntity> | Array<MethodEntity> | Array<MethodSignatureEntity>,
5717c804472Sopenharmony_ci  sourceFile: SourceFile,
5727c804472Sopenharmony_ci  mockApi: string
5737c804472Sopenharmony_ci): string {
5747c804472Sopenharmony_ci  let overloadedCallbackBody = '';
5757c804472Sopenharmony_ci  entityArray.forEach(functionBody => {
5767c804472Sopenharmony_ci    let content = '';
5777c804472Sopenharmony_ci    let firstParamContent = '';
5787c804472Sopenharmony_ci    let callbackParamContent = '';
5797c804472Sopenharmony_ci    functionBody.args.forEach(arg => {
5807c804472Sopenharmony_ci      if (
5817c804472Sopenharmony_ci        arg.paramTypeString.startsWith("'") && arg.paramTypeString.endsWith("'") ||
5827c804472Sopenharmony_ci        arg.paramTypeString.startsWith('"') && arg.paramTypeString.endsWith('"')
5837c804472Sopenharmony_ci      ) {
5847c804472Sopenharmony_ci        const paramTypeStringArr = arg.paramTypeString.split('|');
5857c804472Sopenharmony_ci        firstParamContent += `if (args && [${paramTypeStringArr}].includes(args[0])) {\n`;
5867c804472Sopenharmony_ci      }
5877c804472Sopenharmony_ci      if (['callback', 'observercallback', 'listener', 'synccallback'].includes(arg.paramName.toLowerCase())) {
5887c804472Sopenharmony_ci        callbackParamContent += getCallbackBody(mockApi, arg.paramTypeString);
5897c804472Sopenharmony_ci      }
5907c804472Sopenharmony_ci    });
5917c804472Sopenharmony_ci    if (firstParamContent) {
5927c804472Sopenharmony_ci      content = `${firstParamContent}${callbackParamContent}\n}` + content;
5937c804472Sopenharmony_ci    } else {
5947c804472Sopenharmony_ci      content += callbackParamContent;
5957c804472Sopenharmony_ci    }
5967c804472Sopenharmony_ci    overloadedCallbackBody += content;
5977c804472Sopenharmony_ci  });
5987c804472Sopenharmony_ci  overloadedCallbackBody += '\n';
5997c804472Sopenharmony_ci  return overloadedCallbackBody;
6007c804472Sopenharmony_ci}
6017c804472Sopenharmony_ci
6027c804472Sopenharmony_ci/**
6037c804472Sopenharmony_ci * get callback statement
6047c804472Sopenharmony_ci * @returns callback statement
6057c804472Sopenharmony_ci */
6067c804472Sopenharmony_cifunction getCallbackBody(mockApi: string, paramString: string): string {
6077c804472Sopenharmony_ci  let bodyInfo = `if (args && typeof args[args.length - 1] === 'function') {
6087c804472Sopenharmony_ci    args[args.length - 1].call(this,`;
6097c804472Sopenharmony_ci  const callbackError = "{'code': '','data': '','name': '','message': '','stack': ''}";
6107c804472Sopenharmony_ci  if (paramString === 'ErrorCallback') {
6117c804472Sopenharmony_ci    bodyInfo += callbackError + ');\n}';
6127c804472Sopenharmony_ci    return bodyInfo;
6137c804472Sopenharmony_ci  }
6147c804472Sopenharmony_ci  let callbackDataParams = {
6157c804472Sopenharmony_ci    type: '',
6167c804472Sopenharmony_ci    data: '[PC Preview] unknown type'
6177c804472Sopenharmony_ci  };
6187c804472Sopenharmony_ci  if (paramString) {
6197c804472Sopenharmony_ci    callbackDataParams = setCallbackData(mockApi, paramString);
6207c804472Sopenharmony_ci  }
6217c804472Sopenharmony_ci  if (callbackDataParams?.type === 'AsyncCallback') {
6227c804472Sopenharmony_ci    bodyInfo += ` ${callbackError},`;
6237c804472Sopenharmony_ci  }
6247c804472Sopenharmony_ci  bodyInfo +=
6257c804472Sopenharmony_ci    callbackDataParams.data === '[PC Preview] unknown type'
6267c804472Sopenharmony_ci      ? ` '${callbackDataParams.data}');\n`
6277c804472Sopenharmony_ci      : ` ${callbackDataParams.data});\n`;
6287c804472Sopenharmony_ci  bodyInfo += '}';
6297c804472Sopenharmony_ci  return bodyInfo;
6307c804472Sopenharmony_ci}
6317c804472Sopenharmony_ci
6327c804472Sopenharmony_ci/**
6337c804472Sopenharmony_ci * get iterator template string
6347c804472Sopenharmony_ci * @param methodEntity
6357c804472Sopenharmony_ci * @returns
6367c804472Sopenharmony_ci */
6377c804472Sopenharmony_ciexport function generateSymbolIterator(methodEntity: MethodEntity): string {
6387c804472Sopenharmony_ci  let iteratorMethod = '';
6397c804472Sopenharmony_ci  if (methodEntity.returnType.returnKindName.includes('<[')) {
6407c804472Sopenharmony_ci    iteratorMethod += `let index = 0;
6417c804472Sopenharmony_ci    const IteratorMock = {
6427c804472Sopenharmony_ci      next: () => {
6437c804472Sopenharmony_ci        if (index < 1) {
6447c804472Sopenharmony_ci          const returnValue = ['[PC Previwe] unknown iterableiterator_k', '[PC Previwe] unknown iterableiterator_v'];
6457c804472Sopenharmony_ci          index++;
6467c804472Sopenharmony_ci          return {
6477c804472Sopenharmony_ci            value: returnValue,
6487c804472Sopenharmony_ci            done: false
6497c804472Sopenharmony_ci          };
6507c804472Sopenharmony_ci        } else {
6517c804472Sopenharmony_ci          return {
6527c804472Sopenharmony_ci            done: true
6537c804472Sopenharmony_ci          };
6547c804472Sopenharmony_ci        }
6557c804472Sopenharmony_ci      }
6567c804472Sopenharmony_ci    };
6577c804472Sopenharmony_ci    return IteratorMock;`;
6587c804472Sopenharmony_ci  } else {
6597c804472Sopenharmony_ci    iteratorMethod += `let index = 0;
6607c804472Sopenharmony_ci    const IteratorMock = {
6617c804472Sopenharmony_ci      next: () => {
6627c804472Sopenharmony_ci        if (index < 1) {
6637c804472Sopenharmony_ci          index++;
6647c804472Sopenharmony_ci          return {
6657c804472Sopenharmony_ci            value: '[PC Preview] unknown any',
6667c804472Sopenharmony_ci            done: false
6677c804472Sopenharmony_ci          };
6687c804472Sopenharmony_ci        }
6697c804472Sopenharmony_ci        return {
6707c804472Sopenharmony_ci          done: true
6717c804472Sopenharmony_ci        };
6727c804472Sopenharmony_ci      }
6737c804472Sopenharmony_ci    };
6747c804472Sopenharmony_ci    return IteratorMock;`;
6757c804472Sopenharmony_ci  }
6767c804472Sopenharmony_ci
6777c804472Sopenharmony_ci  return iteratorMethod;
6787c804472Sopenharmony_ci}
6797c804472Sopenharmony_ci
6807c804472Sopenharmony_cifunction handleReturnDataNoImportType(returnPromiseParams: string, returnType: ReturnTypeEntity): string {
6817c804472Sopenharmony_ci  let returnData = '';
6827c804472Sopenharmony_ci  if (returnPromiseParams.startsWith('[') || returnPromiseParams.endsWith(']')) {
6837c804472Sopenharmony_ci    returnData = '[]';
6847c804472Sopenharmony_ci  } else {
6857c804472Sopenharmony_ci    let paramsTypeHasType = true;
6867c804472Sopenharmony_ci    Object.keys(paramsTypeStart).forEach(item => {
6877c804472Sopenharmony_ci      if (returnPromiseParams.startsWith(item)) {
6887c804472Sopenharmony_ci        returnData = paramsTypeStart[item];
6897c804472Sopenharmony_ci        paramsTypeHasType = false;
6907c804472Sopenharmony_ci      }
6917c804472Sopenharmony_ci    });
6927c804472Sopenharmony_ci    if (paramsTypeHasType) {
6937c804472Sopenharmony_ci      returnData = returnPromiseParams;
6947c804472Sopenharmony_ci      if (returnPromiseParams.includes('<')) {
6957c804472Sopenharmony_ci        returnData = `${returnPromiseParams.split('<')[0]}`;
6967c804472Sopenharmony_ci      }
6977c804472Sopenharmony_ci      if (returnPromiseParams.includes('<') && returnPromiseParams.includes(',')) {
6987c804472Sopenharmony_ci        returnData = '{}';
6997c804472Sopenharmony_ci      }
7007c804472Sopenharmony_ci    }
7017c804472Sopenharmony_ci    if (returnPromiseParams === 'Date') {
7027c804472Sopenharmony_ci      returnData = 'new Date()';
7037c804472Sopenharmony_ci    }
7047c804472Sopenharmony_ci    if (returnPromiseParams === 'T') {
7057c804472Sopenharmony_ci      returnData = '"[PC Preview] unknown type"';
7067c804472Sopenharmony_ci    }
7077c804472Sopenharmony_ci    if (returnType.returnKindName.startsWith('Readonly')) {
7087c804472Sopenharmony_ci      returnData = `${returnType.returnKindName.split('<')[1].split('>')[0]}`;
7097c804472Sopenharmony_ci    }
7107c804472Sopenharmony_ci    if (checkIsGenericSymbol(returnType.returnKindName)) {
7117c804472Sopenharmony_ci      returnData = `'[PC Preview] unknown iterableiterator_${returnType.returnKindName}'`;
7127c804472Sopenharmony_ci    }
7137c804472Sopenharmony_ci  }
7147c804472Sopenharmony_ci  return returnData;
7157c804472Sopenharmony_ci}
7167c804472Sopenharmony_ci
7177c804472Sopenharmony_ci/**
7187c804472Sopenharmony_ci * generate more function name return statement;
7197c804472Sopenharmony_ci * @param isReturnPromise
7207c804472Sopenharmony_ci * @param returnType
7217c804472Sopenharmony_ci * @param sourceFile
7227c804472Sopenharmony_ci * @param mockApi
7237c804472Sopenharmony_ci * @returns
7247c804472Sopenharmony_ci */
7257c804472Sopenharmony_ciexport function getReturnData(
7267c804472Sopenharmony_ci  isCallBack: boolean,
7277c804472Sopenharmony_ci  isReturnPromise: boolean,
7287c804472Sopenharmony_ci  returnType: ReturnTypeEntity,
7297c804472Sopenharmony_ci  sourceFile: SourceFile,
7307c804472Sopenharmony_ci  mockApi: string
7317c804472Sopenharmony_ci): string {
7327c804472Sopenharmony_ci  // If the return value is an iterator IterableIterator, then iteratorEntriesMock is directly returned
7337c804472Sopenharmony_ci  if (returnType.returnKindName.startsWith('IterableIterator')) {
7347c804472Sopenharmony_ci    return returnType.returnKindName.includes(',') ? iteratorEntriesMock : iteratorStringMock;
7357c804472Sopenharmony_ci  }
7367c804472Sopenharmony_ci  // If it is a promise, intercept the content of x in promise<x>, which may have the following formats:
7377c804472Sopenharmony_ci  // fun(): y | Promise<y>、 fun(): Promise<x | y | z>、 fun(): Promise<x>、 fun(): Promise<x.y>
7387c804472Sopenharmony_ci  // If it is not a promise, the returned type may be x, x | y | z, x.y
7397c804472Sopenharmony_ci  let returnPromiseParams = returnType.returnKindName;
7407c804472Sopenharmony_ci  if (isReturnPromise) {
7417c804472Sopenharmony_ci    if (returnType.returnKind === SyntaxKind.UnionType) {
7427c804472Sopenharmony_ci      // fun(): y | Promise<y>
7437c804472Sopenharmony_ci      const returnNames = returnPromiseParams.split('|');
7447c804472Sopenharmony_ci      returnPromiseParams = loopReturnNames(returnNames, returnPromiseParams);
7457c804472Sopenharmony_ci    }
7467c804472Sopenharmony_ci    // At this point, obtain the values in these formats: Promise<x | y | z>, Promise<y>, Promise<x.y>, Promise<x>
7477c804472Sopenharmony_ci    const kindName = returnPromiseParams;
7487c804472Sopenharmony_ci    returnPromiseParams = kindName.slice(0, kindName.length - 1).slice(8).trim();
7497c804472Sopenharmony_ci  }
7507c804472Sopenharmony_ci  // At this point, the value type of param in promise<param>may be x, x | y | z, x.y
7517c804472Sopenharmony_ci  if (returnPromiseParams.includes('|')) {
7527c804472Sopenharmony_ci    returnPromiseParams = getSeparatorParam(returnPromiseParams);
7537c804472Sopenharmony_ci  }
7547c804472Sopenharmony_ci
7557c804472Sopenharmony_ci  // At this point, the possible types of promiseParam are x, x.y x [] Array<x>
7567c804472Sopenharmony_ci  // Check if it was imported
7577c804472Sopenharmony_ci  let returnData = '"[PC Preview] unknown type"';
7587c804472Sopenharmony_ci  const importType = isInImportType(mockApi, returnPromiseParams);
7597c804472Sopenharmony_ci  if (importType === 'isHasDotImportMock') {
7607c804472Sopenharmony_ci    const upperWord = firstLetterWord(returnPromiseParams); // Image.PixelMap
7617c804472Sopenharmony_ci    const firstWord = hasDotFirstWord(upperWord); // Image
7627c804472Sopenharmony_ci    returnData = `mock${firstWord}()${upperWord.slice(firstWord.length)}`;
7637c804472Sopenharmony_ci  } else if (importType === 'isNoHasDotImportMock') {
7647c804472Sopenharmony_ci    returnData = returnPromiseParams;
7657c804472Sopenharmony_ci  } else if (importType === 'isImportMock') {
7667c804472Sopenharmony_ci    returnData = `mock${firstLetterWord(returnPromiseParams)}()`;
7677c804472Sopenharmony_ci  } else if (importType === 'isImport') {
7687c804472Sopenharmony_ci    returnData = returnPromiseParams;
7697c804472Sopenharmony_ci  } else if (importType === 'noImport') {
7707c804472Sopenharmony_ci    returnData = handleReturnDataNoImportType(returnPromiseParams, returnType);
7717c804472Sopenharmony_ci  } else {
7727c804472Sopenharmony_ci    returnData = '"[PC Preview] unknown type"';
7737c804472Sopenharmony_ci  }
7747c804472Sopenharmony_ci  const data =
7757c804472Sopenharmony_ci    typeof returnData === 'string' && returnData.startsWith('[PC Preview] unknown')
7767c804472Sopenharmony_ci      ? `'${returnData}'`
7777c804472Sopenharmony_ci      : `${returnData}`;
7787c804472Sopenharmony_ci  if (isReturnPromise) {
7797c804472Sopenharmony_ci    return `
7807c804472Sopenharmony_ci        return new Promise((resolve, reject) => {
7817c804472Sopenharmony_ci          resolve(${data});
7827c804472Sopenharmony_ci        })
7837c804472Sopenharmony_ci      `;
7847c804472Sopenharmony_ci  } else {
7857c804472Sopenharmony_ci    return `return ${data}`;
7867c804472Sopenharmony_ci  }
7877c804472Sopenharmony_ci}
7887c804472Sopenharmony_ci
7897c804472Sopenharmony_ci/**
7907c804472Sopenharmony_ci * loop ReturnNames
7917c804472Sopenharmony_ci * @param returnNames
7927c804472Sopenharmony_ci * @param returnPromiseParams
7937c804472Sopenharmony_ci * @returns
7947c804472Sopenharmony_ci */
7957c804472Sopenharmony_cifunction loopReturnNames(returnNames: string[], returnPromiseParams: string): string {
7967c804472Sopenharmony_ci  for (let i = 0; i < returnNames.length; i++) {
7977c804472Sopenharmony_ci    if (returnNames[i].trim().startsWith('Promise<')) {
7987c804472Sopenharmony_ci      // Promise<y>
7997c804472Sopenharmony_ci      returnPromiseParams = returnNames[i].trim();
8007c804472Sopenharmony_ci      break;
8017c804472Sopenharmony_ci    }
8027c804472Sopenharmony_ci  }
8037c804472Sopenharmony_ci  return returnPromiseParams;
8047c804472Sopenharmony_ci}
8057c804472Sopenharmony_ci
8067c804472Sopenharmony_ci/**
8077c804472Sopenharmony_ci *
8087c804472Sopenharmony_ci * @param returnPromiseParams
8097c804472Sopenharmony_ci * @returns
8107c804472Sopenharmony_ci */
8117c804472Sopenharmony_cifunction getSeparatorParam(returnPromiseParams: string): string {
8127c804472Sopenharmony_ci  let hasObj = '';
8137c804472Sopenharmony_ci  let hasArr = '';
8147c804472Sopenharmony_ci  let hasUint8Array = '';
8157c804472Sopenharmony_ci  let hasArrayBuffer = '';
8167c804472Sopenharmony_ci  let otherValue = '';
8177c804472Sopenharmony_ci  const paramsArr = returnPromiseParams.split('|');
8187c804472Sopenharmony_ci  for (let i = 0; i < paramsArr.length; i++) {
8197c804472Sopenharmony_ci    const param = paramsArr[i].trim();
8207c804472Sopenharmony_ci    if (param.startsWith('{') || param.startsWith('Object')) {
8217c804472Sopenharmony_ci      hasObj = '{}';
8227c804472Sopenharmony_ci    } else if (param.endsWith(']') || param.startsWith('[') || param.startsWith('Array<')) {
8237c804472Sopenharmony_ci      hasArr = '[]';
8247c804472Sopenharmony_ci    } else if (param.startsWith('Uint8Array')) {
8257c804472Sopenharmony_ci      hasUint8Array = 'Uint8Array';
8267c804472Sopenharmony_ci    } else if (param.startsWith('ArrayBuffer')) {
8277c804472Sopenharmony_ci      hasArrayBuffer = 'ArrayBuffer';
8287c804472Sopenharmony_ci    } else {
8297c804472Sopenharmony_ci      if (param !== null) {
8307c804472Sopenharmony_ci        otherValue = param;
8317c804472Sopenharmony_ci      }
8327c804472Sopenharmony_ci    }
8337c804472Sopenharmony_ci  }
8347c804472Sopenharmony_ci  if (hasObj) {
8357c804472Sopenharmony_ci    return hasObj;
8367c804472Sopenharmony_ci  }
8377c804472Sopenharmony_ci  if (hasArr) {
8387c804472Sopenharmony_ci    return hasArr;
8397c804472Sopenharmony_ci  }
8407c804472Sopenharmony_ci  if (hasUint8Array) {
8417c804472Sopenharmony_ci    return hasUint8Array;
8427c804472Sopenharmony_ci  }
8437c804472Sopenharmony_ci  if (hasArrayBuffer) {
8447c804472Sopenharmony_ci    return hasArrayBuffer;
8457c804472Sopenharmony_ci  }
8467c804472Sopenharmony_ci  return otherValue;
8477c804472Sopenharmony_ci}
8487c804472Sopenharmony_ci
8497c804472Sopenharmony_ci/**
8507c804472Sopenharmony_ci *
8517c804472Sopenharmony_ci * @param mockName string
8527c804472Sopenharmony_ci * @param sourceFile SourceFile
8537c804472Sopenharmony_ci * @returns boolean
8547c804472Sopenharmony_ci */
8557c804472Sopenharmony_ciexport function hasExportDefaultKeyword(mockName: string, sourceFile: SourceFile): boolean {
8567c804472Sopenharmony_ci  let fileContent = sourceFile.getText();
8577c804472Sopenharmony_ci  const removeNoteRegx = /\/\*[\s\S]*?\*\//g;
8587c804472Sopenharmony_ci  fileContent = fileContent.replace(removeNoteRegx, '');
8597c804472Sopenharmony_ci  if (
8607c804472Sopenharmony_ci    fileContent.includes(`export default class ${firstCharacterToUppercase(mockName)} `) ||
8617c804472Sopenharmony_ci    fileContent.includes(`export default interface ${firstCharacterToUppercase(mockName)} `) ||
8627c804472Sopenharmony_ci    fileContent.includes(`export default ${firstCharacterToUppercase(mockName)}`)
8637c804472Sopenharmony_ci  ) {
8647c804472Sopenharmony_ci    return false;
8657c804472Sopenharmony_ci  }
8667c804472Sopenharmony_ci  return true;
8677c804472Sopenharmony_ci}
8687c804472Sopenharmony_ci
8697c804472Sopenharmony_ciexport const overloadedFunctionArr = ['on', 'off'];
8707c804472Sopenharmony_ci
8717c804472Sopenharmony_ciexport const needToAddBrace = ['ViewData', 'AutoFillType'];
8727c804472Sopenharmony_ci
8737c804472Sopenharmony_ciexport interface MockFunctionElementEntity {
8747c804472Sopenharmony_ci  elementName: string;
8757c804472Sopenharmony_ci  type: string;
8767c804472Sopenharmony_ci}
8777c804472Sopenharmony_ciexport interface ReturnDataParams {
8787c804472Sopenharmony_ci  mockData: string;
8797c804472Sopenharmony_ci  mockFunctionElements: Array<MockFunctionElementEntity>;
8807c804472Sopenharmony_ci}
881