Merge pull request #273 from ethereum/fixBrowserTests
use mock compiler during browser testspull/1/head
commit
373be1c7c0
@ -0,0 +1,56 @@ |
||||
var fs = require('fs'); |
||||
var solc = require('solc/wrapper'); |
||||
var soljson = require('../soljson'); |
||||
var compiler = solc(soljson); |
||||
var inputs = require('../test-browser/mockcompiler/requests.js'); |
||||
var compilationResult = gatherCompilationResults(inputs); |
||||
replaceSolCompiler(compilationResult); |
||||
|
||||
function gatherCompilationResults (sol) { |
||||
var compilationResult = {}; |
||||
for (var k in sol) { |
||||
var item = sol[k]; |
||||
var result = compile(item, 1); |
||||
compilationResult[result.key] = result; |
||||
result = compile(item, 0); |
||||
compilationResult[result.key] = result; |
||||
} |
||||
return compilationResult; |
||||
} |
||||
|
||||
function compile (source, optimization) { |
||||
var missingInputs = []; |
||||
var result = compiler.compile(source, optimization, function (path) { |
||||
missingInputs.push(path); |
||||
}); |
||||
var key = optimization.toString(); |
||||
for (var k in source.sources) { |
||||
key += k + source.sources[k]; |
||||
} |
||||
key = key.replace(/(\t)|(\n)|( )/g, ''); |
||||
return { |
||||
key: key, |
||||
source: source, |
||||
optimization: optimization, |
||||
missingInputs: missingInputs, |
||||
result: result |
||||
}; |
||||
} |
||||
|
||||
function replaceSolCompiler (results) { |
||||
fs.readFile('./test-browser/mockcompiler/compiler.js', 'utf8', function (error, data) { |
||||
if (error) { |
||||
console.log(error); |
||||
process.exit(1); |
||||
return; |
||||
} |
||||
data = data + '\n\nvar mockData = ' + JSON.stringify(results) + ';\n'; |
||||
fs.writeFile('./soljson.js', data, 'utf8', function (error) { |
||||
if (error) { |
||||
console.log(error); |
||||
process.exit(1); |
||||
return; |
||||
} |
||||
}); |
||||
}); |
||||
} |
@ -0,0 +1,23 @@ |
||||
module.exports = { |
||||
checkCompiledContracts: function (browser, compiled, callback) { |
||||
browser.execute(function () { |
||||
var contracts = document.querySelectorAll('.udapp .contract'); |
||||
var ret = []; |
||||
for (var k in contracts) { |
||||
var el = contracts[k]; |
||||
if (el.querySelector) { |
||||
ret.push({ |
||||
name: el.querySelector('.title').innerText.replace(el.querySelector('.size').innerText, '').replace(/(\t)|(\r)|(\n)/g, '') // IE/firefox add \r\n
|
||||
}); |
||||
} |
||||
} |
||||
return ret; |
||||
}, [''], function (result) { |
||||
browser.assert.equal(result.value.length, compiled.length); |
||||
result.value.map(function (item, i) { |
||||
browser.assert.equal(item.name, compiled[i]); |
||||
}); |
||||
callback(); |
||||
}); |
||||
} |
||||
}; |
@ -0,0 +1,41 @@ |
||||
var Module = { // eslint-disable-line
|
||||
cwrap: function () { return arguments[0] === 'version' ? version : compile; }, |
||||
writeStringToMemory: function () {}, |
||||
setValue: function () {}, |
||||
Pointer_stringify: function () {}, |
||||
Runtime: { |
||||
addFunction: function () {}, |
||||
removeFunction: function () {} |
||||
}, |
||||
_compileJSONMulti: {}, |
||||
_compileJSONCallback: {}, |
||||
_compileJSON: {} |
||||
}; |
||||
|
||||
function compile (source, optimization, missingInputs) { |
||||
if (typeof source === 'string') { |
||||
source = JSON.parse(source); |
||||
} |
||||
var key = optimization.toString(); |
||||
for (var k in source.sources) { |
||||
key += k + source.sources[k]; |
||||
} |
||||
key = key.replace(/(\t)|(\n)|( )/g, ''); |
||||
var data = mockData[key]; // eslint-disable-line
|
||||
if (data === undefined) { |
||||
return JSON.stringify({ |
||||
errors: ['mock compiler: source not found'] |
||||
}); |
||||
} else { |
||||
data.missingInputs.map(function (item, i) { |
||||
if (missingInputs) { |
||||
missingInputs(item); |
||||
} |
||||
}); |
||||
} |
||||
return JSON.stringify(data.result); |
||||
} |
||||
|
||||
function version () { |
||||
return 'mock compiler'; |
||||
} |
@ -0,0 +1,77 @@ |
||||
module.exports = { |
||||
'testSimpleContract': { |
||||
'sources': { |
||||
'Untitled1': 'contract test1 {} contract test2 {}' |
||||
} |
||||
}, |
||||
'ballot': { |
||||
'sources': { |
||||
'Untitled1': `pragma solidity ^0.4.0;
|
||||
contract Ballot { |
||||
|
||||
struct Voter { |
||||
uint weight; |
||||
bool voted; |
||||
uint8 vote; |
||||
address delegate; |
||||
} |
||||
struct Proposal { |
||||
uint voteCount; |
||||
} |
||||
|
||||
address chairperson; |
||||
mapping(address => Voter) voters; |
||||
Proposal[] proposals; |
||||
|
||||
/// Create a new ballot with $(_numProposals) different proposals.
|
||||
function Ballot(uint8 _numProposals) { |
||||
chairperson = msg.sender; |
||||
voters[chairperson].weight = 1; |
||||
proposals.length = _numProposals; |
||||
} |
||||
|
||||
/// Give $(voter) the right to vote on this ballot.
|
||||
/// May only be called by $(chairperson).
|
||||
function giveRightToVote(address voter) { |
||||
if (msg.sender != chairperson || voters[voter].voted) return; |
||||
voters[voter].weight = 1; |
||||
} |
||||
|
||||
/// Delegate your vote to the voter $(to).
|
||||
function delegate(address to) { |
||||
Voter sender = voters[msg.sender]; // assigns reference
|
||||
if (sender.voted) return; |
||||
while (voters[to].delegate != address(0) && voters[to].delegate != msg.sender) |
||||
to = voters[to].delegate; |
||||
if (to == msg.sender) return; |
||||
sender.voted = true; |
||||
sender.delegate = to; |
||||
Voter delegate = voters[to]; |
||||
if (delegate.voted) |
||||
proposals[delegate.vote].voteCount += sender.weight; |
||||
else |
||||
delegate.weight += sender.weight; |
||||
} |
||||
|
||||
/// Give a single vote to proposal $(proposal).
|
||||
function vote(uint8 proposal) { |
||||
Voter sender = voters[msg.sender]; |
||||
if (sender.voted || proposal >= proposals.length) return; |
||||
sender.voted = true; |
||||
sender.vote = proposal; |
||||
proposals[proposal].voteCount += sender.weight; |
||||
} |
||||
|
||||
function winningProposal() constant returns (uint8 winningProposal) { |
||||
uint256 winningVoteCount = 0; |
||||
for (uint8 proposal = 0; proposal < proposals.length; proposal++) |
||||
if (proposals[proposal].voteCount > winningVoteCount) { |
||||
winningVoteCount = proposals[proposal].voteCount; |
||||
winningProposal = proposal; |
||||
} |
||||
} |
||||
} |
||||
` |
||||
} |
||||
} |
||||
}; |
@ -0,0 +1,31 @@ |
||||
'use strict'; |
||||
var testData = require('../mockcompiler/requests'); |
||||
// var contractHelper = require('../helpers/contracts');
|
||||
|
||||
module.exports = { |
||||
'Ballot': function (browser) { |
||||
runTests(browser, testData); |
||||
} |
||||
}; |
||||
|
||||
function runTests (browser, testData) { |
||||
browser |
||||
.url('http://127.0.0.1:8080/#version=builtin') |
||||
.waitForElementVisible('.newFile', 10000); |
||||
browser.assert.notEqual(testData, null); |
||||
// TODO add Ballot tests. -> setValue('#input textarea', ... ) is not working properly with that contract.
|
||||
/* testBallot(browser, testData.ballot.sources.Untitled1, function () { |
||||
browser.end(); |
||||
});*/ |
||||
} |
||||
|
||||
/* |
||||
function testBallot (browser, contract, callback) { |
||||
browser |
||||
.click('.newFile') |
||||
.clearValue('#input textarea') |
||||
.setValue('#input textarea', contract, function () { |
||||
browser.pause('10000'); |
||||
contractHelper.checkCompiledContracts(browser, ['Ballot'], callback); |
||||
}); |
||||
}*/ |
@ -0,0 +1,28 @@ |
||||
'use strict'; |
||||
var testData = require('../mockcompiler/requests'); |
||||
var contractHelper = require('../helpers/contracts'); |
||||
|
||||
module.exports = { |
||||
'Simple Contract': function (browser) { |
||||
runTests(browser, testData); |
||||
} |
||||
}; |
||||
|
||||
function runTests (browser, testData) { |
||||
browser |
||||
.url('http://127.0.0.1:8080/#version=builtin') |
||||
.waitForElementVisible('.newFile', 10000); |
||||
browser.assert.notEqual(testData, null); |
||||
testSimpleContract(browser, testData.testSimpleContract.sources.Untitled1, function () { |
||||
browser.end(); |
||||
}); |
||||
} |
||||
|
||||
function testSimpleContract (browser, contract, callback) { |
||||
browser |
||||
.click('.newFile') |
||||
.clearValue('#input textarea') |
||||
.setValue('#input textarea', contract) |
||||
.pause('5000'); |
||||
contractHelper.checkCompiledContracts(browser, ['test1', 'test2'], callback); |
||||
} |
Loading…
Reference in new issue