diff --git a/test-browser/commands/getAddressAtPositionInRunModule.js b/test-browser/commands/getAddressAtPosition.js similarity index 83% rename from test-browser/commands/getAddressAtPositionInRunModule.js rename to test-browser/commands/getAddressAtPosition.js index 8a142cabd4..43b7689ce1 100644 --- a/test-browser/commands/getAddressAtPositionInRunModule.js +++ b/test-browser/commands/getAddressAtPosition.js @@ -1,11 +1,11 @@ const EventEmitter = require('events') -class GetAddressAtPositionInRunModule extends EventEmitter { +class GetAddressAtPosition extends EventEmitter { command (index, cb) { this.api.perform((done) => { getAddressAtPosition(this.api, index, (pos) => { - cb(pos) done() + cb(pos) this.emit('complete') }) }) @@ -22,4 +22,4 @@ function getAddressAtPosition (browser, index, callback) { }) } -module.exports = GetAddressAtPositionInRunModule +module.exports = GetAddressAtPosition diff --git a/test-browser/commands/gotoVmTraceStep.js b/test-browser/commands/goToVMTraceStep.js similarity index 100% rename from test-browser/commands/gotoVmTraceStep.js rename to test-browser/commands/goToVMTraceStep.js diff --git a/test-browser/commands/removeFile.js b/test-browser/commands/removeFile.js index 2a88e3aa54..c2ebb3b873 100644 --- a/test-browser/commands/removeFile.js +++ b/test-browser/commands/removeFile.js @@ -13,7 +13,7 @@ class RemoveFile extends EventEmitter { } function removeFile (browser, path, done) { - browser.execute(function (path, value) { + browser.execute(function (path) { function contextMenuClick (element) { var evt = element.ownerDocument.createEvent('MouseEvents') var RIGHT_CLICK_BUTTON_CODE = 2 // the same for FF and IE @@ -31,8 +31,10 @@ function removeFile (browser, path, done) { contextMenuClick(document.querySelector('[data-path="' + path + '"]')) }, [path], function (result) { browser + .waitForElementVisible('#menuitemdelete', 2000) .click('#menuitemdelete') .pause(500) + .waitForElementVisible('#modal-footer-ok', 2000) .click('#modal-footer-ok') .waitForElementNotPresent('[data-path="' + path + '"]') .perform(() => { diff --git a/test-browser/commands/renameFile.js b/test-browser/commands/renameFile.js index 7e4600973b..13b689cd51 100644 --- a/test-browser/commands/renameFile.js +++ b/test-browser/commands/renameFile.js @@ -40,7 +40,7 @@ function renameFile (browser, path, newFileName, renamedPath, done) { }) }) .click('body') // blur - .pause(500) + .waitForElementVisible('#modal-footer-ok', 2000) .click('#modal-footer-ok') .waitForElementNotPresent('[data-path="' + path + '"]') .waitForElementPresent('[data-path="' + renamedPath + '"]') diff --git a/test-browser/commands/signMessage.js b/test-browser/commands/signMessage.js index 8d886192ff..ecee06e896 100644 --- a/test-browser/commands/signMessage.js +++ b/test-browser/commands/signMessage.js @@ -1,9 +1,10 @@ const EventEmitter = require('events') class SelectContract extends EventEmitter { - command (msg) { + command (msg, callback) { this.api.perform((done) => { signMsg(this.api, msg, (hash, signature) => { + callback(hash, signature) done() this.emit('complete') }) diff --git a/test-browser/commands/testConstantFunction.js b/test-browser/commands/testConstantFunction.js index 1422c7c9c3..9282d9a10d 100644 --- a/test-browser/commands/testConstantFunction.js +++ b/test-browser/commands/testConstantFunction.js @@ -2,6 +2,7 @@ const EventEmitter = require('events') class TestConstantFunction extends EventEmitter { command (address, fnFullName, expectedInput, expectedOutput) { + console.log('TestConstantFunction ' + address + ' fnFullName') this.api.perform((done) => { testConstantFunction(this.api, address, fnFullName, expectedInput, expectedOutput, () => { done() diff --git a/test-browser/commands/testContract.js b/test-browser/commands/testContracts.js similarity index 83% rename from test-browser/commands/testContract.js rename to test-browser/commands/testContracts.js index cc658243a5..ce253ee95a 100644 --- a/test-browser/commands/testContract.js +++ b/test-browser/commands/testContracts.js @@ -1,6 +1,6 @@ const EventEmitter = require('events') -class TestContract extends EventEmitter { +class TestContracts extends EventEmitter { command (fileName, contractCode, compiledContractNames) { this.api.perform((done) => { testContracts(this.api, fileName, contractCode, compiledContractNames, () => { @@ -18,10 +18,10 @@ function testContracts (browser, fileName, contractCode, compiledContractNames, .clearValue('#input textarea') .addFile(fileName, contractCode) .pause(1000) - .verifyContract(compiledContractNames) + .verifyContracts(compiledContractNames) .perform(() => { callback() }) } -module.exports = TestContract +module.exports = TestContracts diff --git a/test-browser/commands/testEditorValue.js b/test-browser/commands/testEditorValue.js index 50fc10da26..331d844037 100644 --- a/test-browser/commands/testEditorValue.js +++ b/test-browser/commands/testEditorValue.js @@ -1,10 +1,9 @@ const EventEmitter = require('events') class TestEditorValue extends EventEmitter { - command (testvalue, callback) { + command (testvalue) { this.api.getEditorValue((value) => { this.api.assert.equal(testvalue, value) - callback() this.emit('complete') }) return this diff --git a/test-browser/commands/verifyContract.js b/test-browser/commands/verifyContracts.js similarity index 86% rename from test-browser/commands/verifyContract.js rename to test-browser/commands/verifyContracts.js index f3dab5a1b8..842487476a 100644 --- a/test-browser/commands/verifyContract.js +++ b/test-browser/commands/verifyContracts.js @@ -1,9 +1,9 @@ const EventEmitter = require('events') -class VerifyContract extends EventEmitter { +class VerifyContracts extends EventEmitter { command (compiledContractNames) { this.api.perform((done) => { - verifyContract(this.api, compiledContractNames, () => { + verifyContracts(this.api, compiledContractNames, () => { done() this.emit('complete') }) @@ -29,7 +29,7 @@ function getCompiledContracts (browser, callback) { }) } -function verifyContract (browser, compiledContractNames, callback) { +function verifyContracts (browser, compiledContractNames, callback) { getCompiledContracts(browser, (result) => { if (result.value) { for (var contract in compiledContractNames) { @@ -49,4 +49,4 @@ function verifyContract (browser, compiledContractNames, callback) { }) } -module.exports = VerifyContract +module.exports = VerifyContracts diff --git a/test-browser/helpers/dom.js b/test-browser/helpers/dom.js deleted file mode 100644 index e1ef02413e..0000000000 --- a/test-browser/helpers/dom.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict' - -module.exports = { - listSelectorContains: listSelectorContains -} - -function listSelectorContains (textsToFind, selector, browser, callback) { - browser.execute(function (selector) { - var items = document.querySelectorAll(selector) - var ret = [] - for (var k = 0; k < items.length; k++) { - ret.push(items[k].innerText) - } - return ret - }, [selector], function (result) { - console.log(result.value) - for (var k in textsToFind) { - console.log('testing ' + result.value[k] + ' against ' + textsToFind[k]) - browser.assert.equal(result.value[k].indexOf(textsToFind[k]) !== -1, true) - } - callback() - }) -} - diff --git a/test-browser/tests/ballot.js b/test-browser/tests/ballot.js index d59a8c1f50..4f38841bcd 100644 --- a/test-browser/tests/ballot.js +++ b/test-browser/tests/ballot.js @@ -1,5 +1,4 @@ 'use strict' -var contractHelper = require('../helpers/contracts') var examples = require('../../src/app/editor/example-contracts') var init = require('../helpers/init') var sauce = require('./sauce') @@ -25,69 +24,38 @@ function runTests (browser, testData) { browser .waitForElementVisible('#icon-panel', 10000) .clickLaunchIcon('solidity') - .perform((client, done) => { - contractHelper.testContracts(browser, 'Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot'], function () { - done() - }) - }).clickLaunchIcon('run') - .setValue('input[placeholder="uint8 _numProposals"]', '1') - .click('#runTabView button[class^="instanceButton"]') - .waitForElementPresent('.instance:nth-of-type(2)') - .click('.instance:nth-of-type(2) > div > button') - .testFunction('delegate - transact (not payable)', '0x0571a2439ea58bd349dd130afb8aff62a33af14c06de0dbc3928519bdf13ce2e', - `[vm]\nfrom:0xca3...a733c\nto:Ballot.delegate(address) 0x692...77b3a\nvalue:0 wei\ndata:0x5c1...4d2db\nlogs:0\nhash:0x057...3ce2e`, - {types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"'}, null, null) - .pause(500) - .click('span#tx0x0571a2439ea58bd349dd130afb8aff62a33af14c06de0dbc3928519bdf13ce2e button[class^="debug"]') - .pause(2000) - .clickLaunchIcon('debugger') - .click('#jumppreviousbreakpoint') - .pause(2000) - .perform(function (client, done) { - console.log('goToVMtraceStep') - contractHelper.goToVMtraceStep(browser, 59, () => { - done() - }) - }) - .pause(1000) - .perform(function (client, done) { - contractHelper.checkDebug(browser, 'soliditystate', stateCheck, () => { - done() - }) - }) - .perform(function (client, done) { - contractHelper.checkDebug(browser, 'soliditylocals', localsCheck, () => { - done() - }) - }) - .clickLaunchIcon('run') - .click('button[class^="udappClose"]') - .perform((client, done) => { - console.log('ballot.abi') - contractHelper.addFile(browser, 'ballot.abi', { content: ballotABI }, () => { - done() - }) - }) - .perform((client, done) => { - console.log('addInstance invalid checksum address 0x692a70D2e424a56D2C6C27aA97D1a86395877b3B') - contractHelper.addInstance(browser, '0x692a70D2e424a56D2C6C27aA97D1a86395877b3B', true, false, () => { - done() - }) - }) - .clickLaunchIcon('fileExplorers') - .perform((client, done) => { - console.log('addInstance 0x692a70D2e424a56D2C6C27aA97D1a86395877b3A') - contractHelper.addInstance(browser, '0x692a70D2e424a56D2C6C27aA97D1a86395877b3A', true, true, () => { - done() - }) - }) - .pause(500) - .perform((client, done) => { - console.log('delegate - transact (not payable)') - browser.waitForElementPresent('.instance:nth-of-type(2)').click('.instance:nth-of-type(2) > div > button').testFunction('delegate - transact (not payable)', '0xd3cd54e2f76f3993078ecf9e1b54a148def4520afc141a182293b3610bddf10f', - `[vm]\nfrom:0xca3...a733c\nto:Ballot.delegate(address) 0x692...77b3a\nvalue:0 wei\ndata:0x5c1...4d2db\nlogs:0\nhash:0xd3c...df10f`, - {types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"'}, null, null, () => { done() }) - }).end() + .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['Ballot']) + .clickLaunchIcon('run') + .setValue('input[placeholder="uint8 _numProposals"]', '1') + .click('#runTabView button[class^="instanceButton"]') + .waitForElementPresent('.instance:nth-of-type(2)') + .click('.instance:nth-of-type(2) > div > button') + .testFunction('delegate - transact (not payable)', '0x0571a2439ea58bd349dd130afb8aff62a33af14c06de0dbc3928519bdf13ce2e', + `[vm]\nfrom:0xca3...a733c\nto:Ballot.delegate(address) 0x692...77b3a\nvalue:0 wei\ndata:0x5c1...4d2db\nlogs:0\nhash:0x057...3ce2e`, + {types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"'}, null, null) + .pause(500) + .click('span#tx0x0571a2439ea58bd349dd130afb8aff62a33af14c06de0dbc3928519bdf13ce2e button[class^="debug"]') + .pause(2000) + .clickLaunchIcon('debugger') + .click('#jumppreviousbreakpoint') + .pause(2000) + .goToVMTraceStep(59) + .pause(1000) + .checkVariableDebug('soliditystate', stateCheck) + .checkVariableDebug('soliditylocals', localsCheck) + .clickLaunchIcon('run') + .click('button[class^="udappClose"]') + .addFile('ballot.abi', { content: ballotABI }) + .addAtAddressInstance('0x692a70D2e424a56D2C6C27aA97D1a86395877b3B', true, false) + .clickLaunchIcon('fileExplorers') + .addAtAddressInstance('0x692a70D2e424a56D2C6C27aA97D1a86395877b3A', true, true) + .pause(500) + .waitForElementPresent('.instance:nth-of-type(2)') + .click('.instance:nth-of-type(2) > div > button') + .testFunction('delegate - transact (not payable)', '0xd3cd54e2f76f3993078ecf9e1b54a148def4520afc141a182293b3610bddf10f', + `[vm]\nfrom:0xca3...a733c\nto:Ballot.delegate(address) 0x692...77b3a\nvalue:0 wei\ndata:0x5c1...4d2db\nlogs:0\nhash:0xd3c...df10f`, + {types: 'address to', values: '"0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db"'}, null, null) + .end() } var localsCheck = { diff --git a/test-browser/tests/compiling.js b/test-browser/tests/compiling.js index 28503b8c56..eb960bd592 100644 --- a/test-browser/tests/compiling.js +++ b/test-browser/tests/compiling.js @@ -1,5 +1,4 @@ 'use strict' -var contractHelper = require('../helpers/contracts') var init = require('../helpers/init') var sauce = require('./sauce') var async = require('async') @@ -31,39 +30,36 @@ function runTests (browser) { } function testSimpleContract (browser, callback) { - contractHelper.testContracts(browser, 'Untitled.sol', sources[0]['browser/Untitled.sol'], ['TestContract'], function () { - browser.clickLaunchIcon('run') - .click('#runTabView button[class^="instanceButton"]') - .waitForElementPresent('.instance:nth-of-type(2)') - .click('.instance:nth-of-type(2) > div > button') - .click('#runTabView .instance div[class^="title"]') - .click('#runTabView .instance div[class^="title"]') - .testFunction('f - transact (not payable)', - '0xa178c603400a184ce5fedbcfab392d9b77822f6ffa7facdec693aded214523bc', - `[vm]\nfrom:0xca3...a733c\nto:TestContract.f() 0x692...77b3a\nvalue:0 wei\ndata:0x261...21ff0\nlogs:0\nhash:0xa17...523bc`, null, - `{ - "0": "uint256: 8" -}`) - .pause(500) - .perform((client, done) => { - contractHelper.useFilter(browser, '0x12332162e2e31397dc1e07ed0a1cf08f728e9b4487c6f9ed79d2f39410c92782', '', () => { - done() - }) - }) - .testFunction('g - transact (not payable)', - '0xb1532162e2e31397dc1e07ed0a1cf08f728e9b4487c6f9ed79d2f39410c92781', - `[vm]\nfrom:0xca3...a733c\nto:TestContract.g() 0x692...77b3a\nvalue:0 wei\ndata:0xe21...79b8e\nlogs:0\nhash:0xb15...92781`, null, `{ - "0": "uint256: 345", - "1": "string: comment_comment_", - "2": "bool: true", - "3": "uint256: 4" -}`).click('i[class^="clearinstance"]').perform(() => { callback(null, browser) }) - }) + browser.testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['TestContract']) + .clickLaunchIcon('run') + .click('#runTabView button[class^="instanceButton"]') + .waitForElementPresent('.instance:nth-of-type(2)') + .click('.instance:nth-of-type(2) > div > button') + .click('#runTabView .instance div[class^="title"]') + .click('#runTabView .instance div[class^="title"]') + .testFunction('f - transact (not payable)', + '0xa178c603400a184ce5fedbcfab392d9b77822f6ffa7facdec693aded214523bc', + `[vm]\nfrom:0xca3...a733c\nto:TestContract.f() 0x692...77b3a\nvalue:0 wei\ndata:0x261...21ff0\nlogs:0\nhash:0xa17...523bc`, null, + `{ + "0": "uint256: 8" + }`) + .pause(500) + .checkTerminalFilter('0x12332162e2e31397dc1e07ed0a1cf08f728e9b4487c6f9ed79d2f39410c92782', '') + .testFunction('g - transact (not payable)', + '0xb1532162e2e31397dc1e07ed0a1cf08f728e9b4487c6f9ed79d2f39410c92781', + `[vm]\nfrom:0xca3...a733c\nto:TestContract.g() 0x692...77b3a\nvalue:0 wei\ndata:0xe21...79b8e\nlogs:0\nhash:0xb15...92781`, null, `{ + "0": "uint256: 345", + "1": "string: comment_comment_", + "2": "bool: true", + "3": "uint256: 4" + }`) + .click('i[class^="clearinstance"]') + .perform(() => { callback(null, browser) }) } function testReturnValues (browser, callback) { - contractHelper.testContracts(browser, 'returnValues.sol', sources[1]['browser/returnValues.sol'], ['testReturnValues'], function () { - browser.clickLaunchIcon('run') + browser.testContracts('returnValues.sol', sources[1]['browser/returnValues.sol'], ['testReturnValues']) + .clickLaunchIcon('run') .click('#runTabView button[class^="instanceButton"]') .waitForElementPresent('.instance:nth-of-type(2)') .click('.instance:nth-of-type(2) > div > button') @@ -96,16 +92,15 @@ function testReturnValues (browser, callback) { "0": "uint8: _en 2", "1": "int256[5][]: _a1 1,-45,-78,56,60,-1,42,334,-45455,-446,1,10,-5435,45,-7" }`).click('i[class^="clearinstance"]').perform(() => { callback(null, browser) }) - }) } function testInputValues (browser, callback) { - contractHelper.testContracts(browser, 'inputValues.sol', sources[2]['browser/inputValues.sol'], ['test'], function () { - browser.clickLaunchIcon('run') + browser.testContracts('inputValues.sol', sources[2]['browser/inputValues.sol'], ['test']) + .clickLaunchIcon('run') .click('#runTabView button[class^="instanceButton"]') .waitForElementPresent('.instance:nth-of-type(2)') .click('.instance:nth-of-type(2) > div > button') - .testFunction('inputValue1 - transact (not payable)', + .testFunction('inputValue1 - transact (not payable)', '0xf3265e3d9cd9299958bf81bed3cdfdd537942f85b9e0b95c5468c691d9396505', `[vm]\nfrom:0xca3...a733c\nto:test.inputValue1(uint256,int256,string) 0x8c1...401f5\nvalue:0 wei\ndata:0xd69...00000\nlogs:0\nhash:0xf32...96505`, {types: 'uint256 _u, int256 _i, string _str', values: '"2343242", "-4324324", "string _ string _ string _ string _ string _ string _ string _ string _ string _ string _"'}, @@ -113,7 +108,9 @@ function testInputValues (browser, callback) { "0": "uint256: _uret 2343242", "1": "int256: _iret -4324324", "2": "string: _strret string _ string _ string _ string _ string _ string _ string _ string _ string _ string _" -}`).pause(500).testFunction('inputValue2 - transact (not payable)', +}`) + .pause(500) + .testFunction('inputValue2 - transact (not payable)', '0xd9ec6d8aa73d81755447190f52939ee3084e105b988d445a11e7ac718392ff5a', `[vm]\nfrom:0xca3...a733c\nto:test.inputValue2(uint256[3],bytes8[4]) 0x8c1...401f5\nvalue:0 wei\ndata:0x1b7...00000\nlogs:1\nhash:0xd9e...2ff5a`, {types: 'uint256[3] _n, bytes8[4] _b8', values: '[1,2,3], ["0x1234000000000000", "0x1234000000000000","0x1234000000000000","0x1234000000000000"]'}, @@ -146,8 +143,8 @@ function testInputValues (browser, callback) { } } ]`) - .click('i[class^="clearinstance"]').perform(() => { callback(null, browser) }) - }) + .click('i[class^="clearinstance"]') + .perform(() => { callback(null, browser) }) } // @TODO test: bytes8[3][] type as input diff --git a/test-browser/tests/generalTests.js b/test-browser/tests/generalTests.js index 8a4ab399f7..b4736ef7e7 100644 --- a/test-browser/tests/generalTests.js +++ b/test-browser/tests/generalTests.js @@ -1,5 +1,4 @@ 'use strict' -var contractHelper = require('../helpers/contracts') var init = require('../helpers/init') var sauce = require('./sauce') var async = require('async') @@ -41,155 +40,152 @@ function runTests (browser) { function testSimpleContract (browser, callback) { console.log('testSimpleContract') - contractHelper.testContracts(browser, 'Untitled.sol', sources[0]['browser/Untitled.sol'], ['test1', 'test2'], function () { + browser.testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['test1', 'test2']) + .perform(() => { callback(null, browser) }) } function testSuccessImport (browser, callback) { console.log('testSuccessImport') - contractHelper.addFile(browser, 'Untitled1.sol', sources[1]['browser/Untitled1.sol'], () => { - contractHelper.addFile(browser, 'Untitled2.sol', sources[1]['browser/Untitled2.sol'], () => { - contractHelper.switchFile(browser, 'browser/Untitled1.sol', function () { - contractHelper.verifyContract(browser, ['test6', 'test4', 'test5'], function () { + browser.addFile('Untitled1.sol', sources[1]['browser/Untitled1.sol']) + .addFile('Untitled2.sol', sources[1]['browser/Untitled2.sol']) + .switchFile('browser/Untitled1.sol') + .verifyContracts(['test6', 'test4', 'test5']) + .perform(() => { callback(null, browser) }) - }) - }) - }) } function testFailedImport (browser, callback) { console.log('testFailedImport') - contractHelper.addFile(browser, 'Untitled3.sol', sources[2]['browser/Untitled3.sol'], () => { - browser.clickLaunchIcon('solidity').assert.containsText('#compileTabView .error pre', 'Unable to import "browser/Untitled11.sol": File not found') - .perform(function () { - callback(null, browser) - }) - }) + browser.addFile('Untitled3.sol', sources[2]['browser/Untitled3.sol']) + .clickLaunchIcon('solidity') + .assert.containsText('#compileTabView .error pre', 'Unable to import "browser/Untitled11.sol": File not found') + .perform(function () { + callback(null, browser) + }) } function addDeployLibTestFile (browser, callback) { - contractHelper.addFile(browser, 'Untitled5.sol', sources[5]['browser/Untitled5.sol'], () => { - callback(null, browser) - }) + browser.addFile('Untitled5.sol', sources[5]['browser/Untitled5.sol']) + .perform(() => { + callback(null, browser) + }) } function testAutoDeployLib (browser, callback) { console.log('testAutoDeployLib') - contractHelper.verifyContract(browser, ['test'], () => { - contractHelper.selectContract(browser, 'test', () => { - contractHelper.createContract(browser, '', () => { - contractHelper.getAddressAtPosition(browser, 0, (address) => { - console.log(address) - browser.waitForElementPresent('.instance:nth-of-type(2)').click('.instance:nth-of-type(2) > div > button').perform(() => { - contractHelper.testConstantFunction(browser, address, 'get - call', '', '0: uint256: 45', () => { callback(null, browser) }) + let addressRef + browser.verifyContracts(['test']) + .selectContract('test') + .createContract('') + .getAddressAtPosition(0, (address) => { + console.log('testAutoDeployLib ' + address) + addressRef = address + }) + .waitForElementPresent('.instance:nth-of-type(2)') + .click('.instance:nth-of-type(2) > div > button') + .perform(() => { + browser + .testConstantFunction(addressRef, 'get - call', '', '0: uint256: 45') + .perform(() => { + callback(null, browser) }) }) - }) - }) - }) + } function testManualDeployLib (browser, callback) { console.log('testManualDeployLib') - browser.click('i[class^="clearinstance"]').pause(5000).clickLaunchIcon('settings').click('#generatecontractmetadata').perform(() => { - browser.clickLaunchIcon('solidity').click('#compileTabView button[title="Compile"]').perform(() => { // that should generate the JSON artefact - contractHelper.verifyContract(browser, ['test'], () => { - contractHelper.selectContract(browser, 'lib', () => { // deploy lib - contractHelper.createContract(browser, '', () => { - contractHelper.getAddressAtPosition(browser, 0, (address) => { - console.log('address:', address) - checkDeployShouldFail(browser, () => { - checkDeployShouldSucceed(browser, address, () => { - callback(null, browser) - }) - }) + browser.click('i[class^="clearinstance"]') + .pause(5000) + .clickLaunchIcon('settings') + .click('#generatecontractmetadata') + .clickLaunchIcon('solidity') + .click('#compileTabView button[title="Compile"]') // that should generate the JSON artefact + .verifyContracts(['test']) + .selectContract('lib') // deploy lib + .createContract('') + .getAddressAtPosition(0, (address) => { + console.log(address) + checkDeployShouldFail(browser, () => { + checkDeployShouldSucceed(browser, address, () => { + callback(null, browser) }) }) }) - }) - }) - }) } function checkDeployShouldFail (browser, callback) { - contractHelper.switchFile(browser, 'browser/test.json', () => { - browser.getEditorValue((content) => { - var config = JSON.parse(content) - config.deploy['VM:-'].autoDeployLib = false - browser.setEditorValue(JSON.stringify(config), () => { - contractHelper.switchFile(browser, 'browser/Untitled5.sol', () => { - contractHelper.selectContract(browser, 'test', () => { // deploy lib - contractHelper.createContract(browser, '', () => { - browser.assert.containsText('div[class^="terminal"]', '
is not a valid address').perform(() => { callback() }) - }) - }) + let config + browser.switchFile('browser/test.json') + .getEditorValue((content) => { + config = JSON.parse(content) + config.deploy['VM:-'].autoDeployLib = false }) - }) - }) - }) + .perform(() => { + browser.setEditorValue(JSON.stringify(config)) + }) + .switchFile('browser/Untitled5.sol') + .selectContract('test') // deploy lib + .createContract('') + .assert.containsText('div[class^="terminal"]', '
is not a valid address') + .perform(() => { callback() }) } function checkDeployShouldSucceed (browser, address, callback) { - contractHelper.switchFile(browser, 'browser/test.json', () => { - browser.getEditorValue((content) => { - var config = JSON.parse(content) - config.deploy['VM:-'].autoDeployLib = false - config.deploy['VM:-']['linkReferences']['browser/Untitled5.sol'].lib = address - browser.setEditorValue(JSON.stringify(config), () => { - contractHelper.switchFile(browser, 'browser/Untitled5.sol', () => { - contractHelper.selectContract(browser, 'test', () => { // deploy lib - contractHelper.createContract(browser, '', () => { - contractHelper.getAddressAtPosition(browser, 1, (address) => { - browser.waitForElementPresent('.instance:nth-of-type(3)') - .click('.instance:nth-of-type(3) > div > button').perform(() => { - contractHelper.testConstantFunction(browser, address, 'get - call', '', '0: uint256: 45', () => { callback(null, browser) }) - }) - }) - }) - }) + let addressRef + let config + browser.switchFile('browser/test.json') + .getEditorValue((content) => { + config = JSON.parse(content) + config.deploy['VM:-'].autoDeployLib = false + config.deploy['VM:-']['linkReferences']['browser/Untitled5.sol'].lib = address + }) + .perform(() => { + browser.setEditorValue(JSON.stringify(config)) + }) + .switchFile('browser/Untitled5.sol') + .selectContract('test') // deploy lib + .createContract('') + .getAddressAtPosition(1, (address) => { + addressRef = address + }) + .waitForElementPresent('.instance:nth-of-type(3)') + .click('.instance:nth-of-type(3) > div > button') + .perform(() => { + browser + .testConstantFunction(addressRef, 'get - call', '', '0: uint256: 45') + .perform(() => { callback() }) }) - }) - }) - }) } function testSignature (browser, callback) { let hash, signature - contractHelper.signMsg(browser, 'test message', (h, s) => { + browser.signMessage('test message', (h, s) => { hash = h signature = s browser.assert.ok(typeof hash.value === 'string', 'type of hash.value must be String') browser.assert.ok(typeof signature.value === 'string', 'type of signature.value must be String') - contractHelper.addFile(browser, 'signMassage.sol', sources[6]['browser/signMassage.sol'], () => { - contractHelper.switchFile(browser, 'browser/signMassage.sol', () => { - contractHelper.selectContract(browser, 'ECVerify', () => { // deploy lib - contractHelper.createContract(browser, '', () => { - const instanceSelector = '.instance:nth-of-type(4)' - browser.waitForElementPresent(instanceSelector) - .click(instanceSelector + ' > div > button') - .getAttribute(instanceSelector, 'id', (result) => { - // skip 'instance' part of e.g. 'instance0x692a70d2e424a56d2c6c27aa97d1a86395877b3a' - // const address = result.value.slice('instance'.length) - browser.clickFunction('ecrecovery - call', {types: 'bytes32 hash, bytes sig', values: `"${hash.value}","${signature.value}"`}).perform( - () => { - callback(null, browser) - /* - contractHelper.verifyCallReturnValue( - browser, - address, - ['0: address: 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c'], - () => { callback(null, browser) } - ) - */ - }) + }) + .addFile('signMassage.sol', sources[6]['browser/signMassage.sol']) + .switchFile('browser/signMassage.sol') + .selectContract('ECVerify') + .createContract('') + .waitForElementPresent('.instance:nth-of-type(4)') + .click('.instance:nth-of-type(4) > div > button') + .getAttribute('.instance:nth-of-type(4)', 'id', (result) => { + // skip 'instance' part of e.g. 'instance0x692a70d2e424a56d2c6c27aa97d1a86395877b3a' + const address = result.value.slice('instance'.length) + browser.clickFunction('ecrecovery - call', {types: 'bytes32 hash, bytes sig', values: `"${hash.value}","${signature.value}"`}) + .verifyCallReturnValue( + address, + ['0: address: 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c']) + .perform(() => { + callback(null, browser) }) - }) - }) }) - }) - }) } /* diff --git a/test-browser/tests/sharedFolderExplorer.js b/test-browser/tests/sharedFolderExplorer.js index da5df75871..d9d85b800a 100644 --- a/test-browser/tests/sharedFolderExplorer.js +++ b/test-browser/tests/sharedFolderExplorer.js @@ -1,5 +1,4 @@ 'use strict' -var contractHelper = require('../helpers/contracts') var init = require('../helpers/init') var sauce = require('./sauce') @@ -52,11 +51,6 @@ function runTests (browser, testData) { browser.end() return } - if (browserName === 'chrome') { - console.log('do not run remixd test for ' + browserName + ': TODO to reenable later') - browser.end() - return - } if (browserName === 'firefox') { console.log('do not run remixd test for ' + browserName + ': TODO to reenable later') browser.end() @@ -81,64 +75,31 @@ function runTests (browser, testData) { .click('[data-path="localhost/folder1/contract2.sol"]') .click('[data-path="localhost/folder1/contract1.sol"]') // open localhost/folder1/contract1.sol .pause(1000) - .perform(function (done) { // check the content and replace by another - browser.testEditorValue('contract test1 { function get () returns (uint) { return 10; }}', () => { - console.log('testEditorValue') - done() - }) - }) - .perform(function (done) { - browser.setEditorValue('contract test1Changed { function get () returns (uint) { return 10; }}', () => { - console.log('setEditorValue') - done() - }) - }) - .perform(function (done) { - browser.testEditorValue('contract test1Changed { function get () returns (uint) { return 10; }}', () => { - console.log('testEditorValue') - done() - }) - }) - .perform(function (done) { - browser.setEditorValue('contract test1 { function get () returns (uint) { return 10; }}', () => { - console.log('setEditorValue') - done() - }) - }) + .testEditorValue('contract test1 { function get () returns (uint) { return 10; }}') // check the content and replace by another + .setEditorValue('contract test1Changed { function get () returns (uint) { return 10; }}') + .testEditorValue('contract test1Changed { function get () returns (uint) { return 10; }}') + .setEditorValue('contract test1 { function get () returns (uint) { return 10; }}') .click('[data-path="localhost/folder1/contract_' + browserName + '.sol"]') // rename a file and check .pause(1000) - .perform(function (done) { - contractHelper.renameFile(browser, 'localhost/folder1/contract_' + browserName + '.sol', 'renamed_contract_' + browserName + '.sol', - 'localhost/folder1/renamed_contract_' + browserName + '.sol', () => { - console.log('tested file renaming') - done() - }) - }) + .renameFile('localhost/folder1/contract_' + browserName + '.sol', 'renamed_contract_' + browserName + '.sol', 'localhost/folder1/renamed_contract_' + browserName + '.sol') .pause(1000) - .perform(function (done) { // remove a file and check - contractHelper.removeFile(browser, 'localhost/folder1/contract_' + browserName + '_toremove.sol', () => { - console.log('tested file removing') - done() - }) - }) + .removeFile('localhost/folder1/contract_' + browserName + '_toremove.sol') .perform(function (done) { testImportFromRemixd(browser, () => { done() }) }) - .perform(function () { - browser.clickLaunchIcon('fileExplorers').click('[data-path="localhost"]') // collapse and expand - .waitForElementNotVisible('[data-path="localhost/folder1"]') - .click('[data-path="localhost"]') - .waitForElementVisible('[data-path="localhost/folder1"]') - .click('[data-path="localhost/folder1"]') - .waitForElementVisible('[data-path="localhost/folder1/contract1.sol"]') - .waitForElementVisible('[data-path="localhost/folder1/renamed_contract_' + browserName + '.sol"]') // check if renamed file is preset - .waitForElementNotPresent('[data-path="localhost/folder1/contract_' + browserName + '.sol"]') // check if renamed (old) file is not present - .waitForElementNotPresent('[data-path="localhost/folder1/contract_' + browserName + '_toremove.sol"]') // check if removed (old) file is not present - .click('[data-path="localhost/folder1/renamed_contract_' + browserName + '.sol"]') - .clickLaunchIcon('pluginManager') - .click('#pluginManager article[id="remixPluginManagerListItem_remixd"] button') - .end() - }) + .clickLaunchIcon('fileExplorers').click('[data-path="localhost"]') // collapse and expand + .waitForElementNotVisible('[data-path="localhost/folder1"]') + .click('[data-path="localhost"]') + .waitForElementVisible('[data-path="localhost/folder1"]') + .click('[data-path="localhost/folder1"]') + .waitForElementVisible('[data-path="localhost/folder1/contract1.sol"]') + .waitForElementVisible('[data-path="localhost/folder1/renamed_contract_' + browserName + '.sol"]') // check if renamed file is preset + .waitForElementNotPresent('[data-path="localhost/folder1/contract_' + browserName + '.sol"]') // check if renamed (old) file is not present + .waitForElementNotPresent('[data-path="localhost/folder1/contract_' + browserName + '_toremove.sol"]') // check if removed (old) file is not present + .click('[data-path="localhost/folder1/renamed_contract_' + browserName + '.sol"]') + .clickLaunchIcon('pluginManager') + .click('#pluginManager article[id="remixPluginManagerListItem_remixd"] button') + .end() } function testImportFromRemixd (browser, callback) { @@ -150,9 +111,6 @@ function testImportFromRemixd (browser, callback) { .waitForElementVisible('[data-path="localhost/src/gmbh/company.sol"]', 100000) .click('[data-path="localhost/src/gmbh/company.sol"]') .pause(1000) - .perform(() => { - contractHelper.verifyContract(browser, ['Assets', 'gmbh'], function () { - callback() - }) - }) + .verifyContracts(['Assets', 'gmbh']) + .perform(() => { callback() }) } diff --git a/test-browser/tests/staticanalysis.js b/test-browser/tests/staticanalysis.js index a870c605f9..bf9b4dba9b 100644 --- a/test-browser/tests/staticanalysis.js +++ b/test-browser/tests/staticanalysis.js @@ -1,8 +1,6 @@ 'use strict' -var contractHelper = require('../helpers/contracts') var init = require('../helpers/init') var sauce = require('./sauce') -var dom = require('../helpers/dom') var sources = [ { @@ -36,19 +34,35 @@ function runTests (browser) { browser .waitForElementVisible('#icon-panel', 10000) .clickLaunchIcon('solidity') - contractHelper.testContracts(browser, 'Untitled.sol', sources[0]['browser/Untitled.sol'], ['TooMuchGas', 'test1', 'test2'], function () { - browser - .clickLaunchIcon('solidityStaticAnalysis') - .click('#staticanalysisView button') - .waitForElementPresent('#staticanalysisresult .staticAnalysisWarning', 2000, true, function () { - dom.listSelectorContains(['browser/Untitled.sol:2:33:Use of tx.origin', - 'Fallback function of contract TooMuchGas requires too much gas', - 'TooMuchGas.() : Variables have very similar names test and test1.'], - '#staticanalysisresult .staticAnalysisWarning', - browser, function () { - browser.end() - } - ) - }) + .testContracts('Untitled.sol', sources[0]['browser/Untitled.sol'], ['TooMuchGas', 'test1', 'test2']) + .clickLaunchIcon('solidityStaticAnalysis') + .click('#staticanalysisView button') + .waitForElementPresent('#staticanalysisresult .staticAnalysisWarning', 2000, true, function () { + listSelectorContains(['browser/Untitled.sol:2:33:Use of tx.origin', + 'Fallback function of contract TooMuchGas requires too much gas', + 'TooMuchGas.() : Variables have very similar names test and test1.'], + '#staticanalysisresult .staticAnalysisWarning', + browser, function () { + browser.end() + } + ) + }) +} + +function listSelectorContains (textsToFind, selector, browser, callback) { + browser.execute(function (selector) { + var items = document.querySelectorAll(selector) + var ret = [] + for (var k = 0; k < items.length; k++) { + ret.push(items[k].innerText) + } + return ret + }, [selector], function (result) { + console.log(result.value) + for (var k in textsToFind) { + console.log('testing ' + result.value[k] + ' against ' + textsToFind[k]) + browser.assert.equal(result.value[k].indexOf(textsToFind[k]) !== -1, true) + } + callback() }) } diff --git a/test-browser/tests/units/testRecorder.js b/test-browser/tests/units/testRecorder.js index eaaebcf364..10df90bce7 100644 --- a/test-browser/tests/units/testRecorder.js +++ b/test-browser/tests/units/testRecorder.js @@ -1,5 +1,4 @@ 'use strict' -var contractHelper = require('../../helpers/contracts') module.exports = { '@disabled': true, // run by compiling.j @@ -7,8 +6,7 @@ module.exports = { return sources }, test: function (browser, callback) { - contractHelper.addFile(browser, 'scenario.json', {content: records}, () => { - browser + browser.addFile('scenario.json', {content: records}) .clickLaunchIcon('run') .click('div[class^="cardContainer"] i[class^="arrow"]') .click('#runTabView .runtransaction') @@ -20,44 +18,32 @@ module.exports = { .clickFunction('getAddress - call') .clickFunction('getFromLib - call') .waitForElementPresent('div[class^="contractActionsContainer"] div[class^="value"] ul') - .perform((client, done) => { - contractHelper.verifyCallReturnValue(browser, '0x35ef07393b57464e93deb59175ff72e6499450cf', ['0: uint256: 1', '0: uint256: 3456', '0: address: 0x35eF07393b57464e93dEB59175fF72E6499450cF'], () => { - done() - }) - }) + .verifyCallReturnValue('0x35ef07393b57464e93deb59175ff72e6499450cf', ['0: uint256: 1', '0: uint256: 3456', '0: address: 0x35eF07393b57464e93dEB59175fF72E6499450cF']) + .click('i[class^="clearinstance"]') - .perform((client, done) => { - contractHelper.testContracts(browser, 'testRecorder.sol', sources[0]['browser/testRecorder.sol'], ['testRecorder'], function () { - done() - }) - }) - .perform((client, done) => { - contractHelper.createContract(browser, '12', function () { - done() - }) - }) + .testContracts('testRecorder.sol', sources[0]['browser/testRecorder.sol'], ['testRecorder']) + .createContract('12') .waitForElementPresent('.instance:nth-of-type(2)') .click('.instance:nth-of-type(2) > div > button') - .perform((client, done) => { - browser.clickFunction('set - transact (not payable)', {types: 'uint256 _p', values: '34'}) - .click('i.savetransaction').modalFooterOKClick().getEditorValue(function (result) { - var parsed = JSON.parse(result) - browser.assert.equal(JSON.stringify(parsed.transactions[0].record.parameters), JSON.stringify(scenario.transactions[0].record.parameters)) - browser.assert.equal(JSON.stringify(parsed.transactions[0].record.name), JSON.stringify(scenario.transactions[0].record.name)) - browser.assert.equal(JSON.stringify(parsed.transactions[0].record.type), JSON.stringify(scenario.transactions[0].record.type)) - browser.assert.equal(JSON.stringify(parsed.transactions[0].record.from), JSON.stringify(scenario.transactions[0].record.from)) - browser.assert.equal(JSON.stringify(parsed.transactions[0].record.contractName), JSON.stringify(scenario.transactions[0].record.contractName)) + .clickFunction('set - transact (not payable)', {types: 'uint256 _p', values: '34'}) + .click('i.savetransaction') + .modalFooterOKClick() + .getEditorValue(function (result) { + var parsed = JSON.parse(result) + browser.assert.equal(JSON.stringify(parsed.transactions[0].record.parameters), JSON.stringify(scenario.transactions[0].record.parameters)) + browser.assert.equal(JSON.stringify(parsed.transactions[0].record.name), JSON.stringify(scenario.transactions[0].record.name)) + browser.assert.equal(JSON.stringify(parsed.transactions[0].record.type), JSON.stringify(scenario.transactions[0].record.type)) + browser.assert.equal(JSON.stringify(parsed.transactions[0].record.from), JSON.stringify(scenario.transactions[0].record.from)) + browser.assert.equal(JSON.stringify(parsed.transactions[0].record.contractName), JSON.stringify(scenario.transactions[0].record.contractName)) - browser.assert.equal(JSON.stringify(parsed.transactions[1].record.parameters), JSON.stringify(scenario.transactions[1].record.parameters)) - browser.assert.equal(JSON.stringify(parsed.transactions[1].record.name), JSON.stringify(scenario.transactions[1].record.name)) - browser.assert.equal(JSON.stringify(parsed.transactions[1].record.type), JSON.stringify(scenario.transactions[1].record.type)) - browser.assert.equal(JSON.stringify(parsed.transactions[1].record.from), JSON.stringify(scenario.transactions[1].record.from)) - done() - }) - }).perform(() => { + browser.assert.equal(JSON.stringify(parsed.transactions[1].record.parameters), JSON.stringify(scenario.transactions[1].record.parameters)) + browser.assert.equal(JSON.stringify(parsed.transactions[1].record.name), JSON.stringify(scenario.transactions[1].record.name)) + browser.assert.equal(JSON.stringify(parsed.transactions[1].record.type), JSON.stringify(scenario.transactions[1].record.type)) + browser.assert.equal(JSON.stringify(parsed.transactions[1].record.from), JSON.stringify(scenario.transactions[1].record.from)) + }) + .perform(() => { callback() }) - }) } }