parent
c0653fde5d
commit
03f1967f50
@ -0,0 +1 @@ |
|||||||
|
export {}; |
@ -0,0 +1,15 @@ |
|||||||
|
"use strict"; |
||||||
|
var __importDefault = (this && this.__importDefault) || function (mod) { |
||||||
|
return (mod && mod.__esModule) ? mod : { "default": mod }; |
||||||
|
}; |
||||||
|
Object.defineProperty(exports, "__esModule", { value: true }); |
||||||
|
var runTestFiles_1 = __importDefault(require("./runTestFiles")); |
||||||
|
var runTestSources_1 = __importDefault(require("./runTestSources")); |
||||||
|
var testRunner_1 = __importDefault(require("./testRunner")); |
||||||
|
module.exports = { |
||||||
|
runTestFiles: runTestFiles_1.default, |
||||||
|
runTestSources: runTestSources_1.default, |
||||||
|
runTest: testRunner_1.default, |
||||||
|
assertLibCode: require('../sol/tests.sol.js') |
||||||
|
}; |
||||||
|
//# sourceMappingURL=index.js.map
|
@ -0,0 +1 @@ |
|||||||
|
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,gEAAyC;AACzC,oEAA6C;AAC7C,4DAAkC;AAElC,MAAM,CAAC,OAAO,GAAG;IACf,YAAY,EAAE,sBAAY;IAC1B,cAAc,EAAE,wBAAc;IAC9B,OAAO,EAAE,oBAAO;IAChB,aAAa,EAAE,OAAO,CAAC,qBAAqB,CAAC;CAC9C,CAAA"} |
@ -0,0 +1,2 @@ |
|||||||
|
declare function runTestFiles(filepath: any, isDirectory: any, web3: any, opts: any): void; |
||||||
|
export = runTestFiles; |
@ -0,0 +1,131 @@ |
|||||||
|
"use strict"; |
||||||
|
var async = require("async"); |
||||||
|
var path = require("path"); |
||||||
|
var fs = require("./fs"); |
||||||
|
var runTest = require("./testRunner.js"); |
||||||
|
require('colors'); |
||||||
|
var Compiler = require("./compiler.js"); |
||||||
|
var Deployer = require("./deployer.js"); |
||||||
|
function runTestFiles(filepath, isDirectory, web3, opts) { |
||||||
|
opts = opts || {}; |
||||||
|
var Signale = require('signale').Signale; |
||||||
|
// signale configuration
|
||||||
|
var options = { |
||||||
|
types: { |
||||||
|
result: { |
||||||
|
badge: '\t✓', |
||||||
|
label: '', |
||||||
|
color: 'greenBright' |
||||||
|
}, |
||||||
|
name: { |
||||||
|
badge: '\n\t◼', |
||||||
|
label: '', |
||||||
|
color: 'white' |
||||||
|
}, |
||||||
|
error: { |
||||||
|
badge: '\t✘', |
||||||
|
label: '', |
||||||
|
color: 'redBright' |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
var signale = new Signale(options); |
||||||
|
var accounts = opts.accounts || null; |
||||||
|
async.waterfall([ |
||||||
|
function getAccountList(next) { |
||||||
|
if (accounts) |
||||||
|
return next(null); |
||||||
|
web3.eth.getAccounts(function (_err, _accounts) { |
||||||
|
accounts = _accounts; |
||||||
|
next(null); |
||||||
|
}); |
||||||
|
}, |
||||||
|
function compile(next) { |
||||||
|
Compiler.compileFileOrFiles(filepath, isDirectory, { accounts: accounts }, next); |
||||||
|
}, |
||||||
|
function deployAllContracts(compilationResult, next) { |
||||||
|
Deployer.deployAll(compilationResult, web3, function (err, contracts) { |
||||||
|
if (err) { |
||||||
|
next(err); |
||||||
|
} |
||||||
|
next(null, compilationResult, contracts); |
||||||
|
}); |
||||||
|
}, |
||||||
|
function determineTestContractsToRun(compilationResult, contracts, next) { |
||||||
|
var contractsToTest = []; |
||||||
|
var contractsToTestDetails = []; |
||||||
|
var gatherContractsFrom = function (filename) { |
||||||
|
if (filename.indexOf('_test.sol') < 0) { |
||||||
|
return; |
||||||
|
} |
||||||
|
Object.keys(compilationResult[path.basename(filename)]).forEach(function (contractName) { |
||||||
|
contractsToTest.push(contractName); |
||||||
|
contractsToTestDetails.push(compilationResult[path.basename(filename)][contractName]); |
||||||
|
}); |
||||||
|
}; |
||||||
|
if (isDirectory) { |
||||||
|
fs.walkSync(filepath, function (foundpath) { |
||||||
|
gatherContractsFrom(foundpath); |
||||||
|
}); |
||||||
|
} |
||||||
|
else { |
||||||
|
gatherContractsFrom(filepath); |
||||||
|
} |
||||||
|
next(null, contractsToTest, contractsToTestDetails, contracts); |
||||||
|
}, |
||||||
|
function runTests(contractsToTest, contractsToTestDetails, contracts, next) { |
||||||
|
var totalPassing = 0; |
||||||
|
var totalFailing = 0; |
||||||
|
var totalTime = 0; |
||||||
|
var errors = []; |
||||||
|
var testCallback = function (result) { |
||||||
|
if (result.type === 'contract') { |
||||||
|
signale.name(result.value.white); |
||||||
|
} |
||||||
|
else if (result.type === 'testPass') { |
||||||
|
signale.result(result.value); |
||||||
|
} |
||||||
|
else if (result.type === 'testFailure') { |
||||||
|
signale.result(result.value.red); |
||||||
|
errors.push(result); |
||||||
|
} |
||||||
|
}; |
||||||
|
var resultsCallback = function (_err, result, cb) { |
||||||
|
totalPassing += result.passingNum; |
||||||
|
totalFailing += result.failureNum; |
||||||
|
totalTime += result.timePassed; |
||||||
|
cb(); |
||||||
|
}; |
||||||
|
async.eachOfLimit(contractsToTest, 1, function (contractName, index, cb) { |
||||||
|
runTest(contractName, contracts(contractName), contractsToTestDetails[index], { accounts: accounts }, testCallback, function (err, result) { |
||||||
|
if (err) { |
||||||
|
return cb(err); |
||||||
|
} |
||||||
|
resultsCallback(null, result, cb); |
||||||
|
}); |
||||||
|
}, function (err) { |
||||||
|
if (err) { |
||||||
|
return next(err); |
||||||
|
} |
||||||
|
console.log('\n'); |
||||||
|
if (totalPassing > 0) { |
||||||
|
console.log(('%c ' + totalPassing + ' passing ') + ('%c(' + totalTime + 's)'), 'color: green', 'color: grey'); |
||||||
|
} |
||||||
|
if (totalFailing > 0) { |
||||||
|
console.log(('%c ' + totalFailing + ' failing'), 'color: red'); |
||||||
|
} |
||||||
|
console.log(''); |
||||||
|
errors.forEach(function (error, index) { |
||||||
|
console.log(' ' + (index + 1) + ') ' + error.context + ' ' + error.value); |
||||||
|
console.log(''); |
||||||
|
console.log(('%c\t error: ' + error.errMsg), 'color: red'); |
||||||
|
}); |
||||||
|
console.log(''); |
||||||
|
next(); |
||||||
|
}); |
||||||
|
} |
||||||
|
], function () { |
||||||
|
}); |
||||||
|
} |
||||||
|
module.exports = runTestFiles; |
||||||
|
//# sourceMappingURL=runTestFiles.js.map
|
@ -0,0 +1 @@ |
|||||||
|
{"version":3,"file":"runTestFiles.js","sourceRoot":"","sources":["../src/runTestFiles.ts"],"names":[],"mappings":"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"} |
@ -0,0 +1,2 @@ |
|||||||
|
declare function runTestSources(contractSources: any, testCallback: any, resultCallback: any, finalCallback: any, importFileCb: any, opts: any): void; |
||||||
|
export = runTestSources; |
@ -0,0 +1,106 @@ |
|||||||
|
"use strict"; |
||||||
|
var __importDefault = (this && this.__importDefault) || function (mod) { |
||||||
|
return (mod && mod.__esModule) ? mod : { "default": mod }; |
||||||
|
}; |
||||||
|
var async = require("async"); |
||||||
|
require('colors'); |
||||||
|
var Compiler = require("./compiler.js"); |
||||||
|
var Deployer = require("./deployer.js"); |
||||||
|
var runTest = require("./testRunner.js"); |
||||||
|
var Web3 = require("web3"); |
||||||
|
var remix_simulator_1 = __importDefault(require("remix-simulator")); |
||||||
|
var createWeb3Provider = function () { |
||||||
|
var web3 = new Web3(); |
||||||
|
web3.setProvider(new remix_simulator_1.default()); |
||||||
|
return web3; |
||||||
|
}; |
||||||
|
function runTestSources(contractSources, testCallback, resultCallback, finalCallback, importFileCb, opts) { |
||||||
|
opts = opts || {}; |
||||||
|
var web3 = opts.web3 || createWeb3Provider(); |
||||||
|
var accounts = opts.accounts || null; |
||||||
|
async.waterfall([ |
||||||
|
function getAccountList(next) { |
||||||
|
if (accounts) |
||||||
|
return next(); |
||||||
|
web3.eth.getAccounts(function (_err, _accounts) { |
||||||
|
accounts = _accounts; |
||||||
|
next(); |
||||||
|
}); |
||||||
|
}, |
||||||
|
function compile(next) { |
||||||
|
Compiler.compileContractSources(contractSources, importFileCb, next); |
||||||
|
}, |
||||||
|
function deployAllContracts(compilationResult, next) { |
||||||
|
Deployer.deployAll(compilationResult, web3, function (err, contracts) { |
||||||
|
if (err) { |
||||||
|
next(err); |
||||||
|
} |
||||||
|
next(null, compilationResult, contracts); |
||||||
|
}); |
||||||
|
}, |
||||||
|
function determineTestContractsToRun(compilationResult, contracts, next) { |
||||||
|
var contractsToTest = []; |
||||||
|
var contractsToTestDetails = []; |
||||||
|
var _loop_1 = function (filename) { |
||||||
|
if (filename.indexOf('_test.sol') < 0) { |
||||||
|
return "continue"; |
||||||
|
} |
||||||
|
Object.keys(compilationResult[filename]).forEach(function (contractName) { |
||||||
|
contractsToTestDetails.push(compilationResult[filename][contractName]); |
||||||
|
contractsToTest.push(contractName); |
||||||
|
}); |
||||||
|
}; |
||||||
|
for (var filename in compilationResult) { |
||||||
|
_loop_1(filename); |
||||||
|
} |
||||||
|
next(null, contractsToTest, contractsToTestDetails, contracts); |
||||||
|
}, |
||||||
|
function runTests(contractsToTest, contractsToTestDetails, contracts, next) { |
||||||
|
var totalPassing = 0; |
||||||
|
var totalFailing = 0; |
||||||
|
var totalTime = 0; |
||||||
|
var errors = []; |
||||||
|
var _testCallback = function (result) { |
||||||
|
if (result.type === 'testFailure') { |
||||||
|
errors.push(result); |
||||||
|
} |
||||||
|
testCallback(result); |
||||||
|
}; |
||||||
|
var _resultsCallback = function (_err, result, cb) { |
||||||
|
resultCallback(_err, result, function () { }); |
||||||
|
totalPassing += result.passingNum; |
||||||
|
totalFailing += result.failureNum; |
||||||
|
totalTime += result.timePassed; |
||||||
|
cb(); |
||||||
|
}; |
||||||
|
async.eachOfLimit(contractsToTest, 1, function (contractName, index, cb) { |
||||||
|
runTest(contractName, contracts(contractName), contractsToTestDetails[index], { accounts: accounts }, _testCallback, function (err, result) { |
||||||
|
if (err) { |
||||||
|
return cb(err); |
||||||
|
} |
||||||
|
_resultsCallback(null, result, cb); |
||||||
|
}); |
||||||
|
}, function (err) { |
||||||
|
if (err) { |
||||||
|
return next(err); |
||||||
|
} |
||||||
|
var finalResults = { |
||||||
|
totalPassing: 0, |
||||||
|
totalFailing: 0, |
||||||
|
totalTime: 0, |
||||||
|
errors: [], |
||||||
|
}; |
||||||
|
finalResults.totalPassing = totalPassing || 0; |
||||||
|
finalResults.totalFailing = totalFailing || 0; |
||||||
|
finalResults.totalTime = totalTime || 0; |
||||||
|
finalResults.errors = []; |
||||||
|
errors.forEach(function (error, _index) { |
||||||
|
finalResults.errors.push({ context: error.context, value: error.value, message: error.errMsg }); |
||||||
|
}); |
||||||
|
next(null, finalResults); |
||||||
|
}); |
||||||
|
} |
||||||
|
], finalCallback); |
||||||
|
} |
||||||
|
module.exports = runTestSources; |
||||||
|
//# sourceMappingURL=runTestSources.js.map
|
@ -0,0 +1 @@ |
|||||||
|
{"version":3,"file":"runTestSources.js","sourceRoot":"","sources":["../src/runTestSources.ts"],"names":[],"mappings":"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"} |
@ -0,0 +1,2 @@ |
|||||||
|
declare function runTest(testName: any, testObject: any, contractDetails: any, opts: any, testCallback: any, resultsCallback: any): void; |
||||||
|
export = runTest; |
File diff suppressed because one or more lines are too long
@ -1,10 +0,0 @@ |
|||||||
const runTestFiles = require('./runTestFiles.js') |
|
||||||
const runTestSources = require('./runTestSources.js') |
|
||||||
const TestRunner = require('./testRunner.js') |
|
||||||
|
|
||||||
module.exports = { |
|
||||||
runTestFiles: runTestFiles, |
|
||||||
runTestSources: runTestSources, |
|
||||||
runTest: TestRunner.runTest, |
|
||||||
assertLibCode: require('../sol/tests.sol.js') |
|
||||||
} |
|
@ -1,133 +0,0 @@ |
|||||||
const async = require('async') |
|
||||||
const path = require('path') |
|
||||||
const fs = require('./fs') |
|
||||||
const TestRunner = require('./testRunner.js') |
|
||||||
require('colors') |
|
||||||
|
|
||||||
let Compiler = require('./compiler.js') |
|
||||||
let Deployer = require('./deployer.js') |
|
||||||
|
|
||||||
const runTestFiles = function (filepath, isDirectory, web3, opts) { |
|
||||||
opts = opts || {} |
|
||||||
const { Signale } = require('signale') |
|
||||||
// signale configuration
|
|
||||||
const options = { |
|
||||||
types: { |
|
||||||
result: { |
|
||||||
badge: '\t✓', |
|
||||||
label: '', |
|
||||||
color: 'greenBright' |
|
||||||
}, |
|
||||||
name: { |
|
||||||
badge: '\n\t◼', |
|
||||||
label: '', |
|
||||||
color: 'white' |
|
||||||
}, |
|
||||||
error: { |
|
||||||
badge: '\t✘', |
|
||||||
label: '', |
|
||||||
color: 'redBright' |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
const signale = new Signale(options) |
|
||||||
let accounts = opts.accounts || null |
|
||||||
async.waterfall([ |
|
||||||
function getAccountList (next) { |
|
||||||
if (accounts) return next(null) |
|
||||||
web3.eth.getAccounts((_err, _accounts) => { |
|
||||||
accounts = _accounts |
|
||||||
next(null) |
|
||||||
}) |
|
||||||
}, |
|
||||||
function compile (next) { |
|
||||||
Compiler.compileFileOrFiles(filepath, isDirectory, { accounts }, next) |
|
||||||
}, |
|
||||||
function deployAllContracts (compilationResult, next) { |
|
||||||
Deployer.deployAll(compilationResult, web3, function (err, contracts) { |
|
||||||
if (err) { |
|
||||||
next(err) |
|
||||||
} |
|
||||||
next(null, compilationResult, contracts) |
|
||||||
}) |
|
||||||
}, |
|
||||||
function determineTestContractsToRun (compilationResult, contracts, next) { |
|
||||||
let contractsToTest = [] |
|
||||||
let contractsToTestDetails = [] |
|
||||||
const gatherContractsFrom = (filename) => { |
|
||||||
if (filename.indexOf('_test.sol') < 0) { |
|
||||||
return |
|
||||||
} |
|
||||||
Object.keys(compilationResult[path.basename(filename)]).forEach(contractName => { |
|
||||||
contractsToTest.push(contractName) |
|
||||||
contractsToTestDetails.push(compilationResult[path.basename(filename)][contractName]) |
|
||||||
}) |
|
||||||
} |
|
||||||
if (isDirectory) { |
|
||||||
fs.walkSync(filepath, foundpath => { |
|
||||||
gatherContractsFrom(foundpath) |
|
||||||
}) |
|
||||||
} else { |
|
||||||
gatherContractsFrom(filepath) |
|
||||||
} |
|
||||||
next(null, contractsToTest, contractsToTestDetails, contracts) |
|
||||||
}, |
|
||||||
function runTests (contractsToTest, contractsToTestDetails, contracts, next) { |
|
||||||
let totalPassing = 0 |
|
||||||
let totalFailing = 0 |
|
||||||
let totalTime = 0 |
|
||||||
let errors = [] |
|
||||||
|
|
||||||
var testCallback = function (result) { |
|
||||||
if (result.type === 'contract') { |
|
||||||
signale.name(result.value.white) |
|
||||||
} else if (result.type === 'testPass') { |
|
||||||
signale.result(result.value) |
|
||||||
} else if (result.type === 'testFailure') { |
|
||||||
signale.result(result.value.red) |
|
||||||
errors.push(result) |
|
||||||
} |
|
||||||
} |
|
||||||
var resultsCallback = function (_err, result, cb) { |
|
||||||
totalPassing += result.passingNum |
|
||||||
totalFailing += result.failureNum |
|
||||||
totalTime += result.timePassed |
|
||||||
cb() |
|
||||||
} |
|
||||||
|
|
||||||
async.eachOfLimit(contractsToTest, 1, (contractName, index, cb) => { |
|
||||||
TestRunner.runTest(contractName, contracts[contractName], contractsToTestDetails[index], { accounts }, testCallback, (err, result) => { |
|
||||||
if (err) { |
|
||||||
return cb(err) |
|
||||||
} |
|
||||||
resultsCallback(null, result, cb) |
|
||||||
}) |
|
||||||
}, function (err, _results) { |
|
||||||
if (err) { |
|
||||||
return next(err) |
|
||||||
} |
|
||||||
|
|
||||||
console.log('\n') |
|
||||||
if (totalPassing > 0) { |
|
||||||
console.log((' ' + totalPassing + ' passing ').green + ('(' + totalTime + 's)').grey) |
|
||||||
} |
|
||||||
if (totalFailing > 0) { |
|
||||||
console.log((' ' + totalFailing + ' failing').red) |
|
||||||
} |
|
||||||
console.log('') |
|
||||||
|
|
||||||
errors.forEach((error, index) => { |
|
||||||
console.log(' ' + (index + 1) + ') ' + error.context + ' ' + error.value) |
|
||||||
console.log('') |
|
||||||
console.log(('\t error: ' + error.errMsg).red) |
|
||||||
}) |
|
||||||
console.log('') |
|
||||||
|
|
||||||
next() |
|
||||||
}) |
|
||||||
} |
|
||||||
], function () { |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
module.exports = runTestFiles |
|
@ -1,107 +0,0 @@ |
|||||||
const async = require('async') |
|
||||||
require('colors') |
|
||||||
|
|
||||||
let Compiler = require('./compiler.js') |
|
||||||
let Deployer = require('./deployer.js') |
|
||||||
let TestRunner = require('./testRunner.js') |
|
||||||
|
|
||||||
const Web3 = require('web3') |
|
||||||
const Provider = require('remix-simulator').Provider |
|
||||||
|
|
||||||
var createWeb3Provider = function () { |
|
||||||
let web3 = new Web3() |
|
||||||
web3.setProvider(new Provider()) |
|
||||||
return web3 |
|
||||||
} |
|
||||||
|
|
||||||
const runTestSources = function (contractSources, testCallback, resultCallback, finalCallback, importFileCb, opts) { |
|
||||||
opts = opts || {} |
|
||||||
let web3 = opts.web3 || createWeb3Provider() |
|
||||||
let accounts = opts.accounts || null |
|
||||||
async.waterfall([ |
|
||||||
function getAccountList (next) { |
|
||||||
if (accounts) return next() |
|
||||||
web3.eth.getAccounts((_err, _accounts) => { |
|
||||||
accounts = _accounts |
|
||||||
next() |
|
||||||
}) |
|
||||||
}, |
|
||||||
function compile (next) { |
|
||||||
Compiler.compileContractSources(contractSources, importFileCb, next) |
|
||||||
}, |
|
||||||
function deployAllContracts (compilationResult, next) { |
|
||||||
Deployer.deployAll(compilationResult, web3, function (err, contracts) { |
|
||||||
if (err) { |
|
||||||
next(err) |
|
||||||
} |
|
||||||
|
|
||||||
next(null, compilationResult, contracts) |
|
||||||
}) |
|
||||||
}, |
|
||||||
function determineTestContractsToRun (compilationResult, contracts, next) { |
|
||||||
let contractsToTest = [] |
|
||||||
let contractsToTestDetails = [] |
|
||||||
|
|
||||||
for (let filename in compilationResult) { |
|
||||||
if (filename.indexOf('_test.sol') < 0) { |
|
||||||
continue |
|
||||||
} |
|
||||||
Object.keys(compilationResult[filename]).forEach(contractName => { |
|
||||||
contractsToTestDetails.push(compilationResult[filename][contractName]) |
|
||||||
contractsToTest.push(contractName) |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
next(null, contractsToTest, contractsToTestDetails, contracts) |
|
||||||
}, |
|
||||||
function runTests (contractsToTest, contractsToTestDetails, contracts, next) { |
|
||||||
let totalPassing = 0 |
|
||||||
let totalFailing = 0 |
|
||||||
let totalTime = 0 |
|
||||||
let errors = [] |
|
||||||
|
|
||||||
var _testCallback = function (result) { |
|
||||||
if (result.type === 'testFailure') { |
|
||||||
errors.push(result) |
|
||||||
} |
|
||||||
testCallback(result) |
|
||||||
} |
|
||||||
|
|
||||||
var _resultsCallback = function (_err, result, cb) { |
|
||||||
resultCallback(_err, result, () => {}) |
|
||||||
totalPassing += result.passingNum |
|
||||||
totalFailing += result.failureNum |
|
||||||
totalTime += result.timePassed |
|
||||||
cb() |
|
||||||
} |
|
||||||
|
|
||||||
async.eachOfLimit(contractsToTest, 1, (contractName, index, cb) => { |
|
||||||
TestRunner.runTest(contractName, contracts[contractName], contractsToTestDetails[index], { accounts }, _testCallback, (err, result) => { |
|
||||||
if (err) { |
|
||||||
return cb(err) |
|
||||||
} |
|
||||||
_resultsCallback(null, result, cb) |
|
||||||
}) |
|
||||||
}, function (err, _results) { |
|
||||||
if (err) { |
|
||||||
return next(err) |
|
||||||
} |
|
||||||
|
|
||||||
let finalResults = {} |
|
||||||
|
|
||||||
finalResults.totalPassing = totalPassing || 0 |
|
||||||
finalResults.totalFailing = totalFailing || 0 |
|
||||||
finalResults.totalTime = totalTime || 0 |
|
||||||
finalResults.errors = [] |
|
||||||
|
|
||||||
errors.forEach((error, _index) => { |
|
||||||
finalResults.errors.push({context: error.context, value: error.value, message: error.errMsg}) |
|
||||||
}) |
|
||||||
|
|
||||||
next(null, finalResults) |
|
||||||
}) |
|
||||||
} |
|
||||||
], finalCallback) |
|
||||||
} |
|
||||||
|
|
||||||
module.exports = runTestSources |
|
@ -1,149 +0,0 @@ |
|||||||
var async = require('async') |
|
||||||
var changeCase = require('change-case') |
|
||||||
var Web3 = require('web3') |
|
||||||
|
|
||||||
function getFunctionFullName (signature, methodIdentifiers) { |
|
||||||
for (var method in methodIdentifiers) { |
|
||||||
if (signature.replace('0x', '') === methodIdentifiers[method].replace('0x', '')) { |
|
||||||
return method |
|
||||||
} |
|
||||||
} |
|
||||||
return null |
|
||||||
} |
|
||||||
|
|
||||||
function getOverridedSender (userdoc, signature, methodIdentifiers) { |
|
||||||
let fullName = getFunctionFullName(signature, methodIdentifiers) |
|
||||||
let match = /sender: account-+(\d)/g |
|
||||||
let accountIndex = userdoc.methods[fullName] ? match.exec(userdoc.methods[fullName].notice) : null |
|
||||||
return fullName && accountIndex ? accountIndex[1] : null |
|
||||||
} |
|
||||||
|
|
||||||
function getAvailableFunctions (jsonInterface) { |
|
||||||
return jsonInterface.reverse().filter((x) => x.type === 'function').map((x) => x.name) |
|
||||||
} |
|
||||||
|
|
||||||
function getTestFunctions (jsonInterface) { |
|
||||||
let specialFunctions = ['beforeAll', 'beforeEach', 'afterAll', 'afterEach'] |
|
||||||
return jsonInterface.filter((x) => specialFunctions.indexOf(x.name) < 0 && x.type === 'function') |
|
||||||
} |
|
||||||
|
|
||||||
function createRunList (jsonInterface) { |
|
||||||
let availableFunctions = getAvailableFunctions(jsonInterface) |
|
||||||
let testFunctions = getTestFunctions(jsonInterface) |
|
||||||
let runList = [] |
|
||||||
|
|
||||||
if (availableFunctions.indexOf('beforeAll') >= 0) { |
|
||||||
runList.push({name: 'beforeAll', type: 'internal', constant: false}) |
|
||||||
} |
|
||||||
|
|
||||||
for (let func of testFunctions) { |
|
||||||
if (availableFunctions.indexOf('beforeEach') >= 0) { |
|
||||||
runList.push({name: 'beforeEach', type: 'internal', constant: false}) |
|
||||||
} |
|
||||||
runList.push({name: func.name, signature: func.signature, type: 'test', constant: func.constant}) |
|
||||||
if (availableFunctions.indexOf('afterEach') >= 0) { |
|
||||||
runList.push({name: 'afterEach', type: 'internal', constant: false}) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if (availableFunctions.indexOf('afterAll') >= 0) { |
|
||||||
runList.push({name: 'afterAll', type: 'internal', constant: false}) |
|
||||||
} |
|
||||||
|
|
||||||
return runList |
|
||||||
} |
|
||||||
|
|
||||||
function runTest (testName, testObject, contractDetails, opts, testCallback, resultsCallback) { |
|
||||||
let runList = createRunList(testObject._jsonInterface) |
|
||||||
|
|
||||||
let passingNum = 0 |
|
||||||
let failureNum = 0 |
|
||||||
let timePassed = 0 |
|
||||||
let web3 = new Web3() |
|
||||||
|
|
||||||
var userAgent = (typeof (navigator) !== 'undefined') && navigator.userAgent ? navigator.userAgent.toLowerCase() : '-' |
|
||||||
var isBrowser = !(typeof (window) === 'undefined' || userAgent.indexOf(' electron/') > -1) |
|
||||||
if (!isBrowser) { |
|
||||||
let signale = require('signale') |
|
||||||
signale.warn('DO NOT TRY TO ACCESS (IN YOUR SOLIDITY TEST) AN ACCOUNT GREATER THAN THE LENGTH OF THE FOLLOWING ARRAY (' + opts.accounts.length + ') :') |
|
||||||
signale.warn(opts.accounts) |
|
||||||
signale.warn('e.g: the following code won\'t work in the current context:') |
|
||||||
signale.warn('TestsAccounts.getAccount(' + opts.accounts.length + ')') |
|
||||||
} |
|
||||||
|
|
||||||
testCallback({type: 'contract', value: testName, filename: testObject.filename}) |
|
||||||
async.eachOfLimit(runList, 1, function (func, index, next) { |
|
||||||
let sender |
|
||||||
if (func.signature) { |
|
||||||
sender = getOverridedSender(contractDetails.userdoc, func.signature, contractDetails.evm.methodIdentifiers) |
|
||||||
if (opts.accounts) { |
|
||||||
sender = opts.accounts[sender] |
|
||||||
} |
|
||||||
} |
|
||||||
let sendParams |
|
||||||
if (sender) sendParams = { from: sender } |
|
||||||
|
|
||||||
let method = testObject.methods[func.name].apply(testObject.methods[func.name], []) |
|
||||||
let startTime = Date.now() |
|
||||||
if (func.constant) { |
|
||||||
method.call(sendParams).then((result) => { |
|
||||||
let time = Math.ceil((Date.now() - startTime) / 1000.0) |
|
||||||
if (result) { |
|
||||||
testCallback({type: 'testPass', value: changeCase.sentenceCase(func.name), time: time, context: testName}) |
|
||||||
passingNum += 1 |
|
||||||
timePassed += time |
|
||||||
} else { |
|
||||||
testCallback({type: 'testFailure', value: changeCase.sentenceCase(func.name), time: time, errMsg: 'function returned false', context: testName}) |
|
||||||
failureNum += 1 |
|
||||||
} |
|
||||||
next() |
|
||||||
}) |
|
||||||
} else { |
|
||||||
method.send(sendParams).on('receipt', function (receipt) { |
|
||||||
try { |
|
||||||
let time = Math.ceil((Date.now() - startTime) / 1000.0) |
|
||||||
let topic = Web3.utils.sha3('AssertionEvent(bool,string)') |
|
||||||
|
|
||||||
let testPassed = false |
|
||||||
|
|
||||||
for (let i in receipt.events) { |
|
||||||
let event = receipt.events[i] |
|
||||||
if (event.raw.topics.indexOf(topic) >= 0) { |
|
||||||
var testEvent = web3.eth.abi.decodeParameters(['bool', 'string'], event.raw.data) |
|
||||||
if (!testEvent[0]) { |
|
||||||
testCallback({type: 'testFailure', value: changeCase.sentenceCase(func.name), time: time, errMsg: testEvent[1], context: testName}) |
|
||||||
failureNum += 1 |
|
||||||
return next() |
|
||||||
} |
|
||||||
testPassed = true |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if (testPassed) { |
|
||||||
testCallback({type: 'testPass', value: changeCase.sentenceCase(func.name), time: time, context: testName}) |
|
||||||
passingNum += 1 |
|
||||||
} |
|
||||||
|
|
||||||
return next() |
|
||||||
} catch (err) { |
|
||||||
console.log('error!') |
|
||||||
console.dir(err) |
|
||||||
return next(err) |
|
||||||
} |
|
||||||
}).on('error', function (err) { |
|
||||||
console.error(err) |
|
||||||
next(err) |
|
||||||
}) |
|
||||||
} |
|
||||||
}, function (error) { |
|
||||||
resultsCallback(error, { |
|
||||||
passingNum: passingNum, |
|
||||||
failureNum: failureNum, |
|
||||||
timePassed: timePassed |
|
||||||
}) |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
module.exports = { |
|
||||||
runTest: runTest |
|
||||||
} |
|
@ -1,198 +0,0 @@ |
|||||||
const async = require('async') |
|
||||||
const Web3 = require('web3') |
|
||||||
const assert = require('assert') |
|
||||||
|
|
||||||
let Compiler = require('../src/compiler.js') |
|
||||||
let Deployer = require('../src/deployer.js') |
|
||||||
let TestRunner = require('../src/testRunner.js') |
|
||||||
const Provider = require('remix-simulator').Provider |
|
||||||
|
|
||||||
function compileAndDeploy (filename, callback) { |
|
||||||
let web3 = new Web3() |
|
||||||
web3.setProvider(new Provider()) |
|
||||||
let compilationData |
|
||||||
let accounts |
|
||||||
async.waterfall([ |
|
||||||
function getAccountList (next) { |
|
||||||
web3.eth.getAccounts((_err, _accounts) => { |
|
||||||
accounts = _accounts |
|
||||||
next(_err) |
|
||||||
}) |
|
||||||
}, |
|
||||||
function compile (next) { |
|
||||||
Compiler.compileFileOrFiles(filename, false, {accounts}, next) |
|
||||||
}, |
|
||||||
function deployAllContracts (compilationResult, next) { |
|
||||||
compilationData = compilationResult |
|
||||||
Deployer.deployAll(compilationResult, web3, next) |
|
||||||
} |
|
||||||
], function (_err, contracts) { |
|
||||||
callback(null, compilationData, contracts, accounts) |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
describe('testRunner', function () { |
|
||||||
describe('#runTest', function() { |
|
||||||
describe('test with beforeAll', function () { |
|
||||||
let filename = 'tests/examples_1/simple_storage_test.sol' |
|
||||||
let tests = [], results = {} |
|
||||||
|
|
||||||
before(function (done) { |
|
||||||
compileAndDeploy(filename, function (_err, compilationData, contracts, accounts) { |
|
||||||
var testCallback = function (test) { |
|
||||||
tests.push(test) |
|
||||||
} |
|
||||||
var resultsCallback = function (_err, _results) { |
|
||||||
results = _results |
|
||||||
done() |
|
||||||
} |
|
||||||
TestRunner.runTest('MyTest', contracts.MyTest, compilationData[filename]['MyTest'], { accounts }, testCallback, resultsCallback) |
|
||||||
}) |
|
||||||
}) |
|
||||||
|
|
||||||
it('should 1 passing test', function () { |
|
||||||
assert.equal(results.passingNum, 2) |
|
||||||
}) |
|
||||||
|
|
||||||
it('should 1 failing test', function () { |
|
||||||
assert.equal(results.failureNum, 2) |
|
||||||
}) |
|
||||||
|
|
||||||
it('should returns 5 messages', function () { |
|
||||||
assert.deepEqual(tests, [ |
|
||||||
{ type: 'contract', value: 'MyTest', filename: 'tests/examples_1/simple_storage_test.sol' }, |
|
||||||
{ type: 'testFailure', value: 'Should trigger one fail', time: 1, context: 'MyTest', errMsg: 'the test 1 fails' }, |
|
||||||
{ type: 'testPass', value: 'Should trigger one pass', time: 1, context: 'MyTest'}, |
|
||||||
{ type: 'testPass', value: 'Initial value should be100', time: 1, context: 'MyTest' }, |
|
||||||
{ type: 'testFailure', value: 'Initial value should be200', time: 1, context: 'MyTest', errMsg: 'function returned false' } |
|
||||||
]) |
|
||||||
}) |
|
||||||
}) |
|
||||||
|
|
||||||
describe('test with beforeEach', function () { |
|
||||||
let filename = 'tests/examples_2/simple_storage_test.sol' |
|
||||||
let tests = [], results = {} |
|
||||||
|
|
||||||
before(function (done) { |
|
||||||
compileAndDeploy(filename, function (_err, compilationData, contracts, accounts) { |
|
||||||
var testCallback = function (test) { |
|
||||||
tests.push(test) |
|
||||||
} |
|
||||||
var resultsCallback = function (_err, _results) { |
|
||||||
results = _results |
|
||||||
done() |
|
||||||
} |
|
||||||
TestRunner.runTest('MyTest', contracts.MyTest, compilationData[filename]['MyTest'], { accounts }, testCallback, resultsCallback) |
|
||||||
}) |
|
||||||
}) |
|
||||||
|
|
||||||
it('should 2 passing tests', function () { |
|
||||||
assert.equal(results.passingNum, 2) |
|
||||||
}) |
|
||||||
|
|
||||||
it('should 0 failing tests', function () { |
|
||||||
assert.equal(results.failureNum, 0) |
|
||||||
}) |
|
||||||
|
|
||||||
it('should returns 3 messages', function () { |
|
||||||
assert.deepEqual(tests, [ |
|
||||||
{ type: 'contract', value: 'MyTest', filename: 'tests/examples_2/simple_storage_test.sol' }, |
|
||||||
{ type: 'testPass', value: 'Initial value should be100', time: 1, context: 'MyTest' }, |
|
||||||
{ type: 'testPass', value: 'Initial value should be200', time: 1, context: 'MyTest' } |
|
||||||
]) |
|
||||||
}) |
|
||||||
}) |
|
||||||
|
|
||||||
// Test string equality
|
|
||||||
describe('test string equality', function () { |
|
||||||
let filename = 'tests/examples_3/simple_string_test.sol' |
|
||||||
let tests = [], results = {} |
|
||||||
|
|
||||||
before(function (done) { |
|
||||||
compileAndDeploy(filename, function (_err, compilationData, contracts, accounts) { |
|
||||||
var testCallback = function (test) { |
|
||||||
tests.push(test) |
|
||||||
} |
|
||||||
var resultsCallback = function (_err, _results) { |
|
||||||
results = _results |
|
||||||
done() |
|
||||||
} |
|
||||||
TestRunner.runTest('StringTest', contracts.StringTest, compilationData[filename]['StringTest'], { accounts }, testCallback, resultsCallback) |
|
||||||
TestRunner.runTest('StringTest2', contracts.StringTest2, compilationData[filename]['StringTest2'], { accounts }, testCallback, resultsCallback) |
|
||||||
}) |
|
||||||
}) |
|
||||||
|
|
||||||
it('should 2 passing tests', function () { |
|
||||||
assert.equal(results.passingNum, 2) |
|
||||||
}) |
|
||||||
|
|
||||||
it('should 1 failing tests', function () { |
|
||||||
assert.equal(results.failureNum, 1) |
|
||||||
}) |
|
||||||
|
|
||||||
it('should returns 3 messages', function () { |
|
||||||
assert.deepEqual(tests, [ |
|
||||||
{ type: 'contract', value: 'StringTest', filename: 'tests/examples_3/simple_string_test.sol' }, |
|
||||||
{ type: 'testFailure', value: 'Value should be hello world', time: 1, context: 'StringTest', "errMsg": "initial value is not correct" }, |
|
||||||
{ type: 'testPass', value: 'Value should not be hello wordl', time: 1, context: 'StringTest' }, |
|
||||||
{ type: 'testPass', value: 'Initial value should be hello', time: 1, context: 'StringTest' }, |
|
||||||
]) |
|
||||||
}) |
|
||||||
}) |
|
||||||
|
|
||||||
// Test signed/unsigned integer weight
|
|
||||||
describe('test number weight', function () { |
|
||||||
let filename = 'tests/number/number_test.sol' |
|
||||||
let tests = [], results = {} |
|
||||||
|
|
||||||
before(function (done) { |
|
||||||
compileAndDeploy(filename, function (_err, compilationData, contracts, accounts) { |
|
||||||
var testCallback = function (test) { |
|
||||||
tests.push(test) |
|
||||||
} |
|
||||||
var resultsCallback = function (_err, _results) { |
|
||||||
results = _results |
|
||||||
done() |
|
||||||
} |
|
||||||
TestRunner.runTest('IntegerTest', contracts.IntegerTest, compilationData[filename]['IntegerTest'], { accounts }, testCallback, resultsCallback) |
|
||||||
}) |
|
||||||
}) |
|
||||||
|
|
||||||
it('should have 6 passing tests', function () { |
|
||||||
assert.equal(results.passingNum, 6) |
|
||||||
}) |
|
||||||
it('should have 2 failing tests', function () { |
|
||||||
assert.equal(results.failureNum, 2) |
|
||||||
}) |
|
||||||
}) |
|
||||||
|
|
||||||
// Test Transaction with different sender
|
|
||||||
describe('various sender', function () { |
|
||||||
let filename = 'tests/various_sender/sender_test.sol' |
|
||||||
let tests = [], results = {} |
|
||||||
|
|
||||||
before(function (done) { |
|
||||||
compileAndDeploy(filename, function (_err, compilationData, contracts, accounts) { |
|
||||||
var testCallback = function (test) { |
|
||||||
tests.push(test) |
|
||||||
} |
|
||||||
var resultsCallback = function (_err, _results) { |
|
||||||
results = _results |
|
||||||
done() |
|
||||||
} |
|
||||||
|
|
||||||
TestRunner.runTest('SenderTest', contracts.SenderTest, compilationData[filename]['SenderTest'], { accounts }, testCallback, resultsCallback) |
|
||||||
|
|
||||||
}) |
|
||||||
}) |
|
||||||
|
|
||||||
it('should have 4 passing tests', function () { |
|
||||||
assert.equal(results.passingNum, 4) |
|
||||||
}) |
|
||||||
it('should have 1 failing tests', function () { |
|
||||||
assert.equal(results.failureNum, 0) |
|
||||||
}) |
|
||||||
}) |
|
||||||
}) |
|
||||||
}) |
|
@ -0,0 +1,203 @@ |
|||||||
|
import async = require('async') |
||||||
|
import Web3 = require('web3') |
||||||
|
import assert = require('assert') |
||||||
|
|
||||||
|
let Compiler = require('../src/compiler.js') |
||||||
|
let Deployer = require('../src/deployer.js') |
||||||
|
let TestRunner = require('../src/testRunner.ts') |
||||||
|
const Provider = require('remix-simulator').Provider |
||||||
|
|
||||||
|
interface Results { |
||||||
|
passingNum: number, |
||||||
|
failureNum: number, |
||||||
|
} |
||||||
|
|
||||||
|
function compileAndDeploy (filename, callback) { |
||||||
|
let web3 = new Web3() |
||||||
|
web3.setProvider(new Provider()) |
||||||
|
let compilationData |
||||||
|
let accounts |
||||||
|
async.waterfall([ |
||||||
|
function getAccountList (next) { |
||||||
|
web3.eth.getAccounts((_err, _accounts) => { |
||||||
|
accounts = _accounts |
||||||
|
next(_err) |
||||||
|
}) |
||||||
|
}, |
||||||
|
function compile (next) { |
||||||
|
Compiler.compileFileOrFiles(filename, false, {accounts}, next) |
||||||
|
}, |
||||||
|
function deployAllContracts (compilationResult, next) { |
||||||
|
compilationData = compilationResult |
||||||
|
Deployer.deployAll(compilationResult, web3, next) |
||||||
|
} |
||||||
|
], function (_err, contracts) { |
||||||
|
callback(null, compilationData, contracts, accounts) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
describe('testRunner', function () { |
||||||
|
describe('#runTest', function() { |
||||||
|
describe('test with beforeAll', function () { |
||||||
|
let filename = 'tests/examples_1/simple_storage_test.sol' |
||||||
|
let tests:any[] = [], results:Results; |
||||||
|
|
||||||
|
before(function (done) { |
||||||
|
compileAndDeploy(filename, function (_err, compilationData, contracts, accounts) { |
||||||
|
var testCallback = function (test) { |
||||||
|
tests.push(test) |
||||||
|
} |
||||||
|
var resultsCallback = function (_err, _results) { |
||||||
|
results = _results |
||||||
|
done() |
||||||
|
} |
||||||
|
TestRunner.runTest('MyTest', contracts.MyTest, compilationData[filename]['MyTest'], { accounts }, testCallback, resultsCallback) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should 1 passing test', function () { |
||||||
|
assert.equal(results.passingNum, 2) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should 1 failing test', function () { |
||||||
|
assert.equal(results.failureNum, 2) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should returns 5 messages', function () { |
||||||
|
assert.deepEqual(tests, [ |
||||||
|
{ type: 'contract', value: 'MyTest', filename: 'tests/examples_1/simple_storage_test.sol' }, |
||||||
|
{ type: 'testFailure', value: 'Should trigger one fail', time: 1, context: 'MyTest', errMsg: 'the test 1 fails' }, |
||||||
|
{ type: 'testPass', value: 'Should trigger one pass', time: 1, context: 'MyTest'}, |
||||||
|
{ type: 'testPass', value: 'Initial value should be100', time: 1, context: 'MyTest' }, |
||||||
|
{ type: 'testFailure', value: 'Initial value should be200', time: 1, context: 'MyTest', errMsg: 'function returned false' } |
||||||
|
]) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('test with beforeEach', function () { |
||||||
|
let filename = 'tests/examples_2/simple_storage_test.sol' |
||||||
|
let tests:any[] = [], results:Results; |
||||||
|
|
||||||
|
before(function (done) { |
||||||
|
compileAndDeploy(filename, function (_err, compilationData, contracts, accounts) { |
||||||
|
var testCallback = function (test) { |
||||||
|
tests.push(test) |
||||||
|
} |
||||||
|
var resultsCallback = function (_err, _results) { |
||||||
|
results = _results |
||||||
|
done() |
||||||
|
} |
||||||
|
TestRunner.runTest('MyTest', contracts.MyTest, compilationData[filename]['MyTest'], { accounts }, testCallback, resultsCallback) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should 2 passing tests', function () { |
||||||
|
assert.equal(results.passingNum, 2) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should 0 failing tests', function () { |
||||||
|
assert.equal(results.failureNum, 0) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should returns 3 messages', function () { |
||||||
|
assert.deepEqual(tests, [ |
||||||
|
{ type: 'contract', value: 'MyTest', filename: 'tests/examples_2/simple_storage_test.sol' }, |
||||||
|
{ type: 'testPass', value: 'Initial value should be100', time: 1, context: 'MyTest' }, |
||||||
|
{ type: 'testPass', value: 'Initial value should be200', time: 1, context: 'MyTest' } |
||||||
|
]) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
// Test string equality
|
||||||
|
describe('test string equality', function () { |
||||||
|
let filename = 'tests/examples_3/simple_string_test.sol' |
||||||
|
let tests:any[] = [], results:Results; |
||||||
|
|
||||||
|
before(function (done) { |
||||||
|
compileAndDeploy(filename, function (_err, compilationData, contracts, accounts) { |
||||||
|
var testCallback = function (test) { |
||||||
|
tests.push(test) |
||||||
|
} |
||||||
|
var resultsCallback = function (_err, _results) { |
||||||
|
results = _results |
||||||
|
done() |
||||||
|
} |
||||||
|
TestRunner.runTest('StringTest', contracts.StringTest, compilationData[filename]['StringTest'], { accounts }, testCallback, resultsCallback) |
||||||
|
TestRunner.runTest('StringTest2', contracts.StringTest2, compilationData[filename]['StringTest2'], { accounts }, testCallback, resultsCallback) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should 2 passing tests', function () { |
||||||
|
assert.equal(results.passingNum, 2) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should 1 failing tests', function () { |
||||||
|
assert.equal(results.failureNum, 1) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should returns 3 messages', function () { |
||||||
|
assert.deepEqual(tests, [ |
||||||
|
{ type: 'contract', value: 'StringTest', filename: 'tests/examples_3/simple_string_test.sol' }, |
||||||
|
{ type: 'testFailure', value: 'Value should be hello world', time: 1, context: 'StringTest', "errMsg": "initial value is not correct" }, |
||||||
|
{ type: 'testPass', value: 'Value should not be hello wordl', time: 1, context: 'StringTest' }, |
||||||
|
{ type: 'testPass', value: 'Initial value should be hello', time: 1, context: 'StringTest' }, |
||||||
|
]) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
// Test signed/unsigned integer weight
|
||||||
|
describe('test number weight', function () { |
||||||
|
let filename = 'tests/number/number_test.sol' |
||||||
|
let tests:any[] = [], results:Results; |
||||||
|
|
||||||
|
before(function (done) { |
||||||
|
compileAndDeploy(filename, function (_err, compilationData, contracts, accounts) { |
||||||
|
var testCallback = function (test) { |
||||||
|
tests.push(test) |
||||||
|
} |
||||||
|
var resultsCallback = function (_err, _results) { |
||||||
|
results = _results |
||||||
|
done() |
||||||
|
} |
||||||
|
TestRunner.runTest('IntegerTest', contracts.IntegerTest, compilationData[filename]['IntegerTest'], { accounts }, testCallback, resultsCallback) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should have 6 passing tests', function () { |
||||||
|
assert.equal(results.passingNum, 6) |
||||||
|
}) |
||||||
|
it('should have 2 failing tests', function () { |
||||||
|
assert.equal(results.failureNum, 2) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
// Test Transaction with different sender
|
||||||
|
describe('various sender', function () { |
||||||
|
let filename = 'tests/various_sender/sender_test.sol' |
||||||
|
let tests:any[] = [], results:Results; |
||||||
|
|
||||||
|
before(function (done) { |
||||||
|
compileAndDeploy(filename, function (_err, compilationData, contracts, accounts) { |
||||||
|
var testCallback = function (test) { |
||||||
|
tests.push(test) |
||||||
|
} |
||||||
|
var resultsCallback = function (_err, _results) { |
||||||
|
results = _results |
||||||
|
done() |
||||||
|
} |
||||||
|
|
||||||
|
TestRunner.runTest('SenderTest', contracts.SenderTest, compilationData[filename]['SenderTest'], { accounts }, testCallback, resultsCallback) |
||||||
|
|
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
it('should have 4 passing tests', function () { |
||||||
|
assert.equal(results.passingNum, 4) |
||||||
|
}) |
||||||
|
it('should have 1 failing tests', function () { |
||||||
|
assert.equal(results.failureNum, 0) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}) |
||||||
|
}) |
Loading…
Reference in new issue