/*
 * Copyright (c) 2024 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use rollupObject file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import { expect } from 'chai';
import fs from 'fs';
import mocha from 'mocha';
import path from 'path';
import sinon from 'sinon';

import {
  RELEASE
} from '../../../lib/fast_build/ark_compiler/common/ark_define';
import RollUpPluginMock from '../mock/rollup_mock/rollup_plugin_mock';
import { SourceMapGenerator } from '../../../lib/fast_build/ark_compiler/generate_sourcemap';
import {
  ENTRYABILITY_JS_PATH_DEFAULT,
  ENTRYABILITY_TS_PATH_DEFAULT,
  ENTRY_PACKAGE_NAME_DEFAULT,
  ENTRY_MODULE_VERSION_DEFAULT,
  INDEX_ETS_PATH_DEFAULT,
  INDEX_JS_CACHE_PATH
} from '../mock/rollup_mock/common';
import {
  compilingEtsOrTsFiles,
  hasTsNoCheckOrTsIgnoreFiles,
  cleanUpFilesList
} from '../../../lib/fast_build/ark_compiler/utils';
import {
  ArkTSInternalErrorDescription,
  ErrorCode,
} from '../../../lib/fast_build/ark_compiler/error_code';
import {
  CommonLogger,
  LogData,
  LogDataFactory
} from '../../../lib/fast_build/ark_compiler/logger';

const prefix = `${ENTRY_PACKAGE_NAME_DEFAULT}|${ENTRY_PACKAGE_NAME_DEFAULT}|${ENTRY_MODULE_VERSION_DEFAULT}|`;
let entryPkgInfo = `${ENTRY_PACKAGE_NAME_DEFAULT}|${ENTRY_MODULE_VERSION_DEFAULT}`;

mocha.describe('test generate_sourcemap api', function () {
  mocha.before(function () {
    this.rollup = new RollUpPluginMock();
  });

  mocha.after(() => {
    delete this.rollup;
  });

  mocha.it('1-1: test getPkgInfoByModuleId under build debug', function () {
    this.rollup.build();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let pkgInfo = sourceMapGenerator.getPkgInfoByModuleId(moduleId);

    expect(pkgInfo && pkgInfo.entry && pkgInfo.modulePath && pkgInfo.entry.name && pkgInfo.entry.version !== '' && pkgInfo.entry.version != undefined).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('1-2: test getPkgInfoByModuleId under build release', function () {
    this.rollup.build(RELEASE);
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let pkgInfo = sourceMapGenerator.getPkgInfoByModuleId(moduleId);

    expect(pkgInfo && pkgInfo.entry && pkgInfo.modulePath && pkgInfo.entry.name && pkgInfo.entry.version !== '' && pkgInfo.entry.version != undefined).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('1-3: test getPkgInfoByModuleId under preview', function () {
    this.rollup.preview();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let pkgInfo = sourceMapGenerator.getPkgInfoByModuleId(moduleId);

    expect(pkgInfo && pkgInfo.entry && pkgInfo.modulePath && pkgInfo.entry.name && pkgInfo.entry.version !== '' && pkgInfo.entry.version != undefined).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('1-4: test getPkgInfoByModuleId under hotReload', function () {
    this.rollup.hotReload();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let pkgInfo = sourceMapGenerator.getPkgInfoByModuleId(moduleId);

    expect(pkgInfo && pkgInfo.entry && pkgInfo.modulePath && pkgInfo.entry.name && pkgInfo.entry.version !== '' && pkgInfo.entry.version != undefined).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('1-5: test getPkgInfoByModuleId with file name obfuscate', function () {
    this.rollup.build();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    compilingEtsOrTsFiles.push(moduleId);
    let pkgInfo = sourceMapGenerator.getPkgInfoByModuleId(moduleId, true);
    expect(pkgInfo && pkgInfo.entry && pkgInfo.modulePath && pkgInfo.entry.name && pkgInfo.entry.version !== '' && pkgInfo.entry.version != undefined).to.be.true;
    expect(pkgInfo.modulePath == 'src/main/a/b.ts').to.be.true;
    cleanUpFilesList();
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('1-6: test GetModuleInfoFaild error of getPkgInfoByModuleId', function () {
    this.rollup.build();
    const errInfo: LogData = LogDataFactory.newInstance(
      ErrorCode.ETS2BUNDLE_INTERNAL_GET_MODULE_INFO_FAILED,
      ArkTSInternalErrorDescription,
      'Failed to get ModuleInfo, moduleId: moduleId',
      '',
      ['Please check if the imported file moduleId includes the .js suffix.']
    );
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = "moduleId";
    const getModuleInfoStub = sinon.stub(SourceMapGenerator.rollupObject, 'getModuleInfo').returns(undefined);
    const stub = sinon.stub(sourceMapGenerator.logger.getLoggerFromErrorCode(errInfo.code), 'printErrorAndExit');

    try {
      sourceMapGenerator.getPkgInfoByModuleId(moduleId);
    } catch (e) {
    }
    expect(stub.calledWith(errInfo)).to.be.true;
    getModuleInfoStub.restore();
    stub.restore();
    SourceMapGenerator.cleanSourceMapObject();
  })

  mocha.it('1-6-1: test GetModuleInfoFaild error of getPkgInfoByModuleId ' +
    'without getHvigorConsoleLogger', function () {
    this.rollup.build();
    const errInfo: LogData = LogDataFactory.newInstance(
      ErrorCode.ETS2BUNDLE_INTERNAL_GET_MODULE_INFO_FAILED,
      ArkTSInternalErrorDescription,
      'Failed to get ModuleInfo, moduleId: moduleId',
      '',
      ['Please check if the imported file moduleId includes the .js suffix.']
    );
    CommonLogger.destroyInstance();
    const getHvigorConsoleLogger = this.rollup.share.getHvigorConsoleLogger;
    this.rollup.share.getHvigorConsoleLogger = undefined;
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = "moduleId";
    const getModuleInfoStub = sinon.stub(SourceMapGenerator.rollupObject, 'getModuleInfo').returns(undefined);
    const stub = sinon.stub(sourceMapGenerator.logger, 'throwArkTsCompilerError');

    try {
      sourceMapGenerator.getPkgInfoByModuleId(moduleId);
    } catch (e) {
    }
    expect(stub.calledWith(errInfo.toString())).to.be.true;
    CommonLogger.destroyInstance();
    this.rollup.share.getHvigorConsoleLogger = getHvigorConsoleLogger;
    getModuleInfoStub.restore();
    stub.restore();
    SourceMapGenerator.cleanSourceMapObject();
  })

  mocha.it('1-7: test UnableToGetModuleInfoMeta error of getPkgInfoByModuleId', function () {
    this.rollup.build();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = "moduleId";
    const getModuleInfoStub = sinon.stub(SourceMapGenerator.rollupObject, 'getModuleInfo').returns({'meta': undefined});
    const stub = sinon.stub(sourceMapGenerator.logger, 'printErrorAndExit');

    try {
      sourceMapGenerator.getPkgInfoByModuleId(moduleId);
    } catch (e) {
    }
    const errInfo: LogData = LogDataFactory.newInstance(
      ErrorCode.ETS2BUNDLE_INTERNAL_UNABLE_TO_GET_MODULE_INFO_META,
      ArkTSInternalErrorDescription,
      "Failed to get ModuleInfo properties 'meta', moduleId: moduleId"
    );
    expect(stub.calledWith(errInfo)).to.be.true;
    getModuleInfoStub.restore();
    stub.restore();
    SourceMapGenerator.cleanSourceMapObject();
  })

  mocha.it('1-8: test UnableToGetModuleInfoMetaPkgPath error of getPkgInfoByModuleId', function () {
    this.rollup.build();
    const errInfo: LogData = LogDataFactory.newInstance(
      ErrorCode.ETS2BUNDLE_INTERNAL_UNABLE_TO_GET_MODULE_INFO_META_PKG_PATH,
      ArkTSInternalErrorDescription,
      "Failed to get ModuleInfo properties 'meta.pkgPath', moduleId: moduleId"
    );
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = "moduleId";
    const getModuleInfoStub = sinon.stub(SourceMapGenerator.rollupObject, 'getModuleInfo').returns({'meta': {'pkgPath': undefined}});
    const stub = sinon.stub(sourceMapGenerator.logger.getLoggerFromErrorCode(errInfo.code), 'printErrorAndExit');

    try {
      sourceMapGenerator.getPkgInfoByModuleId(moduleId);
    } catch (e) {
    }
    expect(stub.calledWith(errInfo)).to.be.true;
    getModuleInfoStub.restore();
    stub.restore();
    SourceMapGenerator.cleanSourceMapObject();
  })

  mocha.it('1-9: test UnableToGetModuleInfoMetaPkgPath error of getPkgInfoByModuleId ' +
    'without getHvigorConsoleLogger', function () {
    this.rollup.build();
    const errInfo: LogData = LogDataFactory.newInstance(
      ErrorCode.ETS2BUNDLE_INTERNAL_UNABLE_TO_GET_MODULE_INFO_META_PKG_PATH,
      ArkTSInternalErrorDescription,
      "Failed to get ModuleInfo properties 'meta.pkgPath', moduleId: moduleId"
    );
    CommonLogger.destroyInstance();
    const getHvigorConsoleLogger = this.rollup.share.getHvigorConsoleLogger;
    this.rollup.share.getHvigorConsoleLogger = undefined;
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = "moduleId";
    const getModuleInfoStub = sinon.stub(SourceMapGenerator.rollupObject, 'getModuleInfo').returns({'meta': {'pkgPath': undefined}});
    const stub = sinon.stub(sourceMapGenerator.logger, 'throwArkTsCompilerError');

    try {
      sourceMapGenerator.getPkgInfoByModuleId(moduleId);
    } catch (e) {
    }
    expect(stub.calledWith(errInfo.toString())).to.be.true;
    CommonLogger.destroyInstance();
    this.rollup.share.getHvigorConsoleLogger = getHvigorConsoleLogger;
    getModuleInfoStub.restore();
    stub.restore();
    SourceMapGenerator.cleanSourceMapObject();
  })

  mocha.it('2-1: test genKey under build debug', function () {
    this.rollup.build();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let genKey = sourceMapGenerator.genKey(moduleId);
    let expectKey = prefix + ENTRYABILITY_TS_PATH_DEFAULT.substring(1);

    expect(genKey === expectKey).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('2-2: test genKey under build release', function () {
    this.rollup.build(RELEASE);
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let genKey = sourceMapGenerator.genKey(moduleId);
    let expectKey = prefix + ENTRYABILITY_TS_PATH_DEFAULT.substring(1);

    expect(genKey === expectKey).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('2-3: test genKey under preview', function () {
    this.rollup.preview();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let genKey = sourceMapGenerator.genKey(moduleId);
    let expectKey = prefix + ENTRYABILITY_TS_PATH_DEFAULT.substring(1);

    expect(genKey === expectKey).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('2-4: test genKey under hotReload', function () {
    this.rollup.hotReload();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let genKey = sourceMapGenerator.genKey(moduleId);
    let expectKey = prefix + ENTRYABILITY_TS_PATH_DEFAULT.substring(1);

    expect(genKey === expectKey).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('2-5: test genKey with file name obfuscate', function () {
    this.rollup.build();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let genKey = sourceMapGenerator.genKey(moduleId, true);
    let expectKey = 'entry|entry|1.0.0|src/main/a/b.ts';
    expect(genKey === expectKey).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('3-1: test updateSourceMap under build debug', function () {
    this.rollup.build();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let sourceMapData = { version: '1.0.0' };
    sourceMapGenerator.updateSourceMap(moduleId, sourceMapData);
    let sourceMapDataGet = sourceMapGenerator.getSourceMap(moduleId);
    expect(sourceMapData === sourceMapDataGet).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('3-2: test updateSourceMap under build release', function () {
    this.rollup.build(RELEASE);
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let sourceMapData = { version: '1.0.0' };
    sourceMapGenerator.updateSourceMap(moduleId, sourceMapData);
    let sourceMapDataGet = sourceMapGenerator.getSourceMap(moduleId);
    expect(sourceMapData === sourceMapDataGet).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('3-3: test updateSourceMap under preview', function () {
    this.rollup.preview();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let sourceMapData = { version: '1.0.0' };
    sourceMapGenerator.updateSourceMap(moduleId, sourceMapData);
    let sourceMapDataGet = sourceMapGenerator.getSourceMap(moduleId);
    expect(sourceMapData === sourceMapDataGet).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('3-4: test updateSourceMap under hotReload', function () {
    this.rollup.hotReload();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let sourceMapData = { version: '1.0.0' };
    sourceMapGenerator.updateSourceMap(moduleId, sourceMapData);
    let sourceMapDataGet = sourceMapGenerator.getSourceMap(moduleId);
    expect(sourceMapData === sourceMapDataGet).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('4-1: test fillSourceMapPackageInfo under build debug', function () {
    this.rollup.build();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);

    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let sourceMapData = {};
    sourceMapGenerator.fillSourceMapPackageInfo(moduleId, sourceMapData);
    expect(sourceMapData['entry-package-info'] && sourceMapData['entry-package-info'] === entryPkgInfo).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('4-2: test fillSourceMapPackageInfo under build release', function () {
    this.rollup.build(RELEASE);
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);

    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let sourceMapData = {};
    sourceMapGenerator.fillSourceMapPackageInfo(moduleId, sourceMapData);
    expect(sourceMapData['entry-package-info'] && sourceMapData['entry-package-info'] === entryPkgInfo).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('4-3: test fillSourceMapPackageInfo under preview', function () {
    this.rollup.preview();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);

    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let sourceMapData = {};
    sourceMapGenerator.fillSourceMapPackageInfo(moduleId, sourceMapData);
    expect(sourceMapData['entry-package-info'] && sourceMapData['entry-package-info'] === entryPkgInfo).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('4-4: test fillSourceMapPackageInfo under hotReload', function () {
    this.rollup.hotReload();
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);

    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    let sourceMapData = {};
    sourceMapGenerator.fillSourceMapPackageInfo(moduleId, sourceMapData);
    expect(sourceMapData['entry-package-info'] && sourceMapData['entry-package-info'] === entryPkgInfo).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('5-1: test genKey under build debug: arkProjectConfig.processTs is true', function () {
    this.rollup.build();
    this.rollup.share.arkProjectConfig.processTs = true;
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    compilingEtsOrTsFiles.push(moduleId);
    hasTsNoCheckOrTsIgnoreFiles.push(moduleId);
    let genKey = sourceMapGenerator.genKey(moduleId);
    cleanUpFilesList();
    let expectKey = prefix + ENTRYABILITY_JS_PATH_DEFAULT.substring(1);
    expect(genKey === expectKey).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('5-2: test genKey under build release: arkProjectConfig.processTs is true', function () {
    this.rollup.build(RELEASE);
    this.rollup.share.arkProjectConfig.processTs = true;
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    compilingEtsOrTsFiles.push(moduleId);
    hasTsNoCheckOrTsIgnoreFiles.push(moduleId);
    let genKey = sourceMapGenerator.genKey(moduleId);
    cleanUpFilesList();
    let expectKey = prefix + ENTRYABILITY_JS_PATH_DEFAULT.substring(1);
    expect(genKey === expectKey).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('5-3: test genKey under preview: arkProjectConfig.processTs is true', function () {
    this.rollup.preview();
    this.rollup.share.arkProjectConfig.processTs = true;
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    compilingEtsOrTsFiles.push(moduleId);
    hasTsNoCheckOrTsIgnoreFiles.push(moduleId);
    let genKey = sourceMapGenerator.genKey(moduleId);
    cleanUpFilesList();
    let expectKey = prefix + ENTRYABILITY_JS_PATH_DEFAULT.substring(1);
    expect(genKey === expectKey).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('5-4: test genKey under hotReload: arkProjectConfig.processTs is true', function () {
    this.rollup.hotReload();
    this.rollup.share.arkProjectConfig.processTs = true;
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, ENTRYABILITY_TS_PATH_DEFAULT);
    compilingEtsOrTsFiles.push(moduleId);
    hasTsNoCheckOrTsIgnoreFiles.push(moduleId);
    let genKey = sourceMapGenerator.genKey(moduleId);
    cleanUpFilesList();
    let expectKey = prefix + ENTRYABILITY_JS_PATH_DEFAULT.substring(1);
    expect(genKey === expectKey).to.be.true;
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('6-1: test updateCachedSourceMaps under build debug: arkProjectConfig.processTs is true', function () {
    this.rollup.build();
    this.rollup.share.arkProjectConfig.processTs = true;
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, INDEX_ETS_PATH_DEFAULT);
    compilingEtsOrTsFiles.push(moduleId);
    hasTsNoCheckOrTsIgnoreFiles.push(moduleId);
    const indexCachePath = this.rollup.share.projectConfig.projectRootPath + '/' + INDEX_JS_CACHE_PATH;
    if (fs.existsSync(indexCachePath)) {
      fs.rmSync(indexCachePath);
    }
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    sourceMapGenerator.isNewSourceMap = false;
    const rootPath = this.rollup.share.projectConfig.projectRootPath + '/cache/';
    const sourceMapEdit = JSON.parse(fs.readFileSync(rootPath + 'source_map_edit.json').toString());
    const sourceMapExpect = JSON.parse(fs.readFileSync(rootPath + 'source_map_expect.json').toString());
    sourceMapGenerator.cacheSourceMapPath = rootPath + 'source_map_cache.json';
    sourceMapGenerator.sourceMaps = sourceMapEdit;
    const sourceMapResult = sourceMapGenerator.updateCachedSourceMaps();
    expect(Object.keys(sourceMapResult).length == Object.keys(sourceMapExpect).length).to.be.true;
    Object.keys(sourceMapResult).forEach(key => {
      expect(sourceMapExpect).to.include.keys(key);
    });
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('6-2: test updateCachedSourceMaps under build release: arkProjectConfig.processTs is true', function () {
    this.rollup.build(RELEASE);
    this.rollup.share.arkProjectConfig.processTs = true;
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, INDEX_ETS_PATH_DEFAULT);
    compilingEtsOrTsFiles.push(moduleId);
    hasTsNoCheckOrTsIgnoreFiles.push(moduleId);
    const indexCachePath = this.rollup.share.projectConfig.projectRootPath + '/' + INDEX_JS_CACHE_PATH;
    if (fs.existsSync(indexCachePath)) {
      fs.rmSync(indexCachePath);
    }
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    sourceMapGenerator.isNewSourceMap = false;
    const rootPath = this.rollup.share.projectConfig.projectRootPath + '/cache/';
    const sourceMapEdit = JSON.parse(fs.readFileSync(rootPath + 'source_map_edit.json').toString());
    const sourceMapExpect = JSON.parse(fs.readFileSync(rootPath + 'source_map_expect.json').toString());
    sourceMapGenerator.cacheSourceMapPath = rootPath + 'source_map_cache.json';
    sourceMapGenerator.sourceMaps = sourceMapEdit;
    const sourceMapResult = sourceMapGenerator.updateCachedSourceMaps();
    expect(Object.keys(sourceMapResult).length == Object.keys(sourceMapExpect).length).to.be.true;
    Object.keys(sourceMapResult).forEach(key => {
      expect(sourceMapExpect).to.include.keys(key);
    });
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('6-3: test updateCachedSourceMaps under preview: arkProjectConfig.processTs is true', function () {
    this.rollup.preview();
    this.rollup.share.arkProjectConfig.processTs = true;
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, INDEX_ETS_PATH_DEFAULT);
    compilingEtsOrTsFiles.push(moduleId);
    hasTsNoCheckOrTsIgnoreFiles.push(moduleId);
    const indexCachePath = this.rollup.share.projectConfig.projectRootPath + '/' + INDEX_JS_CACHE_PATH;
    if (fs.existsSync(indexCachePath)) {
      fs.rmSync(indexCachePath);
    }
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    sourceMapGenerator.isNewSourceMap = false;
    const rootPath = this.rollup.share.projectConfig.projectRootPath + '/cache/';
    const sourceMapEdit = JSON.parse(fs.readFileSync(rootPath + 'source_map_edit.json').toString());
    const sourceMapExpect = JSON.parse(fs.readFileSync(rootPath + 'source_map_expect_preview.json').toString());
    sourceMapGenerator.cacheSourceMapPath = rootPath + 'source_map_cache_preview.json';
    sourceMapGenerator.sourceMaps = sourceMapEdit;
    const sourceMapResult = sourceMapGenerator.updateCachedSourceMaps();
    expect(Object.keys(sourceMapResult).length == Object.keys(sourceMapExpect).length).to.be.true;
    Object.keys(sourceMapResult).forEach(key => {
      expect(sourceMapExpect).to.include.keys(key);
    });
    SourceMapGenerator.cleanSourceMapObject();
  });

  mocha.it('6-4: test updateCachedSourceMaps under hotReload: arkProjectConfig.processTs is true', function () {
    this.rollup.hotReload();
    this.rollup.share.arkProjectConfig.processTs = true;
    let moduleId = path.join(this.rollup.share.projectConfig.modulePath, INDEX_ETS_PATH_DEFAULT);
    compilingEtsOrTsFiles.push(moduleId);
    hasTsNoCheckOrTsIgnoreFiles.push(moduleId);
    const indexCachePath = this.rollup.share.projectConfig.projectRootPath + '/' + INDEX_JS_CACHE_PATH;
    if (fs.existsSync(indexCachePath)) {
      fs.rmSync(indexCachePath);
    }
    const sourceMapGenerator: SourceMapGenerator = SourceMapGenerator.initInstance(this.rollup);
    sourceMapGenerator.isNewSourceMap = false;
    const rootPath = this.rollup.share.projectConfig.projectRootPath + '/cache/';
    const sourceMapEdit = JSON.parse(fs.readFileSync(rootPath + 'source_map_edit.json').toString());
    const sourceMapExpect = JSON.parse(fs.readFileSync(rootPath + 'source_map_expect.json').toString());
    sourceMapGenerator.cacheSourceMapPath = rootPath + 'source_map_cache.json';
    sourceMapGenerator.sourceMaps = sourceMapEdit;
    const sourceMapResult = sourceMapGenerator.updateCachedSourceMaps();
    expect(Object.keys(sourceMapResult).length == Object.keys(sourceMapExpect).length).to.be.true;
    Object.keys(sourceMapResult).forEach(key => {
      expect(sourceMapExpect).to.include.keys(key);
    });
    SourceMapGenerator.cleanSourceMapObject();
  });

});