diff --git a/apps/remix-ide-e2e/nightwatch.ts b/apps/remix-ide-e2e/nightwatch.ts
index d8a111a617..7ca74fd2a7 100644
--- a/apps/remix-ide-e2e/nightwatch.ts
+++ b/apps/remix-ide-e2e/nightwatch.ts
@@ -20,15 +20,7 @@ module.exports = {
on_failure: true,
on_error: true
},
- desiredCapabilities: {
- browserName: 'firefox',
- javascriptEnabled: true,
- acceptSslCerts: true,
- 'moz:firefoxOptions': {
- args: ['-headless']
- }
- },
- exclude: ['dist/apps/remix-ide-e2e/src/tests/runAndDeploy.js', 'dist/apps/remix-ide-e2e/src/tests/pluginManager.spec.ts']
+ exclude: ['dist/apps/remix-ide-e2e/src/tests/runAndDeploy.test.js', 'dist/apps/remix-ide-e2e/src/tests/pluginManager.test.ts']
},
chrome: {
diff --git a/apps/remix-ide-e2e/src/checkGroupTests.js b/apps/remix-ide-e2e/src/checkGroupTests.js
index dba67a920e..bb26940d1d 100644
--- a/apps/remix-ide-e2e/src/checkGroupTests.js
+++ b/apps/remix-ide-e2e/src/checkGroupTests.js
@@ -6,7 +6,7 @@ fs.readdirSync(testFolder).forEach(file => {
const content = fs.readFileSync(testFolder + file, 'utf8')
const matches = content.match(/group\d+/g)
if (matches) {
- const disabled = content.includes('@disabled')
+ const disabled = content.includes('\'@disabled\': true') || content.includes('\'@disabled\':true')
if (!disabled) {
console.log(`WARNING ${file} has group tests but is not disabled`)
}
diff --git a/apps/remix-ide-e2e/src/commands/openFile.ts b/apps/remix-ide-e2e/src/commands/openFile.ts
index d1cf4aa0e4..f8191e874f 100644
--- a/apps/remix-ide-e2e/src/commands/openFile.ts
+++ b/apps/remix-ide-e2e/src/commands/openFile.ts
@@ -15,13 +15,24 @@ class OpenFile extends EventEmitter {
// click on fileExplorer can toggle it. We go through settings to be sure FE is open
function openFile (browser: NightwatchBrowser, name: string, done: VoidFunction) {
- browser.clickLaunchIcon('settings').clickLaunchIcon('filePanel')
- .waitForElementVisible('li[data-id="treeViewLitreeViewItem' + name + '"', 60000)
- .click('li[data-id="treeViewLitreeViewItem' + name + '"')
- .pause(2000)
- .perform(() => {
- done()
- })
+ browser.perform((done) => {
+ browser.isVisible('[data-id="remixIdeSidePanel"]', (result) => {
+ if (result.value) {
+ // if side panel is shown, check this is the file panel
+ browser.element('css selector', '[data-id="verticalIconsKindfilePanel"] img[data-id="selected"]', (result) => {
+ if (result.status === 0) {
+ done()
+ } else browser.clickLaunchIcon('filePanel').perform(done)
+ })
+ } else browser.clickLaunchIcon('filePanel').perform(done)
+ })
+ })
+ .waitForElementVisible('li[data-id="treeViewLitreeViewItem' + name + '"', 60000)
+ .click('li[data-id="treeViewLitreeViewItem' + name + '"')
+ .pause(2000)
+ .perform(() => {
+ done()
+ })
}
module.exports = OpenFile
diff --git a/apps/remix-ide-e2e/src/select_tests.sh b/apps/remix-ide-e2e/src/select_tests.sh
index 4cd3f36c00..65fa5c1656 100644
--- a/apps/remix-ide-e2e/src/select_tests.sh
+++ b/apps/remix-ide-e2e/src/select_tests.sh
@@ -26,7 +26,7 @@ do
done
npm run build:e2e
PS3='Select a test or command: '
-TESTFILES=( $(grep -IRiL "disabled" "dist/apps/remix-ide-e2e/src/tests" | grep "\.spec\|\.test\|plugin_api" | sort ) )
+TESTFILES=( $(grep -IRiL "\'@disabled\': \?true" "dist/apps/remix-ide-e2e/src/tests" | grep "\.spec\|\.test\|plugin_api" | sort ) )
# declare -p TESTFILES
TESTFILES+=("list")
diff --git a/apps/remix-ide-e2e/src/tests/stress.editor.ts b/apps/remix-ide-e2e/src/tests/stress.editor.ts
deleted file mode 100644
index ddb007b12a..0000000000
--- a/apps/remix-ide-e2e/src/tests/stress.editor.ts
+++ /dev/null
@@ -1,195 +0,0 @@
-'use strict'
-
-import { NightwatchBrowser } from 'nightwatch'
-import init from '../helpers/init'
-
-module.exports = {
-
- before: function (browser: NightwatchBrowser, done: VoidFunction) {
- init(browser, done)
- },
-
- 'Should create 10 files, reload, and check if the files are saved': function (browser: NightwatchBrowser) {
- const contents = {}
- const checkContent = function (i, done) {
- const name = 'test_' + i + '.sol'
- browser
- .openFile(name)
- .pause(500)
- .getEditorValue((content) => {
- browser.assert.ok(content === contents[i])
- done()
- })
- }
- browser.clickLaunchIcon('filePanel').perform((done) => {
- let contentEditSet = content.slice()
- for (let i = 0; i < 10; i++) {
- contentEditSet += contentEditSet
- contents[i] = contentEditSet
- const name = 'test_' + i + '.sol'
- browser.click('[data-id="fileExplorerNewFilecreateNewFile"]')
- .waitForElementContainsText('*[data-id$="/blank"]', '', 60000)
- .sendKeys('*[data-id$="/blank"] .remixui_items', name)
- .sendKeys('*[data-id$="/blank"] .remixui_items', browser.Keys.ENTER)
- .waitForElementVisible(`li[data-id="treeViewLitreeViewItem${name}"]`, 60000)
- .setEditorValue(contentEditSet)
- }
- done()
- }).pause(10000).refresh()
- .perform(done => checkContent(0, done))
- .perform(done => checkContent(1, done))
- .perform(done => checkContent(2, done))
- .perform(done => checkContent(3, done))
- .perform(done => checkContent(4, done))
- .perform(done => checkContent(5, done))
- .perform(done => checkContent(6, done))
- .perform(done => checkContent(7, done))
- .perform(done => checkContent(8, done))
- .perform(done => checkContent(9, done))
- .end()
- }
-}
-
-const content = `
-// SPDX-License-Identifier: GPL-3.0
-
-pragma solidity >=0.7.0 <0.9.0;
-
-/**
- * @title Ballot
- * @dev Implements voting process along with vote delegation|
- */
-contract Ballot {
-
- struct Voter {
- uint weight; // weight is accumulated by delegation
- bool voted; // if true, that person already voted
- address delegate; // person delegated to
- uint vote; // index of the voted proposal
- }
-
- struct Proposal {
- // If you can limit the length to a certain number of bytes,
- // always use one of bytes1 to bytes32 because they are much cheaper
- bytes32 name; // short name (up to 32 bytes)
- uint voteCount; // number of accumulated votes
- }
-
- address public chairperson;
-
- mapping(address => Voter) public voters;
-
- Proposal[] public proposals;
-
-function () test {
-
- /**
- * @dev Create a new ballot to choose one of 'proposalNames'.
- * @param proposalNames names of proposals
- */
- constructor(bytes32[] memory proposalNames) {
- chairperson = msg.sender;
- voters[chairperson].weight = 1;
-
- for (uint i = 0; i < proposalNames.length; i++) {
- // 'Proposal({...})' creates a temporary
- // Proposal object and 'proposals.push(...)'
- // appends it to the end of 'proposals'.
- proposals.push(Proposal({
- name: proposalNames[i],
- voteCount: 0
- }));
- }
- }
-
- /**
- * @dev Give 'voter' the right to vote on this ballot. May only be called by 'chairperson'.
- * @param voter address of voter
- */
- function giveRightToVote(address voter) public {
- require(
- msg.sender == chairperson,
- "Only chairperson can give right to vote."
- );
- require(
- !voters[voter].voted,
- "The voter already voted."
- );
- require(voters[voter].weight == 0);
- voters[voter].weight = 1;
- }
-
- /**
- * @dev Delegate your vote to the voter 'to'.
- * @param to address to which vote is delegated
- */
- function delegate(address to) public {
- Voter storage sender = voters[msg.sender];
- require(!sender.voted, "You already voted.");
- require(to != msg.sender, "Self-delegation is disallowed.");
-
- while (voters[to].delegate != address(0)) {
- to = voters[to].delegate;
-
- // We found a loop in the delegation, not allowed.
- require(to != msg.sender, "Found loop in delegation.");
- }
- sender.voted = true;
- sender.delegate = to;
- Voter storage delegate_ = voters[to];
- if (delegate_.voted) {
- // If the delegate already voted,
- // directly add to the number of votes
- proposals[delegate_.vote].voteCount += sender.weight;
- } else {
- // If the delegate did not vote yet,
- // add to her weight.
- delegate_.weight += sender.weight;
- }
- }
-
- /**
- * @dev Give your vote (including votes delegated to you) to proposal 'proposals[proposal].name'.
- * @param proposal index of proposal in the proposals array
- */
- function vote(uint proposal) public {
- Voter storage sender = voters[msg.sender];
- require(sender.weight != 0, "Has no right to vote");
- require(!sender.voted, "Already voted.");
- sender.voted = true;
- sender.vote = proposal;
-
- // If 'proposal' is out of the range of the array,
- // this will throw automatically and revert all
- // changes.
- proposals[proposal].voteCount += sender.weight;
- }
-
- /**
- * @dev Computes the winning proposal taking all previous votes into account.
- * @return winningProposal_ index of winning proposal in the proposals array
- */
- function winningProposal() public view
- returns (uint winningProposal_)
- {
- uint winningVoteCount = 0;
- for (uint p = 0; p < proposals.length; p++) {
- if (proposals[p].voteCount > winningVoteCount) {
- winningVoteCount = proposals[p].voteCount;
- winningProposal_ = p;
- }
- }
- }
-
- /**
- * @dev Calls winningProposal() function to get the index of the winner contained in the proposals array and then
- * @return winnerName_ the name of the winner
- */
- function winnerName() public view
- returns (bytes32 winnerName_)
- {
- winnerName_ = proposals[winningProposal()].name;
- }
-}
-
-`
diff --git a/apps/remix-ide-e2e/src/tests/stressEditor.test.ts b/apps/remix-ide-e2e/src/tests/stressEditor.test.ts
new file mode 100644
index 0000000000..ed0382bcb7
--- /dev/null
+++ b/apps/remix-ide-e2e/src/tests/stressEditor.test.ts
@@ -0,0 +1,342 @@
+'use strict'
+
+import { NightwatchBrowser } from 'nightwatch'
+import init from '../helpers/init'
+
+module.exports = {
+
+ before: function (browser: NightwatchBrowser, done: VoidFunction) {
+ init(browser, done)
+ },
+
+ 'Should create 10 files, reload, and check if the files are saved': function (browser: NightwatchBrowser) {
+ const contents = {}
+ const checkContent = (i, done) => {
+ const name = 'test_' + i + '.sol'
+ browser
+ .openFile(name)
+ .getEditorValue((content) => {
+ browser.assert.ok(content === contents[i])
+ browser.assert.ok(content === contents[i])
+ done()
+ })
+ }
+ const fillContent = (content, mul) => {
+ let localContent = content
+ mul = 3 * mul
+ for (let k = 0 ; k < mul; k++) {
+ localContent += content
+ }
+ return localContent
+ }
+ browser.clickLaunchIcon('filePanel')
+ .perform((done) => {
+ const i = 0
+ const localContent = fillContent(content, i)
+ contents[i] = localContent
+ const name = 'test_' + i + '.sol'
+ browser.click('[data-id="fileExplorerNewFilecreateNewFile"]')
+ .waitForElementContainsText('*[data-id$="/blank"]', '', 60000)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', name)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', browser.Keys.ENTER)
+ .getText('.remix_ui_terminal_block', (result) => {
+ console.log(result)
+ })
+ .waitForElementVisible(`li[data-id="treeViewLitreeViewItem${name}"]`, 60000)
+ .setEditorValue(localContent)
+ done()
+ }).perform((done) => {
+ const i = 1
+ const localContent = fillContent(content, i)
+ contents[i] = localContent
+ const name = 'test_' + i + '.sol'
+ browser.click('[data-id="fileExplorerNewFilecreateNewFile"]')
+ .waitForElementContainsText('*[data-id$="/blank"]', '', 60000)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', name)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', browser.Keys.ENTER)
+ .getText('.remix_ui_terminal_block', (result) => {
+ console.log(result)
+ })
+ .waitForElementVisible(`li[data-id="treeViewLitreeViewItem${name}"]`, 60000)
+ .setEditorValue(localContent)
+ done()
+ }).perform((done) => {
+ const i = 2
+ const localContent = fillContent(content, i)
+ contents[i] = localContent
+ const name = 'test_' + i + '.sol'
+ browser.click('[data-id="fileExplorerNewFilecreateNewFile"]')
+ .waitForElementContainsText('*[data-id$="/blank"]', '', 60000)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', name)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', browser.Keys.ENTER)
+ .getText('.remix_ui_terminal_block', (result) => {
+ console.log(result)
+ })
+ .waitForElementVisible(`li[data-id="treeViewLitreeViewItem${name}"]`, 60000)
+ .setEditorValue(localContent)
+ done()
+ }).perform((done) => {
+ const i = 3
+ const localContent = fillContent(content, i)
+ contents[i] = localContent
+ const name = 'test_' + i + '.sol'
+ browser.click('[data-id="fileExplorerNewFilecreateNewFile"]')
+ .waitForElementContainsText('*[data-id$="/blank"]', '', 60000)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', name)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', browser.Keys.ENTER)
+ .getText('.remix_ui_terminal_block', (result) => {
+ console.log(result)
+ })
+ .waitForElementVisible(`li[data-id="treeViewLitreeViewItem${name}"]`, 60000)
+ .setEditorValue(localContent)
+ done()
+ }).perform((done) => {
+ const i = 4
+ const localContent = fillContent(content, i)
+ contents[i] = localContent
+ const name = 'test_' + i + '.sol'
+ browser.click('[data-id="fileExplorerNewFilecreateNewFile"]')
+ .waitForElementContainsText('*[data-id$="/blank"]', '', 60000)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', name)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', browser.Keys.ENTER)
+ .getText('.remix_ui_terminal_block', (result) => {
+ console.log(result)
+ })
+ .waitForElementVisible(`li[data-id="treeViewLitreeViewItem${name}"]`, 60000)
+ .setEditorValue(localContent)
+ done()
+ }).perform((done) => {
+ const i = 5
+ const localContent = fillContent(content, i)
+ contents[i] = localContent
+ const name = 'test_' + i + '.sol'
+ browser.click('[data-id="fileExplorerNewFilecreateNewFile"]')
+ .waitForElementContainsText('*[data-id$="/blank"]', '', 60000)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', name)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', browser.Keys.ENTER)
+ .getText('.remix_ui_terminal_block', (result) => {
+ console.log(result)
+ })
+ .waitForElementVisible(`li[data-id="treeViewLitreeViewItem${name}"]`, 60000)
+ .setEditorValue(localContent)
+ done()
+ }).perform((done) => {
+ const i = 6
+ const localContent = fillContent(content, i)
+ contents[i] = localContent
+ const name = 'test_' + i + '.sol'
+ browser.click('[data-id="fileExplorerNewFilecreateNewFile"]')
+ .waitForElementContainsText('*[data-id$="/blank"]', '', 60000)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', name)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', browser.Keys.ENTER)
+ .getText('.remix_ui_terminal_block', (result) => {
+ console.log(result)
+ })
+ .waitForElementVisible(`li[data-id="treeViewLitreeViewItem${name}"]`, 60000)
+ .setEditorValue(localContent)
+ done()
+ }).perform((done) => {
+ const i = 7
+ const localContent = fillContent(content, i)
+ contents[i] = localContent
+ const name = 'test_' + i + '.sol'
+ browser.click('[data-id="fileExplorerNewFilecreateNewFile"]')
+ .waitForElementContainsText('*[data-id$="/blank"]', '', 60000)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', name)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', browser.Keys.ENTER)
+ .getText('.remix_ui_terminal_block', (result) => {
+ console.log(result)
+ })
+ .waitForElementVisible(`li[data-id="treeViewLitreeViewItem${name}"]`, 60000)
+ .setEditorValue(localContent)
+ done()
+ }).perform((done) => {
+ const i = 8
+ const localContent = fillContent(content, i)
+ contents[i] = localContent
+ const name = 'test_' + i + '.sol'
+ browser.click('[data-id="fileExplorerNewFilecreateNewFile"]')
+ .waitForElementContainsText('*[data-id$="/blank"]', '', 60000)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', name)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', browser.Keys.ENTER)
+ .getText('.remix_ui_terminal_block', (result) => {
+ console.log(result)
+ })
+ .waitForElementVisible(`li[data-id="treeViewLitreeViewItem${name}"]`, 60000)
+ .setEditorValue(localContent)
+ done()
+ }).perform((done) => {
+ const i = 9
+ const localContent = fillContent(content, i)
+ contents[i] = localContent
+ const name = 'test_' + i + '.sol'
+ browser.click('[data-id="fileExplorerNewFilecreateNewFile"]')
+ .waitForElementContainsText('*[data-id$="/blank"]', '', 60000)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', name)
+ .sendKeys('*[data-id$="/blank"] .remixui_items', browser.Keys.ENTER)
+ .getText('.remix_ui_terminal_block', (result) => {
+ console.log(result)
+ })
+ .waitForElementVisible(`li[data-id="treeViewLitreeViewItem${name}"]`, 60000)
+ .setEditorValue(localContent)
+ done()
+ })
+ .pause(10000)
+ .refresh()
+ .perform(done => checkContent(0, done))
+ .perform(done => checkContent(1, done))
+ .perform(done => checkContent(2, done))
+ .perform(done => checkContent(3, done))
+ .perform(done => checkContent(4, done))
+ .perform(done => checkContent(5, done))
+ .perform(done => checkContent(6, done))
+ .perform(done => checkContent(7, done))
+ .perform(done => checkContent(8, done))
+ .perform(done => checkContent(9, done))
+ .end()
+ }
+}
+
+const content = `
+// SPDX-License-Identifier: GPL-3.0
+
+pragma solidity >=0.7.0 <0.9.0;
+
+/**
+ * @title Ballot
+ * @dev Implements voting process along with vote delegation|
+ */
+contract Ballot {
+
+ struct Voter {
+ uint weight; // weight is accumulated by delegation
+ bool voted; // if true, that person already voted
+ address delegate; // person delegated to
+ uint vote; // index of the voted proposal
+ }
+
+ struct Proposal {
+ // If you can limit the length to a certain number of bytes,
+ // always use one of bytes1 to bytes32 because they are much cheaper
+ bytes32 name; // short name (up to 32 bytes)
+ uint voteCount; // number of accumulated votes
+ }
+
+ address public chairperson;
+
+ mapping(address => Voter) public voters;
+
+ Proposal[] public proposals;
+
+function () test {
+
+ /**
+ * @dev Create a new ballot to choose one of 'proposalNames'.
+ * @param proposalNames names of proposals
+ */
+ constructor(bytes32[] memory proposalNames) {
+ chairperson = msg.sender;
+ voters[chairperson].weight = 1;
+
+ for (uint i = 0; i < proposalNames.length; i++) {
+ // 'Proposal({...})' creates a temporary
+ // Proposal object and 'proposals.push(...)'
+ // appends it to the end of 'proposals'.
+ proposals.push(Proposal({
+ name: proposalNames[i],
+ voteCount: 0
+ }));
+ }
+ }
+
+ /**
+ * @dev Give 'voter' the right to vote on this ballot. May only be called by 'chairperson'.
+ * @param voter address of voter
+ */
+ function giveRightToVote(address voter) public {
+ require(
+ msg.sender == chairperson,
+ "Only chairperson can give right to vote."
+ );
+ require(
+ !voters[voter].voted,
+ "The voter already voted."
+ );
+ require(voters[voter].weight == 0);
+ voters[voter].weight = 1;
+ }
+
+ /**
+ * @dev Delegate your vote to the voter 'to'.
+ * @param to address to which vote is delegated
+ */
+ function delegate(address to) public {
+ Voter storage sender = voters[msg.sender];
+ require(!sender.voted, "You already voted.");
+ require(to != msg.sender, "Self-delegation is disallowed.");
+
+ while (voters[to].delegate != address(0)) {
+ to = voters[to].delegate;
+
+ // We found a loop in the delegation, not allowed.
+ require(to != msg.sender, "Found loop in delegation.");
+ }
+ sender.voted = true;
+ sender.delegate = to;
+ Voter storage delegate_ = voters[to];
+ if (delegate_.voted) {
+ // If the delegate already voted,
+ // directly add to the number of votes
+ proposals[delegate_.vote].voteCount += sender.weight;
+ } else {
+ // If the delegate did not vote yet,
+ // add to her weight.
+ delegate_.weight += sender.weight;
+ }
+ }
+
+ /**
+ * @dev Give your vote (including votes delegated to you) to proposal 'proposals[proposal].name'.
+ * @param proposal index of proposal in the proposals array
+ */
+ function vote(uint proposal) public {
+ Voter storage sender = voters[msg.sender];
+ require(sender.weight != 0, "Has no right to vote");
+ require(!sender.voted, "Already voted.");
+ sender.voted = true;
+ sender.vote = proposal;
+
+ // If 'proposal' is out of the range of the array,
+ // this will throw automatically and revert all
+ // changes.
+ proposals[proposal].voteCount += sender.weight;
+ }
+
+ /**
+ * @dev Computes the winning proposal taking all previous votes into account.
+ * @return winningProposal_ index of winning proposal in the proposals array
+ */
+ function winningProposal() public view
+ returns (uint winningProposal_)
+ {
+ uint winningVoteCount = 0;
+ for (uint p = 0; p < proposals.length; p++) {
+ if (proposals[p].voteCount > winningVoteCount) {
+ winningVoteCount = proposals[p].voteCount;
+ winningProposal_ = p;
+ }
+ }
+ }
+
+ /**
+ * @dev Calls winningProposal() function to get the index of the winner contained in the proposals array and then
+ * @return winnerName_ the name of the winner
+ */
+ function winnerName() public view
+ returns (bytes32 winnerName_)
+ {
+ winnerName_ = proposals[winningProposal()].name;
+ }
+}
+
+`
diff --git a/apps/remix-ide-e2e/src/tests/url.spec.ts b/apps/remix-ide-e2e/src/tests/url.test.ts
similarity index 96%
rename from apps/remix-ide-e2e/src/tests/url.spec.ts
rename to apps/remix-ide-e2e/src/tests/url.test.ts
index 56a94e34a9..e6233ae2e7 100644
--- a/apps/remix-ide-e2e/src/tests/url.spec.ts
+++ b/apps/remix-ide-e2e/src/tests/url.test.ts
@@ -31,7 +31,7 @@ module.exports = {
.assert.containsText('*[data-id="compilerContainerCompileBtn"]', 'contract-76747f6e19.sol')
.currentWorkspaceIs('code-sample')
.getEditorValue((content) => {
- browser.assert.ok(content.indexOf(
+ browser.assert.ok(content && content.indexOf(
'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol') !== -1,
'code has not been loaded')
})
@@ -45,7 +45,7 @@ module.exports = {
.pause(5000)
.currentWorkspaceIs('code-sample')
.getEditorValue((content) => {
- browser.assert.ok(content.indexOf(
+ browser.assert.ok(content && content.indexOf(
'proposals.length = _numProposals;') !== -1,
'url has not been loaded')
})
@@ -59,7 +59,7 @@ module.exports = {
.pause(5000)
.currentWorkspaceIs('code-sample')
.getEditorValue((content) => {
- browser.assert.ok(content.indexOf(
+ browser.assert.ok(content && content.indexOf(
'proposals.length = _numProposals;') !== -1,
'code has not been loaded')
})
@@ -108,7 +108,7 @@ module.exports = {
'Should load json files from link passed in remix URL': function (browser: NightwatchBrowser) {
browser
- .url('http://localhost:8080/#optimize=false&runs=200&evmVersion=null&version=soljson-v0.6.12+commit.27d51765.js&url=https://raw.githubusercontent.com/EthVM/evm-source-verification/main/contracts/1/0x011e5846975c6463a8c6337eecf3cbf64e328884/input.json')
+ .url('http://127.0.0.1:8080/#optimize=false&runs=200&evmVersion=null&version=soljson-v0.6.12+commit.27d51765.js&url=https://raw.githubusercontent.com/EthVM/evm-source-verification/main/contracts/1/0x011e5846975c6463a8c6337eecf3cbf64e328884/input.json')
.refresh()
.pause(5000)
.waitForElementPresent('*[data-id="workspacesSelect"] option[value="code-sample"]')
diff --git a/apps/remix-ide/ci/browser_test.sh b/apps/remix-ide/ci/browser_test.sh
index 00a4158c86..f9385198b5 100755
--- a/apps/remix-ide/ci/browser_test.sh
+++ b/apps/remix-ide/ci/browser_test.sh
@@ -15,7 +15,7 @@ sleep 5
npm run build:e2e
-TESTFILES=$(grep -IRiL "disabled" "dist/apps/remix-ide-e2e/src/tests" | grep "\.spec\|\.test" | sort | circleci tests split )
+TESTFILES=$(grep -IRiL "\'@disabled\': \?true" "dist/apps/remix-ide-e2e/src/tests" | grep "\.spec\|\.test" | sort | circleci tests split )
for TESTFILE in $TESTFILES; do
npx nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js $TESTFILE --env=$1 || TEST_EXITCODE=1
done
diff --git a/apps/remix-ide/ci/browser_tests_plugin_api.sh b/apps/remix-ide/ci/browser_tests_plugin_api.sh
index 282b979c98..ab94f74a31 100755
--- a/apps/remix-ide/ci/browser_tests_plugin_api.sh
+++ b/apps/remix-ide/ci/browser_tests_plugin_api.sh
@@ -14,7 +14,7 @@ sleep 5
npm run build:e2e
-TESTFILES=$(grep -IRiL "disabled" "dist/apps/remix-ide-e2e/src/tests" | grep "plugin_api" | sort | circleci tests split )
+TESTFILES=$(grep -IRiL "\'@disabled\': \?true" "dist/apps/remix-ide-e2e/src/tests" | grep "plugin_api" | sort | circleci tests split )
for TESTFILE in $TESTFILES; do
npx nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js $TESTFILE --env=chrome || TEST_EXITCODE=1
done
diff --git a/libs/remix-ui/vertical-icons-panel/src/lib/components/Icon.tsx b/libs/remix-ui/vertical-icons-panel/src/lib/components/Icon.tsx
index a0aa750e73..95764db278 100644
--- a/libs/remix-ui/vertical-icons-panel/src/lib/components/Icon.tsx
+++ b/libs/remix-ui/vertical-icons-panel/src/lib/components/Icon.tsx
@@ -100,7 +100,7 @@ const Icon = ({
id={`verticalIconsKind${name}`}
ref={iconRef}
>
-
+
diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts
index 64079f315b..14ce0ec355 100644
--- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts
+++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts
@@ -85,30 +85,35 @@ export const loadWorkspacePreset = async (template: 'gist-template' | 'code-temp
case 'code-template':
// creates a new workspace code-sample and loads code from url params.
try {
- let path = ''; let content = ''
+ let path = ''; let content
if (params.code) {
const hash = bufferToHex(keccakFromString(params.code))
path = 'contract-' + hash.replace('0x', '').substring(0, 10) + '.sol'
content = atob(params.code)
- workspaceProvider.set(path, content)
+ await workspaceProvider.set(path, content)
}
if (params.url) {
const data = await plugin.call('contentImport', 'resolve', params.url)
path = data.cleanUrl
content = data.content
- if (content && typeof content === 'object') {
- const standardInput = content as JSONStandardInput
- if (standardInput.language && standardInput.language === "Solidity" && standardInput.sources) {
+
+ try {
+ content = JSON.parse(content) as any
+ if (content.language && content.language === "Solidity" && content.sources) {
+ const standardInput: JSONStandardInput = content as JSONStandardInput
for (const [fname, source] of Object.entries(standardInput.sources)) {
await workspaceProvider.set(fname, source.content)
}
+ return Object.keys(standardInput.sources)[0]
+ } else {
+ await workspaceProvider.set(path, JSON.stringify(content))
}
- return Object.keys(standardInput.sources)[0]
- } else {
- workspaceProvider.set(path, content)
+ } catch (e) {
+ console.log(e)
+ await workspaceProvider.set(path, content)
}
}
return path
diff --git a/package.json b/package.json
index 8672f3fc26..506f4e4b94 100644
--- a/package.json
+++ b/package.json
@@ -96,7 +96,7 @@
"nightwatch_local_verticalIconscontextmenu": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/verticalIconsPanel.test.js --env=chrome",
"nightwatch_local_pluginApi": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/plugin_api_*.js --env=chrome",
"nightwatch_local_migrate_filesystem": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/migrateFileSystem.test.js --env=chrome",
- "nightwatch_local_stress_editor": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/stress.editor.js --env=chromeDesktop",
+ "nightwatch_local_stress_editor": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/stressEditor.test.js --env=chromeDesktop",
"nightwatch_local_search": "npm run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/search.test.js --env=chromeDesktop",
"onchange": "onchange apps/remix-ide/build/app.js -- npm-run-all lint",
"remixd": "nx build remixd && chmod +x dist/libs/remixd/src/bin/remixd.js && dist/libs/remixd/src/bin/remixd.js -s ./apps/remix-ide/contracts --remix-ide http://127.0.0.1:8080",