1/* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use rollupObject 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 16 17import { expect } from 'chai'; 18import mocha from 'mocha'; 19import path from 'path'; 20import fs from 'fs'; 21import ts from 'typescript'; 22import sinon from 'sinon'; 23 24import RollUpPluginMock from '../mock/rollup_mock/rollup_plugin_mock'; 25import { ModuleSourceFile } from '../../../lib/fast_build/ark_compiler/module/module_source_file'; 26import { ModuleInfo } from '../../../lib/fast_build/ark_compiler/module/module_mode'; 27import ModuleModeMock from '../mock/class_mock/module_mode_mock'; 28import { 29 EXPECT_ENTRY_TS, 30 EXPECT_INDEX_ETS, 31 MODULE_TEST_PATH, 32 EXPECT_TO_JS 33} from '../mock/rollup_mock/path_config'; 34import { 35 RELEASE, 36 EXTNAME_ETS, 37 EXTNAME_TS, 38 EXTNAME_JS 39} from '../../../lib/fast_build/ark_compiler/common/ark_define'; 40import { 41 META, 42 ENTRYABILITY_TS_PATH_DEFAULT, 43 INDEX_ETS_PATH_DEFAULT, 44 OHURL_RES, 45 ENTRYABILITY_TS, 46 INDEX_ETS, 47 OHURL_SHAREDLIBRARY, 48 OH_UIABILITY, 49 OH_HILOG 50} from '../mock/rollup_mock/common'; 51import projectConfig from '../utils/processProjectConfig'; 52import { ModuleInfo as ModuleInfoMock } from '../mock/rollup_mock/module_info'; 53import { scanFiles } from "../utils/utils"; 54import { SourceMapGenerator } from '../../../lib/fast_build/ark_compiler/generate_sourcemap'; 55import { 56 TRANSFORMED_MOCK_CONFIG, 57 USER_DEFINE_MOCK_CONFIG 58} from '../../../lib/pre_define'; 59import { 60 ArkTSInternalErrorDescription, 61 ErrorCode 62} from '../../../lib/fast_build/ark_compiler/error_code'; 63import { 64 CommonLogger, 65 LogData, 66 LogDataFactory 67} from '../../../lib/fast_build/ark_compiler/logger'; 68 69const ROLLUP_IMPORT_NODE: string = 'ImportDeclaration'; 70const ROLLUP_EXPORTNAME_NODE: string = 'ExportNamedDeclaration'; 71const ROLLUP_EXPORTALL_NODE: string = 'ExportAllDeclaration'; 72const ROLLUP_DYNAMICIMPORT_NODE: string = 'ImportExpression'; 73const ROLLUP_LITERAL_NODE: string = 'Literal'; 74 75mocha.describe('test module_source_file file api', function () { 76 mocha.before(function () { 77 this.rollup = new RollUpPluginMock(); 78 }); 79 80 mocha.after(() => { 81 delete this.rollup; 82 }); 83 84 mocha.it('1-1-1: test getOhmUrl under build debug: systemOrLibOhmUrl is not undefined', function () { 85 this.rollup.build(); 86 SourceMapGenerator.initInstance(this.rollup); 87 const modeMock = new ModuleModeMock(this.rollup); 88 const mockFileList: object = this.rollup.getModuleIds(); 89 this.moduleInfos = new Map<String, ModuleInfo>(); 90 91 for (const moduleId of mockFileList) { 92 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS) || moduleId.endsWith(EXTNAME_JS)) { 93 const code: string = fs.readFileSync(moduleId, 'utf-8'); 94 const moduleSource = new ModuleSourceFile(moduleId, code); 95 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 96 const metaInfo: object = moduleInfo[META]; 97 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 98 moduleInfo.setImportedIdMaps(); 99 moduleInfo.setNodeImportDeclaration(); 100 const importMap: object = moduleInfo.importedIdMaps; 101 const moduleNodeMap: Map<string, any> = 102 moduleInfo.getNodeByType(ROLLUP_IMPORT_NODE, ROLLUP_EXPORTNAME_NODE, 103 ROLLUP_EXPORTALL_NODE, ROLLUP_DYNAMICIMPORT_NODE); 104 let hasDynamicImport: boolean = false; 105 for (const nodeSet of moduleNodeMap.values()) { 106 nodeSet.forEach(node => { 107 if (!hasDynamicImport && node.type === ROLLUP_DYNAMICIMPORT_NODE) { 108 hasDynamicImport = true; 109 } 110 if (node.source) { 111 if (node.source.type === ROLLUP_LITERAL_NODE) { 112 const ohmUrl: string | undefined = 113 moduleSource.getOhmUrl(this.rollup, node.source.value, importMap[node.source.value]); 114 expect(ohmUrl === OH_UIABILITY || ohmUrl === OH_HILOG).to.be.true; 115 } else { 116 const errorMsg: string = `ArkTS:ERROR ArkTS:ERROR File: ${this.moduleId}\n` 117 + `DynamicImport only accept stringLiteral as argument currently.\n`; 118 console.log(errorMsg); 119 } 120 } 121 }); 122 } 123 } 124 } 125 SourceMapGenerator.cleanSourceMapObject(); 126 }); 127 128 mocha.it('1-1-2: test getOhmUrl under build debug: filePath exist', function () { 129 this.rollup.build(); 130 SourceMapGenerator.initInstance(this.rollup); 131 const modeMock = new ModuleModeMock(this.rollup); 132 const mockFileList: object = this.rollup.getModuleIds(); 133 this.moduleInfos = new Map<String, ModuleInfo>(); 134 135 for (const moduleId of mockFileList) { 136 if (moduleId.endsWith(EXTNAME_ETS)) { 137 const code: string = fs.readFileSync(moduleId, 'utf-8'); 138 const moduleSource = new ModuleSourceFile(moduleId, code); 139 ModuleSourceFile.projectConfig = modeMock.projectConfig; 140 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 141 const metaInfo: object = moduleInfo[META]; 142 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 143 moduleInfo.setImportedIdMaps(moduleId); 144 moduleInfo.setNodeImportExpression(); 145 const importMap: object = moduleInfo.importedIdMaps; 146 const moduleNodeMap: Map<string, any> = 147 moduleInfo.getNodeByType(ROLLUP_IMPORT_NODE, ROLLUP_EXPORTNAME_NODE, 148 ROLLUP_EXPORTALL_NODE, ROLLUP_DYNAMICIMPORT_NODE); 149 let hasDynamicImport: boolean = false; 150 for (const nodeSet of moduleNodeMap.values()) { 151 nodeSet.forEach(node => { 152 if (!hasDynamicImport && node.type === ROLLUP_DYNAMICIMPORT_NODE) { 153 hasDynamicImport = true; 154 } 155 if (node.source) { 156 if (node.source.type === ROLLUP_LITERAL_NODE) { 157 const ohmUrl: string | undefined = 158 moduleSource.getOhmUrl(this.rollup, node.source.value, importMap['requestFile']); 159 expect(ohmUrl === OHURL_RES).to.be.true; 160 } else { 161 const errorMsg: string = `ArkTS:ERROR ArkTS:ERROR File: ${this.moduleId}\n` 162 + `DynamicImport only accept stringLiteral as argument currently.\n`; 163 console.log(errorMsg); 164 } 165 } 166 }); 167 } 168 } 169 } 170 SourceMapGenerator.cleanSourceMapObject(); 171 }); 172 173 mocha.it('1-1-3: test getOhmUrl under build debug: harOhmUrl is not undefined', function () { 174 this.rollup.build(); 175 SourceMapGenerator.initInstance(this.rollup); 176 const modeMock = new ModuleModeMock(this.rollup); 177 const mockFileList: object = this.rollup.getModuleIds(); 178 this.moduleInfos = new Map<String, ModuleInfo>(); 179 180 for (const moduleId of mockFileList) { 181 if (moduleId.endsWith(EXTNAME_ETS) || moduleId.endsWith(EXTNAME_JS)) { 182 const code: string = fs.readFileSync(moduleId, 'utf-8'); 183 const moduleSource = new ModuleSourceFile(moduleId, code); 184 ModuleSourceFile.projectConfig = modeMock.projectConfig; 185 ModuleSourceFile.projectConfig.harNameOhmMap = projectConfig.harNameOhmMap; 186 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 187 const metaInfo: object = moduleInfo[META]; 188 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 189 moduleInfo.setImportedIdMaps(moduleId); 190 moduleInfo.setNodeImportExpression(); 191 const importMap: object = moduleInfo.importedIdMaps; 192 const moduleNodeMap: Map<string, any> = 193 moduleInfo.getNodeByType(ROLLUP_IMPORT_NODE, ROLLUP_EXPORTNAME_NODE, 194 ROLLUP_EXPORTALL_NODE, ROLLUP_DYNAMICIMPORT_NODE); 195 let hasDynamicImport: boolean = false; 196 for (const nodeSet of moduleNodeMap.values()) { 197 nodeSet.forEach(node => { 198 if (!hasDynamicImport && node.type === ROLLUP_DYNAMICIMPORT_NODE) { 199 hasDynamicImport = true; 200 } 201 if (node.source) { 202 if (node.source.type === ROLLUP_LITERAL_NODE) { 203 const ohmUrl: string | undefined = 204 moduleSource.getOhmUrl(this.rollup, node.source.value, importMap['requestFile']); 205 expect(ohmUrl === OHURL_SHAREDLIBRARY).to.be.true; 206 } else { 207 const errorMsg: string = `ArkTS:ERROR ArkTS:ERROR File: ${this.moduleId}\n` 208 + `DynamicImport only accept stringLiteral as argument currently.\n`; 209 console.log(errorMsg); 210 } 211 } 212 }); 213 } 214 } 215 } 216 SourceMapGenerator.cleanSourceMapObject(); 217 }); 218 219 mocha.it('1-2: test getOhmUrl under build release', function () { 220 this.rollup.build(RELEASE); 221 SourceMapGenerator.initInstance(this.rollup); 222 const modeMock = new ModuleModeMock(this.rollup); 223 const mockFileList: object = this.rollup.getModuleIds(); 224 this.moduleInfos = new Map<String, ModuleInfo>(); 225 for (const moduleId of mockFileList) { 226 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS) || moduleId.endsWith(EXTNAME_JS)) { 227 const code: string = fs.readFileSync(moduleId, 'utf-8'); 228 const moduleSource = new ModuleSourceFile(moduleId, code); 229 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 230 const metaInfo: object = moduleInfo[META]; 231 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 232 moduleInfo.setImportedIdMaps(); 233 moduleInfo.setNodeImportDeclaration(); 234 const importMap: object = moduleInfo.importedIdMaps; 235 const moduleNodeMap: Map<string, any> = 236 moduleInfo.getNodeByType(ROLLUP_IMPORT_NODE, ROLLUP_EXPORTNAME_NODE, 237 ROLLUP_EXPORTALL_NODE, ROLLUP_DYNAMICIMPORT_NODE); 238 let hasDynamicImport: boolean = false; 239 for (const nodeSet of moduleNodeMap.values()) { 240 nodeSet.forEach(node => { 241 if (!hasDynamicImport && node.type === ROLLUP_DYNAMICIMPORT_NODE) { 242 hasDynamicImport = true; 243 } 244 if (node.source) { 245 if (node.source.type === ROLLUP_LITERAL_NODE) { 246 const ohmUrl: string | undefined = 247 moduleSource.getOhmUrl(this.rollup, node.source.value, importMap[node.source.value]); 248 expect(ohmUrl === OH_UIABILITY || ohmUrl === OH_HILOG).to.be.true; 249 } else { 250 const errorMsg: string = `ArkTS:ERROR ArkTS:ERROR File: ${this.moduleId}\n` 251 + `DynamicImport only accept stringLiteral as argument currently.\n`; 252 console.log(errorMsg); 253 } 254 } 255 }); 256 } 257 } 258 } 259 SourceMapGenerator.cleanSourceMapObject(); 260 }); 261 262 mocha.it('1-3: test getOhmUrl under preview debug', function () { 263 this.rollup.preview(); 264 SourceMapGenerator.initInstance(this.rollup); 265 const modeMock = new ModuleModeMock(this.rollup); 266 const mockFileList: object = this.rollup.getModuleIds(); 267 this.moduleInfos = new Map<String, ModuleInfo>(); 268 for (const moduleId of mockFileList) { 269 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS) || moduleId.endsWith(EXTNAME_JS)) { 270 const code: string = fs.readFileSync(moduleId, 'utf-8'); 271 const moduleSource = new ModuleSourceFile(moduleId, code); 272 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 273 const metaInfo: object = moduleInfo[META]; 274 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 275 moduleInfo.setImportedIdMaps(); 276 moduleInfo.setNodeImportDeclaration(); 277 const importMap: object = moduleInfo.importedIdMaps; 278 const moduleNodeMap: Map<string, any> = 279 moduleInfo.getNodeByType(ROLLUP_IMPORT_NODE, ROLLUP_EXPORTNAME_NODE, 280 ROLLUP_EXPORTALL_NODE, ROLLUP_DYNAMICIMPORT_NODE); 281 let hasDynamicImport: boolean = false; 282 for (const nodeSet of moduleNodeMap.values()) { 283 nodeSet.forEach(node => { 284 if (!hasDynamicImport && node.type === ROLLUP_DYNAMICIMPORT_NODE) { 285 hasDynamicImport = true; 286 } 287 if (node.source) { 288 if (node.source.type === ROLLUP_LITERAL_NODE) { 289 const ohmUrl: string | undefined = 290 moduleSource.getOhmUrl(this.rollup, node.source.value, importMap[node.source.value]); 291 expect(ohmUrl === OH_UIABILITY || ohmUrl === OH_HILOG).to.be.true; 292 } else { 293 const errorMsg: string = `ArkTS:ERROR ArkTS:ERROR File: ${this.moduleId}\n` 294 + `DynamicImport only accept stringLiteral as argument currently.\n`; 295 console.log(errorMsg); 296 } 297 } 298 }); 299 } 300 } 301 } 302 SourceMapGenerator.cleanSourceMapObject(); 303 }); 304 305 mocha.it('1-4: test getOhmUrl under hot reload debug', function () { 306 this.rollup.hotReload(); 307 SourceMapGenerator.initInstance(this.rollup); 308 const modeMock = new ModuleModeMock(this.rollup); 309 const mockFileList: object = this.rollup.getModuleIds(); 310 this.moduleInfos = new Map<String, ModuleInfo>(); 311 for (const moduleId of mockFileList) { 312 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS) || moduleId.endsWith(EXTNAME_JS)) { 313 const code: string = fs.readFileSync(moduleId, 'utf-8'); 314 const moduleSource = new ModuleSourceFile(moduleId, code); 315 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 316 const metaInfo: object = moduleInfo[META]; 317 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 318 moduleInfo.setImportedIdMaps(); 319 moduleInfo.setNodeImportDeclaration(); 320 const importMap: object = moduleInfo.importedIdMaps; 321 const moduleNodeMap: Map<string, any> = 322 moduleInfo.getNodeByType(ROLLUP_IMPORT_NODE, ROLLUP_EXPORTNAME_NODE, 323 ROLLUP_EXPORTALL_NODE, ROLLUP_DYNAMICIMPORT_NODE); 324 let hasDynamicImport: boolean = false; 325 for (const nodeSet of moduleNodeMap.values()) { 326 nodeSet.forEach(node => { 327 if (!hasDynamicImport && node.type === ROLLUP_DYNAMICIMPORT_NODE) { 328 hasDynamicImport = true; 329 } 330 if (node.source) { 331 if (node.source.type === ROLLUP_LITERAL_NODE) { 332 const ohmUrl: string | undefined = 333 moduleSource.getOhmUrl(this.rollup, node.source.value, importMap[node.source.value]); 334 expect(ohmUrl === OH_UIABILITY || ohmUrl === OH_HILOG).to.be.true; 335 } else { 336 const errorMsg: string = `ArkTS:ERROR ArkTS:ERROR File: ${this.moduleId}\n` 337 + `DynamicImport only accept stringLiteral as argument currently.\n`; 338 console.log(errorMsg); 339 } 340 } 341 }); 342 } 343 } 344 } 345 SourceMapGenerator.cleanSourceMapObject(); 346 }); 347 348 mocha.it('1-5: test the error message of getOhmUrl: GetModuleInfoFaild', function () { 349 this.rollup.build(); 350 const filePath: string = 'test.ets'; 351 const moduleSourceFile = new ModuleSourceFile(filePath, '', undefined); 352 const errInfo: LogData = LogDataFactory.newInstance( 353 ErrorCode.ETS2BUNDLE_INTERNAL_GET_MODULE_INFO_FAILED, 354 ArkTSInternalErrorDescription, 355 'Failed to get ModuleInfo, moduleId: test.ets' 356 ); 357 ModuleSourceFile.initPluginEnv(this.rollup); 358 const stub = sinon.stub(ModuleSourceFile.logger.getLoggerFromErrorCode(errInfo.code), 'printError'); 359 moduleSourceFile.getOhmUrl(this.rollup, '', filePath, undefined); 360 expect(stub.calledWith(errInfo)).to.be.true; 361 stub.restore(); 362 }); 363 364 mocha.it('1-5-1: test the error message of getOhmUrl: GetModuleInfoFaild ' + 365 'without getHvigorConsoleLogger', function () { 366 this.rollup.build(); 367 const filePath: string = 'test.ets'; 368 const moduleSourceFile = new ModuleSourceFile(filePath, '', undefined); 369 const errInfo: LogData = LogDataFactory.newInstance( 370 ErrorCode.ETS2BUNDLE_INTERNAL_GET_MODULE_INFO_FAILED, 371 ArkTSInternalErrorDescription, 372 'Failed to get ModuleInfo, moduleId: test.ets' 373 ); 374 CommonLogger.destroyInstance(); 375 const getHvigorConsoleLogger = this.rollup.share.getHvigorConsoleLogger; 376 this.rollup.share.getHvigorConsoleLogger = undefined; 377 ModuleSourceFile.initPluginEnv(this.rollup); 378 const stub = sinon.stub(ModuleSourceFile.logger.logger, 'error'); 379 moduleSourceFile.getOhmUrl(this.rollup, '', filePath, undefined); 380 expect(stub.calledWith(errInfo.toString())).to.be.true; 381 CommonLogger.destroyInstance(); 382 this.rollup.share.getHvigorConsoleLogger = getHvigorConsoleLogger; 383 stub.restore(); 384 }); 385 386 mocha.it('1-6: test the error message of getOhmUrl: UnableToGetModuleInfoMeta', function () { 387 this.rollup.build(); 388 const filePath: string = 'test.ets'; 389 const moduleInfo: Object = { 390 id: filePath, 391 meta: null 392 } 393 this.rollup.moduleInfos.push(moduleInfo); 394 const moduleSourceFile = new ModuleSourceFile(filePath, '', undefined); 395 const errInfo: LogData = LogDataFactory.newInstance( 396 ErrorCode.ETS2BUNDLE_INTERNAL_UNABLE_TO_GET_MODULE_INFO_META, 397 ArkTSInternalErrorDescription, 398 "Failed to get ModuleInfo properties 'meta', moduleId: test.ets" 399 ); 400 ModuleSourceFile.initPluginEnv(this.rollup); 401 const stub = sinon.stub(ModuleSourceFile.logger.getLoggerFromErrorCode(errInfo.code), 'printError'); 402 moduleSourceFile.getOhmUrl(this.rollup, '', filePath, undefined); 403 expect(stub.calledWith(errInfo)).to.be.true; 404 stub.restore(); 405 }); 406 407 mocha.it('1-7: test the error message of getOhmUrl: UnableToGetModuleInfoMeta ' + 408 'without getHvigorConsoleLogger', function () { 409 this.rollup.build(); 410 const filePath: string = 'test.ets'; 411 const moduleInfo: Object = { 412 id: filePath, 413 meta: null 414 } 415 this.rollup.moduleInfos.push(moduleInfo); 416 const moduleSourceFile = new ModuleSourceFile(filePath, '', undefined); 417 const errInfo: LogData = LogDataFactory.newInstance( 418 ErrorCode.ETS2BUNDLE_INTERNAL_UNABLE_TO_GET_MODULE_INFO_META, 419 ArkTSInternalErrorDescription, 420 "Failed to get ModuleInfo properties 'meta', moduleId: test.ets" 421 ); 422 CommonLogger.destroyInstance(); 423 const getHvigorConsoleLogger = this.rollup.share.getHvigorConsoleLogger; 424 this.rollup.share.getHvigorConsoleLogger = undefined; 425 ModuleSourceFile.initPluginEnv(this.rollup); 426 const stub = sinon.stub(ModuleSourceFile.logger.logger, 'error'); 427 moduleSourceFile.getOhmUrl(this.rollup, '', filePath, undefined); 428 expect(stub.calledWith(errInfo.toString())).to.be.true; 429 CommonLogger.destroyInstance(); 430 this.rollup.share.getHvigorConsoleLogger = getHvigorConsoleLogger; 431 stub.restore(); 432 }); 433 434 mocha.it('2-1: test processJsModuleRequest under build debug', function () { 435 this.rollup.build(); 436 SourceMapGenerator.initInstance(this.rollup); 437 const modeMock = new ModuleModeMock(this.rollup); 438 const mockFileList: object = this.rollup.getModuleIds(); 439 this.moduleInfos = new Map<String, ModuleInfo>(); 440 for (const moduleId of mockFileList) { 441 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 442 const code: string = fs.readFileSync(moduleId, 'utf-8'); 443 const moduleSource = new ModuleSourceFile(moduleId, code); 444 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 445 const metaInfo: object = moduleInfo[META]; 446 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 447 moduleInfo.setImportedIdMaps(); 448 moduleSource.processJsModuleRequest(this.rollup); 449 const EntryAbility_ts = fs.readFileSync(EXPECT_ENTRY_TS).toString(); 450 const Index_ets = fs.readFileSync(EXPECT_INDEX_ETS).toString(); 451 expect(moduleSource.source === EntryAbility_ts || moduleSource.source === Index_ets).to.be.true; 452 } 453 } 454 SourceMapGenerator.cleanSourceMapObject(); 455 }); 456 457 mocha.it('2-2: test processJsModuleRequest under build release', function () { 458 this.rollup.build(RELEASE); 459 SourceMapGenerator.initInstance(this.rollup); 460 const modeMock = new ModuleModeMock(this.rollup); 461 const mockFileList: object = this.rollup.getModuleIds(); 462 this.moduleInfos = new Map<String, ModuleInfo>(); 463 for (const moduleId of mockFileList) { 464 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 465 const code: string = fs.readFileSync(moduleId, 'utf-8'); 466 const moduleSource = new ModuleSourceFile(moduleId, code); 467 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 468 const metaInfo: object = moduleInfo[META]; 469 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 470 moduleInfo.setImportedIdMaps(); 471 moduleSource.processJsModuleRequest(this.rollup); 472 const EntryAbility_ts = fs.readFileSync(EXPECT_ENTRY_TS).toString(); 473 const Index_ets = fs.readFileSync(EXPECT_INDEX_ETS).toString(); 474 expect(moduleSource.source === EntryAbility_ts || moduleSource.source === Index_ets).to.be.true; 475 } 476 } 477 SourceMapGenerator.cleanSourceMapObject(); 478 }); 479 480 mocha.it('2-3: test processJsModuleRequest under preview debug', function () { 481 this.rollup.preview(); 482 SourceMapGenerator.initInstance(this.rollup); 483 const modeMock = new ModuleModeMock(this.rollup); 484 const mockFileList: object = this.rollup.getModuleIds(); 485 this.moduleInfos = new Map<String, ModuleInfo>(); 486 for (const moduleId of mockFileList) { 487 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 488 const code: string = fs.readFileSync(moduleId, 'utf-8'); 489 const moduleSource = new ModuleSourceFile(moduleId, code); 490 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 491 const metaInfo: object = moduleInfo[META]; 492 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 493 moduleInfo.setImportedIdMaps(); 494 moduleSource.processJsModuleRequest(this.rollup); 495 const EntryAbility_ts = fs.readFileSync(EXPECT_ENTRY_TS).toString(); 496 const Index_ets = fs.readFileSync(EXPECT_INDEX_ETS).toString(); 497 expect(moduleSource.source === EntryAbility_ts || moduleSource.source === Index_ets).to.be.true; 498 } 499 } 500 SourceMapGenerator.cleanSourceMapObject(); 501 }); 502 503 mocha.it('2-4: test processJsModuleRequest under hot reload debug', function () { 504 this.rollup.hotReload(); 505 SourceMapGenerator.initInstance(this.rollup); 506 const modeMock = new ModuleModeMock(this.rollup); 507 const mockFileList: object = this.rollup.getModuleIds(); 508 this.moduleInfos = new Map<String, ModuleInfo>(); 509 for (const moduleId of mockFileList) { 510 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 511 const code: string = fs.readFileSync(moduleId, 'utf-8'); 512 const moduleSource = new ModuleSourceFile(moduleId, code); 513 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 514 const metaInfo: object = moduleInfo[META]; 515 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 516 moduleInfo.setImportedIdMaps(); 517 moduleSource.processJsModuleRequest(this.rollup); 518 const EntryAbility_ts = fs.readFileSync(EXPECT_ENTRY_TS).toString(); 519 const Index_ets = fs.readFileSync(EXPECT_INDEX_ETS).toString(); 520 expect(moduleSource.source === EntryAbility_ts || moduleSource.source === Index_ets).to.be.true; 521 } 522 } 523 SourceMapGenerator.cleanSourceMapObject(); 524 }); 525 526 mocha.it('3-1-1: test processTransformedJsModuleRequest under build debug: hasDynamicImport is false', function () { 527 this.rollup.build(); 528 SourceMapGenerator.initInstance(this.rollup); 529 const modeMock = new ModuleModeMock(this.rollup); 530 const mockFileList: object = this.rollup.getModuleIds(); 531 this.moduleInfos = new Map<String, ModuleInfo>(); 532 for (const moduleId of mockFileList) { 533 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 534 const code: string = JSON.stringify(fs.readFileSync(moduleId, 'utf-8')); 535 const moduleSource = new ModuleSourceFile(moduleId, code); 536 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 537 const metaInfo: object = moduleInfo[META]; 538 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 539 moduleInfo.setImportedIdMaps(); 540 moduleInfo.setNodeImportDeclaration(); 541 moduleSource.processTransformedJsModuleRequest(this.rollup); 542 const json = fs.readFileSync(EXPECT_TO_JS, 'utf-8'); 543 const etsToJs = JSON.parse(json).expect_index_ets_to_js; 544 const tsToJs = JSON.parse(json).expect_entryability_ts_to_js; 545 expect(moduleSource.source === etsToJs || moduleSource.source === tsToJs).to.be.true; 546 } 547 } 548 SourceMapGenerator.cleanSourceMapObject(); 549 }); 550 551 mocha.it('3-1-2: test processTransformedJsModuleRequest under build debug: hasDynamicImport is true', async function () { 552 this.rollup.build(); 553 const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup); 554 let newSourceMaps = sourceMapGenerator.getSourceMaps(); 555 556 const modeMock = new ModuleModeMock(this.rollup); 557 const mockFileList: object = this.rollup.getModuleIds(); 558 this.moduleInfos = new Map<String, ModuleInfo>(); 559 for (const moduleId of mockFileList) { 560 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 561 const code: string = JSON.stringify(fs.readFileSync(moduleId, 'utf-8')); 562 const moduleSource = new ModuleSourceFile(moduleId, code); 563 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 564 const metaInfo: object = moduleInfo[META]; 565 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 566 moduleInfo.setImportedIdMaps(); 567 moduleInfo.setNodeImportExpression(); 568 ModuleSourceFile.projectConfig = modeMock.projectConfig; 569 await moduleSource.processTransformedJsModuleRequest(this.rollup); 570 for (const key in newSourceMaps) { 571 expect(newSourceMaps[key].mappings.length > 0).to.be.true; 572 expect(newSourceMaps[key].file.includes(ENTRYABILITY_TS) !== -1 573 || newSourceMaps[key].file.includes(INDEX_ETS) !== -1).to.be.true; 574 expect(newSourceMaps[key].sources.includes(ENTRYABILITY_TS_PATH_DEFAULT) !== -1 575 || newSourceMaps[key].sources.includes(INDEX_ETS_PATH_DEFAULT) !== -1).to.be.true; 576 } 577 } 578 } 579 580 for (const key of Object.keys(newSourceMaps)) { 581 delete newSourceMaps[key]; 582 } 583 SourceMapGenerator.cleanSourceMapObject(); 584 }); 585 586 mocha.it('3-2: test processTransformedJsModuleRequest under build release', function () { 587 this.rollup.build(RELEASE); 588 SourceMapGenerator.initInstance(this.rollup); 589 const modeMock = new ModuleModeMock(this.rollup); 590 const mockFileList: object = this.rollup.getModuleIds(); 591 this.moduleInfos = new Map<String, ModuleInfo>(); 592 for (const moduleId of mockFileList) { 593 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 594 const code: string = JSON.stringify(fs.readFileSync(moduleId, 'utf-8')); 595 const moduleSource = new ModuleSourceFile(moduleId, code); 596 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 597 const metaInfo: object = moduleInfo[META]; 598 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 599 moduleInfo.setImportedIdMaps(); 600 moduleInfo.setNodeImportDeclaration(); 601 moduleSource.processTransformedJsModuleRequest(this.rollup); 602 const json = fs.readFileSync(EXPECT_TO_JS, 'utf-8'); 603 const etsToJs = JSON.parse(json).expect_index_ets_to_js; 604 const tsToJs = JSON.parse(json).expect_entryability_ts_to_js; 605 expect(moduleSource.source === etsToJs || moduleSource.source === tsToJs).to.be.true; 606 } 607 } 608 SourceMapGenerator.cleanSourceMapObject(); 609 }); 610 611 mocha.it('3-3: test processTransformedJsModuleRequest under preview debug', function () { 612 this.rollup.preview(); 613 SourceMapGenerator.initInstance(this.rollup); 614 const modeMock = new ModuleModeMock(this.rollup); 615 const mockFileList: object = this.rollup.getModuleIds(); 616 this.moduleInfos = new Map<String, ModuleInfo>(); 617 for (const moduleId of mockFileList) { 618 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 619 const code: string = JSON.stringify(fs.readFileSync(moduleId, 'utf-8')); 620 const moduleSource = new ModuleSourceFile(moduleId, code); 621 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 622 const metaInfo: object = moduleInfo[META]; 623 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 624 moduleInfo.setImportedIdMaps(); 625 moduleInfo.setNodeImportDeclaration(); 626 moduleSource.processTransformedJsModuleRequest(this.rollup); 627 const json = fs.readFileSync(EXPECT_TO_JS, 'utf-8'); 628 const etsToJs = JSON.parse(json).expect_index_ets_to_js; 629 const tsToJs = JSON.parse(json).expect_entryability_ts_to_js; 630 expect(moduleSource.source === etsToJs || moduleSource.source === tsToJs).to.be.true; 631 } 632 } 633 SourceMapGenerator.cleanSourceMapObject(); 634 }); 635 636 mocha.it('3-4: test processTransformedJsModuleRequest under hot reload debug', function () { 637 this.rollup.hotReload(); 638 SourceMapGenerator.initInstance(this.rollup); 639 const modeMock = new ModuleModeMock(this.rollup); 640 const mockFileList: object = this.rollup.getModuleIds(); 641 this.moduleInfos = new Map<String, ModuleInfo>(); 642 for (const moduleId of mockFileList) { 643 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 644 const code: string = JSON.stringify(fs.readFileSync(moduleId, 'utf-8')); 645 const moduleSource = new ModuleSourceFile(moduleId, code); 646 const moduleInfo: object = this.rollup.getModuleInfo(moduleId); 647 const metaInfo: object = moduleInfo[META]; 648 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 649 moduleInfo.setImportedIdMaps(); 650 moduleInfo.setNodeImportDeclaration(); 651 moduleSource.processTransformedJsModuleRequest(this.rollup); 652 const json = fs.readFileSync(EXPECT_TO_JS, 'utf-8'); 653 const etsToJs = JSON.parse(json).expect_index_ets_to_js; 654 const tsToJs = JSON.parse(json).expect_entryability_ts_to_js; 655 expect(moduleSource.source === etsToJs || moduleSource.source === tsToJs).to.be.true; 656 } 657 } 658 SourceMapGenerator.cleanSourceMapObject(); 659 }); 660 661 mocha.it('4-1: test processTransformedTsModuleRequest under build debug', function () { 662 this.rollup.build(); 663 const modeMock = new ModuleModeMock(this.rollup); 664 const allFiles = new Set<string>(); 665 this.moduleInfos = new Map<String, ModuleInfo>(); 666 scanFiles(MODULE_TEST_PATH, allFiles); 667 for (const moduleId of allFiles.values()) { 668 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 669 const code: string = fs.readFileSync(moduleId, 'utf-8'); 670 const moduleInfo = new ModuleInfoMock(moduleId, 671 this.rollup.share.projectConfig.entryModuleName, 672 this.rollup.share.projectConfig.modulePath); 673 moduleInfo.setImportedIdMaps(); 674 this.rollup.moduleInfos.push(moduleInfo); 675 const metaInfo: object = moduleInfo[META]; 676 SourceMapGenerator.initInstance(this.rollup); 677 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 678 const sourceFile = ts.createSourceFile(moduleId, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS); 679 const moduleSource = new ModuleSourceFile(moduleId, sourceFile); 680 ModuleSourceFile.processModuleSourceFiles(this.rollup); 681 moduleSource.processTransformedTsModuleRequest(this.rollup); 682 expect(moduleSource.source.fileName === moduleId).to.be.true; 683 expect(moduleSource.source.text === code).to.be.true; 684 expect(moduleSource.source.languageVariant === ts.LanguageVariant.Standard).to.be.true; 685 expect(moduleSource.source.isDeclarationFile === false).to.be.true; 686 expect(moduleSource.source.hasNoDefaultLib === false).to.be.true; 687 expect(moduleSource.source.languageVersion === ts.ScriptTarget.Latest).to.be.true; 688 SourceMapGenerator.cleanSourceMapObject(); 689 } 690 } 691 }); 692 693 mocha.it('4-1-1: test single file processTransformedTsModuleRequest under build debug', function () { 694 this.rollup.build(); 695 this.rollup.share.projectConfig.singleFileEmit = true; 696 const modeMock = new ModuleModeMock(this.rollup); 697 const allFiles = new Set<string>(); 698 this.moduleInfos = new Map<String, ModuleInfo>(); 699 scanFiles(MODULE_TEST_PATH, allFiles); 700 for (const moduleId of allFiles.values()) { 701 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 702 const code: string = fs.readFileSync(moduleId, 'utf-8'); 703 const moduleInfo = new ModuleInfoMock(moduleId, 704 this.rollup.share.projectConfig.entryModuleName, 705 this.rollup.share.projectConfig.modulePath); 706 moduleInfo.setImportedIdMaps(); 707 this.rollup.moduleInfos.push(moduleInfo); 708 const metaInfo: object = moduleInfo[META]; 709 SourceMapGenerator.initInstance(this.rollup); 710 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 711 const sourceFile = ts.createSourceFile(moduleId, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS); 712 const moduleSource = new ModuleSourceFile(moduleId, sourceFile); 713 ModuleSourceFile.processSingleModuleSourceFile(this.rollup, moduleInfo.id); 714 moduleSource.processTransformedTsModuleRequest(this.rollup); 715 expect(moduleSource.source.fileName === moduleId).to.be.true; 716 expect(moduleSource.source.text === code).to.be.true; 717 expect(moduleSource.source.languageVariant === ts.LanguageVariant.Standard).to.be.true; 718 expect(moduleSource.source.isDeclarationFile === false).to.be.true; 719 expect(moduleSource.source.hasNoDefaultLib === false).to.be.true; 720 expect(moduleSource.source.languageVersion === ts.ScriptTarget.Latest).to.be.true; 721 SourceMapGenerator.cleanSourceMapObject(); 722 } 723 } 724 }); 725 726 mocha.it('4-2: test processTransformedTsModuleRequest under build release', function () { 727 this.rollup.build(RELEASE); 728 const modeMock = new ModuleModeMock(this.rollup); 729 const allFiles = new Set<string>(); 730 scanFiles(MODULE_TEST_PATH, allFiles); 731 for (const moduleId of allFiles.values()) { 732 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 733 const code: string = fs.readFileSync(moduleId, 'utf-8'); 734 const moduleInfo = new ModuleInfoMock(moduleId, 735 this.rollup.share.projectConfig.entryModuleName, 736 this.rollup.share.projectConfig.modulePath); 737 moduleInfo.setImportedIdMaps(); 738 this.rollup.moduleInfos.push(moduleInfo); 739 const metaInfo: object = moduleInfo[META]; 740 SourceMapGenerator.initInstance(this.rollup); 741 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 742 const sourceFile = ts.createSourceFile(moduleId, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS); 743 const moduleSource = new ModuleSourceFile(moduleId, sourceFile); 744 ModuleSourceFile.processModuleSourceFiles(this.rollup); 745 moduleSource.processTransformedTsModuleRequest(this.rollup); 746 expect(moduleSource.source.fileName === moduleId).to.be.true; 747 expect(moduleSource.source.text === code).to.be.true; 748 expect(moduleSource.source.languageVariant === ts.LanguageVariant.Standard).to.be.true; 749 expect(moduleSource.source.isDeclarationFile === false).to.be.true; 750 expect(moduleSource.source.hasNoDefaultLib === false).to.be.true; 751 expect(moduleSource.source.languageVersion === ts.ScriptTarget.Latest).to.be.true; 752 SourceMapGenerator.cleanSourceMapObject(); 753 } 754 } 755 }); 756 757 mocha.it('4-3: test processTransformedTsModuleRequest under preview debug', function () { 758 this.rollup.preview(); 759 const modeMock = new ModuleModeMock(this.rollup); 760 const allFiles = new Set<string>(); 761 scanFiles(MODULE_TEST_PATH, allFiles); 762 for (const moduleId of allFiles.values()) { 763 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 764 const code: string = fs.readFileSync(moduleId, 'utf-8'); 765 const moduleInfo = new ModuleInfoMock(moduleId, 766 this.rollup.share.projectConfig.entryModuleName, 767 this.rollup.share.projectConfig.modulePath); 768 moduleInfo.setImportedIdMaps(); 769 this.rollup.moduleInfos.push(moduleInfo); 770 const metaInfo: object = moduleInfo[META]; 771 SourceMapGenerator.initInstance(this.rollup); 772 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 773 const sourceFile = ts.createSourceFile(moduleId, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS); 774 const moduleSource = new ModuleSourceFile(moduleId, sourceFile); 775 ModuleSourceFile.processModuleSourceFiles(this.rollup); 776 moduleSource.processTransformedTsModuleRequest(this.rollup); 777 expect(moduleSource.source.fileName === moduleId).to.be.true; 778 expect(moduleSource.source.text === code).to.be.true; 779 expect(moduleSource.source.languageVariant === ts.LanguageVariant.Standard).to.be.true; 780 expect(moduleSource.source.isDeclarationFile === false).to.be.true; 781 expect(moduleSource.source.hasNoDefaultLib === false).to.be.true; 782 expect(moduleSource.source.languageVersion === ts.ScriptTarget.Latest).to.be.true; 783 SourceMapGenerator.cleanSourceMapObject(); 784 } 785 } 786 }); 787 788 mocha.it('4-3-1: test single file processTransformedTsModuleRequest under preview debug', function () { 789 this.rollup.preview(); 790 this.rollup.share.projectConfig.singleFileEmit = true; 791 const modeMock = new ModuleModeMock(this.rollup); 792 const allFiles = new Set<string>(); 793 scanFiles(MODULE_TEST_PATH, allFiles); 794 for (const moduleId of allFiles.values()) { 795 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 796 const code: string = fs.readFileSync(moduleId, 'utf-8'); 797 const moduleInfo = new ModuleInfoMock(moduleId, 798 this.rollup.share.projectConfig.entryModuleName, 799 this.rollup.share.projectConfig.modulePath); 800 moduleInfo.setImportedIdMaps(); 801 this.rollup.moduleInfos.push(moduleInfo); 802 const metaInfo: object = moduleInfo[META]; 803 SourceMapGenerator.initInstance(this.rollup); 804 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 805 const sourceFile = ts.createSourceFile(moduleId, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS); 806 const moduleSource = new ModuleSourceFile(moduleId, sourceFile); 807 ModuleSourceFile.processSingleModuleSourceFile(this.rollup, moduleInfo.id); 808 moduleSource.processTransformedTsModuleRequest(this.rollup); 809 expect(moduleSource.source.fileName === moduleId).to.be.true; 810 expect(moduleSource.source.text === code).to.be.true; 811 expect(moduleSource.source.languageVariant === ts.LanguageVariant.Standard).to.be.true; 812 expect(moduleSource.source.isDeclarationFile === false).to.be.true; 813 expect(moduleSource.source.hasNoDefaultLib === false).to.be.true; 814 expect(moduleSource.source.languageVersion === ts.ScriptTarget.Latest).to.be.true; 815 SourceMapGenerator.cleanSourceMapObject(); 816 } 817 } 818 }); 819 820 mocha.it('4-4: test processTransformedTsModuleRequest under reload debug', function () { 821 this.rollup.hotReload(); 822 const modeMock = new ModuleModeMock(this.rollup); 823 const allFiles = new Set<string>(); 824 scanFiles(MODULE_TEST_PATH, allFiles); 825 for (const moduleId of allFiles.values()) { 826 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 827 const code: string = fs.readFileSync(moduleId, 'utf-8'); 828 const moduleInfo = new ModuleInfoMock(moduleId, 829 this.rollup.share.projectConfig.entryModuleName, 830 this.rollup.share.projectConfig.modulePath); 831 moduleInfo.setImportedIdMaps(); 832 this.rollup.moduleInfos.push(moduleInfo); 833 const metaInfo: object = moduleInfo[META]; 834 SourceMapGenerator.initInstance(this.rollup); 835 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 836 const sourceFile = ts.createSourceFile(moduleId, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS); 837 const moduleSource = new ModuleSourceFile(moduleId, sourceFile); 838 ModuleSourceFile.processModuleSourceFiles(this.rollup); 839 moduleSource.processTransformedTsModuleRequest(this.rollup); 840 expect(moduleSource.source.fileName === moduleId).to.be.true; 841 expect(moduleSource.source.text === code).to.be.true; 842 expect(moduleSource.source.languageVariant === ts.LanguageVariant.Standard).to.be.true; 843 expect(moduleSource.source.isDeclarationFile === false).to.be.true; 844 expect(moduleSource.source.hasNoDefaultLib === false).to.be.true; 845 expect(moduleSource.source.languageVersion === ts.ScriptTarget.Latest).to.be.true; 846 SourceMapGenerator.cleanSourceMapObject(); 847 } 848 } 849 }); 850 851 mocha.it('4-4-1: test single file processTransformedTsModuleRequest under reload debug', function () { 852 this.rollup.hotReload(); 853 this.rollup.share.projectConfig.singleFileEmit = true; 854 const modeMock = new ModuleModeMock(this.rollup); 855 const allFiles = new Set<string>(); 856 scanFiles(MODULE_TEST_PATH, allFiles); 857 for (const moduleId of allFiles.values()) { 858 if (moduleId.endsWith(EXTNAME_TS) || moduleId.endsWith(EXTNAME_ETS)) { 859 const code: string = fs.readFileSync(moduleId, 'utf-8'); 860 const moduleInfo = new ModuleInfoMock(moduleId, 861 this.rollup.share.projectConfig.entryModuleName, 862 this.rollup.share.projectConfig.modulePath); 863 moduleInfo.setImportedIdMaps(); 864 this.rollup.moduleInfos.push(moduleInfo); 865 const metaInfo: object = moduleInfo[META]; 866 SourceMapGenerator.initInstance(this.rollup); 867 modeMock.addModuleInfoItem(moduleId, false, '', metaInfo, this.moduleInfos); 868 const sourceFile = ts.createSourceFile(moduleId, code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS); 869 const moduleSource = new ModuleSourceFile(moduleId, sourceFile); 870 ModuleSourceFile.processSingleModuleSourceFile(this.rollup, moduleInfo.id); 871 moduleSource.processTransformedTsModuleRequest(this.rollup); 872 expect(moduleSource.source.fileName === moduleId).to.be.true; 873 expect(moduleSource.source.text === code).to.be.true; 874 expect(moduleSource.source.languageVariant === ts.LanguageVariant.Standard).to.be.true; 875 expect(moduleSource.source.isDeclarationFile === false).to.be.true; 876 expect(moduleSource.source.hasNoDefaultLib === false).to.be.true; 877 expect(moduleSource.source.languageVersion === ts.ScriptTarget.Latest).to.be.true; 878 SourceMapGenerator.cleanSourceMapObject(); 879 } 880 } 881 }); 882 883 mocha.it('5-1: test setProcessMock under LocalTest mode', function () { 884 this.rollup.share.projectConfig.isPreview = true; 885 this.rollup.share.projectConfig.isOhosTest = true; 886 this.rollup.share.projectConfig.isLocalTest = true; 887 this.rollup.share.projectConfig.mockParams = { 888 decorator: "@MockSetup", 889 packageName: "@ohos/hamock", 890 etsSourceRootPath: "src/main", 891 mockConfigPath: this.rollup.share.projectConfig.aceModuleRoot + '/mock/mock-config.json5', 892 } 893 ModuleSourceFile.setProcessMock(this.rollup); 894 expect(ModuleSourceFile.needProcessMock).to.be.true; 895 }); 896 897 mocha.it('5-2: test collectMockConfigInfo under LocalTest mode', function () { 898 this.rollup.share.projectConfig.isLocalTest = true; 899 this.rollup.share.projectConfig.mockParams = { 900 decorator: "@MockSetup", 901 packageName: "@ohos/hamock", 902 etsSourceRootPath: "src/main", 903 mockConfigPath: this.rollup.share.projectConfig.aceModuleRoot + '/mock/mock-config.json5', 904 } 905 ModuleSourceFile.collectMockConfigInfo(this.rollup); 906 let EXPECT_MOCKFILES = [ 907 "src/mock/ohos/I18nMock.ts", 908 "src/mock/ohos/bluetooth.mock.ts", 909 "src/mock/module/calc.mock.ts", 910 "src/mock/module/bigInt.mock.ts", 911 "src/mock/native/libentry.mock.ts" 912 ]; 913 expect(ModuleSourceFile.mockFiles).to.deep.equal(EXPECT_MOCKFILES); 914 }); 915 916 mocha.it('5-3: test addMockConfig under LocalTest mode', function () { 917 ModuleSourceFile.newMockConfigInfo = { 918 "@ohos:i18n": { 919 "source": "@bundle:com.example.demo/entry/src/mock/ohos/I18nMock" 920 }, 921 "@ohos:bluetooth": { 922 "source": "@bundle:com.example.demo/entry/src/mock/ohos/bluetooth.mock" 923 }, 924 "@bundle:com.example.demo/entry/ets/calc": { 925 "source": "@bundle:com.example.demo/entry/src/mock/module/calc.mock" 926 }, 927 "@bundle:/testProjectRootPath/oh_modules/lib/dist/index.js": { 928 "source": "@bundle:com.example.demo/entry/src/mock/module/bigInt.mock" 929 }, 930 "@app:UtTestApplication/entry/entry": { 931 "source": "@bundle:com.example.demo/entry/src/mock/native/libentry.mock" 932 } 933 }; 934 935 ModuleSourceFile.addMockConfig(ModuleSourceFile.newMockConfigInfo, "@ohos:i18n", "@bundle:com.example.demo/entry/src/mock/I18nMock"); 936 expect(ModuleSourceFile.newMockConfigInfo).to.deep.equal(ModuleSourceFile.newMockConfigInfo); 937 }); 938 939 mocha.it('5-4: test generateNewMockInfo under LocalTest mode', function () { 940 this.rollup.share.projectConfig.isLocalTest = true; 941 ModuleSourceFile.mockConfigInfo = { 942 "@ohos:i18n": { 943 "source": "src/mock/ohos/I18nMock.ts" 944 }, 945 } 946 let originKey = "@ohos.i18n"; 947 let transKey = "@ohos:i18n"; 948 let importerFile = this.rollup.share.projectConfig.aceModuleRoot + '/mock/ohos/I18nMock.ts'; 949 ModuleSourceFile.generateNewMockInfo(originKey, transKey, this.rollup, importerFile); 950 let EXPECT_NEW_MOCK_INFO = { 951 "@ohos:i18n": { 952 "source": "@bundle:com.example.demo/entry/src/mock/ohos/I18nMock" 953 }, 954 "@ohos:bluetooth": { 955 "source": "@bundle:com.example.demo/entry/src/mock/ohos/bluetooth.mock" 956 }, 957 "@bundle:com.example.demo/entry/ets/calc": { 958 "source": "@bundle:com.example.demo/entry/src/mock/module/calc.mock" 959 }, 960 "@bundle:/testProjectRootPath/oh_modules/lib/dist/index.js": { 961 "source": "@bundle:com.example.demo/entry/src/mock/module/bigInt.mock" 962 }, 963 "@app:UtTestApplication/entry/entry": { 964 "source": "@bundle:com.example.demo/entry/src/mock/native/libentry.mock" 965 } 966 }; 967 expect(ModuleSourceFile.newMockConfigInfo).to.deep.equal(EXPECT_NEW_MOCK_INFO); 968 }); 969 970 971 mocha.it('5-5: test isMockFile under LocalTest mode', function () { 972 ModuleSourceFile.needProcessMock = true; 973 ModuleSourceFile.mockFiles = ["src/mock/ohos/I18nMock.ts"]; 974 let file = this.rollup.share.projectConfig.aceModuleRoot +'/mock/ohos/I18nMock.ts'; 975 expect(ModuleSourceFile.isMockFile(file, this.rollup)).to.be.true; 976 ModuleSourceFile.needProcessMock = false; 977 }); 978 979 mocha.it('5-6: test generateMockConfigFile under LocalTest mode', function () { 980 this.rollup.share.projectConfig.isLocalTest = true; 981 ModuleSourceFile.newMockConfigInfo = { 982 "@ohos:i18n": { 983 "source": "@bundle:com.example.demo/entry/src/mock/I18nMock" 984 }, 985 "@ohos:bluetooth": { 986 "source": "@bundle:com.example.demo/entry/src/mock/ohos/bluetooth.mock" 987 }, 988 "@bundle:com.example.demo/entry/ets/calc": { 989 "source": "@bundle:com.example.demo/entry/src/mock/module/calc.mock" 990 }, 991 "@bundle:/testProjectRootPath/oh_modules/lib/dist/index.js": { 992 "source": "@bundle:com.example.demo/entry/src/mock/module/bigInt.mock" 993 }, 994 "@app:UtTestApplication/entry/entry": { 995 "source": "@bundle:com.example.demo/entry/src/mock/native/libentry.mock" 996 } 997 } 998 this.rollup.share.projectConfig.mockParams = { 999 decorator: "@MockSetup", 1000 packageName: "@ohos/hamock", 1001 etsSourceRootPath: "src/main", 1002 mockConfigPath: this.rollup.share.projectConfig.aceModuleRoot + '/mock/mock-config.json5', 1003 } 1004 ModuleSourceFile.generateMockConfigFile(this.rollup); 1005 let EXPECT_MOCK_CONFIG_FILE = path.resolve(this.rollup.share.projectConfig.aceModuleJsonPath, `../mock-config.json`); 1006 expect(fs.existsSync(EXPECT_MOCK_CONFIG_FILE)).to.be.true; 1007 let EXPECT_MOCK_CONFIG_CONTENT = JSON.stringify(ModuleSourceFile.newMockConfigInfo); 1008 let ACTUAL_MOCK_CONFIG_CONTENT = JSON.stringify(require(EXPECT_MOCK_CONFIG_FILE)); 1009 expect(EXPECT_MOCK_CONFIG_CONTENT).to.equal(ACTUAL_MOCK_CONFIG_CONTENT); 1010 fs.unlinkSync(this.rollup.share.projectConfig.cachePath + '/mock-config.json'); 1011 fs.unlinkSync(this.rollup.share.projectConfig.cachePath + '/mock-config.json5'); 1012 }); 1013 1014 mocha.it('6-1: test removePotentialMockConfigCache delete mock-config', function () { 1015 const transformedMockConfigCache: string = 1016 path.resolve(this.rollup.share.projectConfig.cachePath, `./${TRANSFORMED_MOCK_CONFIG}`); 1017 const userDefinedMockConfigCache: string = 1018 path.resolve(this.rollup.share.projectConfig.cachePath, `./${USER_DEFINE_MOCK_CONFIG}`); 1019 fs.writeFileSync(transformedMockConfigCache, '{}'); 1020 fs.writeFileSync(userDefinedMockConfigCache, '{}'); 1021 ModuleSourceFile.removePotentialMockConfigCache(this.rollup); 1022 expect(!fs.existsSync(transformedMockConfigCache)).to.be.true; 1023 expect(!fs.existsSync(userDefinedMockConfigCache)).to.be.true; 1024 }); 1025 1026 mocha.it('7-1: test the error message of generateTransformedMockInfo', function () { 1027 this.rollup.build(); 1028 const moduleInfo: Object = { 1029 filePath: '' 1030 }; 1031 const errInfo: LogData = LogDataFactory.newInstance( 1032 ErrorCode.ETS2BUNDLE_INTERNAL_MOCK_CONFIG_KEY_TO_OHM_URL_CONVERSION_FAILED, 1033 ArkTSInternalErrorDescription, 1034 'Failed to convert the key in mock-config to ohmurl, ' + 1035 'because the file path corresponding to the key in mock-config is empty.' 1036 ); 1037 ModuleSourceFile.initPluginEnv(this.rollup); 1038 const stub = sinon.stub(ModuleSourceFile.logger.getLoggerFromErrorCode(errInfo.code), 'printError'); 1039 this.rollup.moduleInfos.push(moduleInfo); 1040 ModuleSourceFile.generateTransformedMockInfo(moduleInfo, '', 'filePath', this.rollup); 1041 expect(stub.calledWith(errInfo)).to.be.true; 1042 stub.restore(); 1043 }); 1044 1045 mocha.it('7-2: test the error message of generateTransformedMockInfo' + 1046 'without getHvigorConsoleLogger', function () { 1047 this.rollup.build(); 1048 const moduleInfo: Object = { 1049 filePath: '' 1050 }; 1051 const errInfo: LogData = LogDataFactory.newInstance( 1052 ErrorCode.ETS2BUNDLE_INTERNAL_MOCK_CONFIG_KEY_TO_OHM_URL_CONVERSION_FAILED, 1053 ArkTSInternalErrorDescription, 1054 'Failed to convert the key in mock-config to ohmurl, ' + 1055 'because the file path corresponding to the key in mock-config is empty.' 1056 ); 1057 CommonLogger.destroyInstance(); 1058 const getHvigorConsoleLogger = this.rollup.share.getHvigorConsoleLogger; 1059 this.rollup.share.getHvigorConsoleLogger = undefined; 1060 ModuleSourceFile.initPluginEnv(this.rollup); 1061 const stub = sinon.stub(ModuleSourceFile.logger.logger, 'error'); 1062 this.rollup.moduleInfos.push(moduleInfo); 1063 ModuleSourceFile.generateTransformedMockInfo(moduleInfo, '', 'filePath', this.rollup); 1064 expect(stub.calledWith(errInfo.toString())).to.be.true; 1065 CommonLogger.destroyInstance(); 1066 this.rollup.share.getHvigorConsoleLogger = getHvigorConsoleLogger; 1067 stub.restore(); 1068 }); 1069});