diff --git a/libs/remix-tests/src/compiler.ts b/libs/remix-tests/src/compiler.ts index c287ca3677..740a306931 100644 --- a/libs/remix-tests/src/compiler.ts +++ b/libs/remix-tests/src/compiler.ts @@ -1,6 +1,7 @@ import fs from './fileSystem' import async from 'async' import path from 'path' +import deepequal from 'deep-equal' import Log from './logger' import { Compiler as RemixCompiler } from '@remix-project/remix-solidity' import { SrcIfc, CompilerConfiguration, CompilationErrors } from './types' @@ -170,7 +171,8 @@ export function compileFileOrFiles (filename: string, isDirectory: boolean, opts * @param opts Options * @param cb Callback */ -export function compileContractSources (sources: SrcIfc, compiler: any, opts: any, cb): void { +export function compileContractSources (sources: SrcIfc, newCompConfig: any, importFileCb, UTRunner, opts: any, cb): void { + let compiler const filepath = opts.testFilePath || '' const testFileImportRegEx = /^(import)\s['"](remix_tests.sol|tests.sol)['"];/gm @@ -183,8 +185,28 @@ export function compileContractSources (sources: SrcIfc, compiler: any, opts: an } async.waterfall([ - function doCompilation (next) { + (next) => { + if (!deepequal(UTRunner.compilerConfig, newCompConfig)) { + UTRunner.compilerConfig = newCompConfig + const { currentCompilerUrl, evmVersion, optimize, runs, usingWorker } = newCompConfig + compiler = new RemixCompiler(importFileCb) + compiler.set('evmVersion', evmVersion) + compiler.set('optimize', optimize) + compiler.set('runs', runs) + compiler.loadVersion(usingWorker, currentCompilerUrl) + // @ts-ignore + compiler.event.register('compilerLoaded', this, (version) => { + next() + }) + } else { + compiler = UTRunner.compiler + next() + } + }, + (next) => { const compilationFinishedCb = (success, data, source) => { + // data.error usually exists for exceptions like worker error etc. + if (!data.error) UTRunner.compiler = compiler if (opts && opts.event) opts.event.emit('compilationFinished', success, data, source) next(null, data) } diff --git a/libs/remix-tests/src/runTestSources.ts b/libs/remix-tests/src/runTestSources.ts index 0f2a72cea5..40f0d87788 100644 --- a/libs/remix-tests/src/runTestSources.ts +++ b/libs/remix-tests/src/runTestSources.ts @@ -1,6 +1,4 @@ import async, { ErrorCallback } from 'async' -import deepequal from 'deep-equal' -import { Compiler as RemixCompiler } from '@remix-project/remix-solidity' import { compileContractSources, writeTestAccountsContract } from './compiler' import { deployAll } from './deployer' import { runTest } from './testRunner' @@ -50,29 +48,13 @@ export class UnitTestRunner { * @param importFileCb Import file callback * @param opts Options */ - async runTestSources (contractSources: SrcIfc, compilerConfig: CompilerConfiguration, testCallback, resultCallback, deployCb:any, finalCallback: any, importFileCb, opts: Options) { + async runTestSources (contractSources: SrcIfc, newCompilerConfig: CompilerConfiguration, testCallback, resultCallback, deployCb:any, finalCallback: any, importFileCb, opts: Options) { opts = opts || {} const sourceASTs: any = {} if (opts.web3 || opts.accounts) this.init(opts.web3, opts.accounts) - async.waterfall([ (next) => { - if (!deepequal(this.compilerConfig, compilerConfig)) { - this.compilerConfig = compilerConfig - const { currentCompilerUrl, evmVersion, optimize, runs, usingWorker } = compilerConfig - this.compiler = new RemixCompiler(importFileCb) - this.compiler.set('evmVersion', evmVersion) - this.compiler.set('optimize', optimize) - this.compiler.set('runs', runs) - this.compiler.loadVersion(usingWorker, currentCompilerUrl) - // @ts-ignore - this.compiler.event.register('compilerLoaded', this, (version) => { - next() - }) - } else next() - }, - (next) => { - compileContractSources(contractSources, this.compiler, { accounts: this.testsAccounts, testFilePath: opts.testFilePath, event: this.event }, next) + compileContractSources(contractSources, newCompilerConfig, importFileCb, this, { accounts: this.testsAccounts, testFilePath: opts.testFilePath, event: this.event }, next) }, (compilationResult: compilationInterface, asts: ASTInterface, next) => { for (const filename in asts) { diff --git a/libs/remix-ui/solidity-unit-testing/src/lib/logic/testTabLogic.ts b/libs/remix-ui/solidity-unit-testing/src/lib/logic/testTabLogic.ts index 6e1af409a4..87a6f33d80 100644 --- a/libs/remix-ui/solidity-unit-testing/src/lib/logic/testTabLogic.ts +++ b/libs/remix-ui/solidity-unit-testing/src/lib/logic/testTabLogic.ts @@ -21,23 +21,20 @@ export class TestTabLogic { this.currentPath = this.helper.removeMultipleSlashes(this.helper.removeTrailingSlashes(path)) } - generateTestFolder (path:string) { + async generateTestFolder (path:string) { // Todo move this check to File Manager after refactoring // Checking to ignore the value which contains only whitespaces if (!path || !(/\S/.test(path))) return path = this.helper.removeMultipleSlashes(path) const fileProvider = this.fileManager.fileProviderOf(path.split('/')[0]) - fileProvider.exists(path).then((res: boolean) => { - if (!res) fileProvider.createDir(path) - }) + if(!await fileProvider.exists(path)) fileProvider.createDir(path) } async pathExists (path: string) { // Checking to ignore the value which contains only whitespaces if (!path || !(/\S/.test(path))) return const fileProvider = this.fileManager.fileProviderOf(path.split('/')[0]) - const res = await fileProvider.exists(path, (e: Error, res: boolean) => { return res }) - return res + return await fileProvider.exists(path) } // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/libs/remix-ui/solidity-unit-testing/src/lib/solidity-unit-testing.tsx b/libs/remix-ui/solidity-unit-testing/src/lib/solidity-unit-testing.tsx index 6cb5bc3820..2acb1ee4e4 100644 --- a/libs/remix-ui/solidity-unit-testing/src/lib/solidity-unit-testing.tsx +++ b/libs/remix-ui/solidity-unit-testing/src/lib/solidity-unit-testing.tsx @@ -222,7 +222,8 @@ export const SolidityUnitTesting = (props: Record) => { // eslint-d if (path !== '/') path = helper.removeTrailingSlashes(path) if (inputPath === '') inputPath = defaultPath setInputPathValue(path) - testTabLogic.generateTestFolder(inputPath) + await testTabLogic.generateTestFolder(inputPath) + setToasterMsg('Folder created successfully') setDisableCreateButton(true) setDisableGenerateButton(false) testTabLogic.setCurrentPath(inputPath) @@ -672,6 +673,7 @@ export const SolidityUnitTesting = (props: Record) => { // eslint-d value={inputPathValue} title="Press 'Enter' to change the path for test files." style={{ backgroundImage: "var(--primary)" }} + onKeyDown={() => { if (inputPathValue === '/') setInputPathValue('')} } onKeyUp={handleTestDirInput} onChange={handleEnter} onClick = {() => { if (inputPathValue === '/') setInputPathValue('')} }