'use strict' import { NightwatchBrowser } from 'nightwatch' import init from '../helpers/init' import examples from '../examples/example-contracts' const sources = [ { 'Untitled.sol': { content: examples.ballot.content } } ] module.exports = { '@disabled': true, before: function (browser: NightwatchBrowser, done: VoidFunction) { init(browser, done) }, '@sources': function () { return sources }, 'Should compile using "compileWithParamaters" API #group1': function (browser: NightwatchBrowser) { browser .addFile('test_jsCompile.js', { content: jsCompile }) .executeScriptInTerminal('remix.exeCurrent()') .waitForElementContainsText('*[data-id="terminalJournal"]', '"languageversion":"0.6.8+commit.0bbfe453"', 60000) .click('*[data-id="terminalClearConsole"]') }, 'Should compile using "compileWithParamaters" API with optimization On #group2': function (browser: NightwatchBrowser) { browser .addFile('test_jsCompileWithOptimization.js', { content: jsCompileWithOptimization }) .executeScriptInTerminal('remix.exeCurrent()') .waitForElementContainsText('*[data-id="terminalJournal"]', '\\"optimizer\\":{\\"enabled\\":true,\\"runs\\":300}', 60000) .click('*[data-id="terminalClearConsole"]') }, 'Should compile using "compileWithParamaters" API with optimization off check default runs #group3': function (browser: NightwatchBrowser) { browser .addFile('test_jsCompileWithOptimizationDefault.js', { content: jsCompileWithOptimizationDefault }) .executeScriptInTerminal('remix.exeCurrent()') .waitForElementContainsText('*[data-id="terminalJournal"]', '\\"optimizer\\":{\\"enabled\\":false,\\"runs\\":200}', 60000) .click('*[data-id="terminalClearConsole"]') }, 'Should update the compiler configuration with "setCompilerConfig" API #group4': function (browser: NightwatchBrowser) { browser .addFile('test_updateConfiguration.js', { content: updateConfiguration }) .executeScriptInTerminal('remix.exeCurrent()') .pause(15000) .addFile('test_updateConfiguration.sol', { content: simpleContract }) .verifyContracts(['StorageTestUpdateConfiguration'], { wait: 5000, version: '0.6.8+commit.0bbfe453' }) }, 'Should produce a stack too deep error #group5': function (browser: NightwatchBrowser) { browser .setSolidityCompilerVersion('soljson-v0.8.1+commit.df193b15.js') .addFile('ContractStackLimit.sol', { content: contractStackLimit }) .clickLaunchIcon('solidity') .waitForElementContainsText('*[data-id="compiledErrors"]', 'CompilerError: Stack too deep when compiling inline assembly: Variable headStart is 1 slot(s) too deep inside the stack.', 60000) .end() } } const simpleContract = `pragma solidity >=0.4.22 <0.9.1; /** * @title Storage * @dev Store & retreive value in a variable */ contract StorageTestUpdateConfiguration { uint256 number; /** * @dev Store value in variable * @param num value to store */ function store(uint256 num) public { number = num; } /** * @dev Return value * @return value of 'number' */ function retreive() public view returns (uint256){ return number; } } ` const jsCompile = `(async () => { try { const contract = { "storage.sol": {content : \`${simpleContract}\` } } console.log('compile') const params = { optimize: false, evmVersion: null, language: 'Solidity', version: '0.6.8+commit.0bbfe453' } const result = await remix.call('solidity', 'compileWithParameters', contract, params) console.log('result ', result) } catch (e) { console.log(e.message) } })()` const jsCompileWithOptimization = `(async () => { try { const contract = { "storage.sol": {content : \`${simpleContract}\` } } console.log('compile') const params = { optimize: true, runs: 300, evmVersion: null, language: 'Solidity', version: '0.6.8+commit.0bbfe453' } const result = await remix.call('solidity', 'compileWithParameters', contract, params) console.log('result ', result) } catch (e) { console.log(e.message) } })()` const jsCompileWithOptimizationDefault = `(async () => { try { const contract = { "storage.sol": {content : \`${simpleContract}\` } } console.log('compile') const params = { optimize: false, } const result = await remix.call('solidity', 'compileWithParameters', contract, params) console.log('result ', result) } catch (e) { console.log(e.message) } })()` const updateConfiguration = `(async () => { try { const params = { optimize: false, evmVersion: null, language: 'Solidity', version: '0.6.8+commit.0bbfe453' } await remix.call('solidity', 'setCompilerConfig', params) } catch (e) { console.log(e.message) } })()` const contractStackLimit = ` //SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.1; contract DoesNotCompile { uint u; function fStackLimit(uint u1, uint u2, uint u3, uint u4, uint u5, uint u6, uint u7, uint u8, uint u9, uint u10, uint u11, uint u12) public { } }`