1 | "use strict";
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | var async_1 = __importDefault(require("async"));
|
7 | var fileSystem_1 = __importDefault(require("./fileSystem"));
|
8 | var testRunner_1 = require("./testRunner");
|
9 | var colors_1 = __importDefault(require("colors"));
|
10 | var compiler_1 = require("./compiler");
|
11 | var deployer_1 = require("./deployer");
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 | function runTestFiles(filepath, isDirectory, web3, finalCallback, opts) {
|
21 | if (finalCallback === void 0) { finalCallback = function () { }; }
|
22 | opts = opts || {};
|
23 | var sourceASTs = {};
|
24 | var Signale = require('signale').Signale;
|
25 |
|
26 | var options = {
|
27 | types: {
|
28 | result: {
|
29 | badge: '\t✓',
|
30 | label: '',
|
31 | color: 'greenBright'
|
32 | },
|
33 | name: {
|
34 | badge: '\n\t◼',
|
35 | label: '',
|
36 | color: 'white'
|
37 | },
|
38 | error: {
|
39 | badge: '\t✘',
|
40 | label: '',
|
41 | color: 'redBright'
|
42 | }
|
43 | }
|
44 | };
|
45 | var signale = new Signale(options);
|
46 | var accounts = opts['accounts'] || null;
|
47 | async_1.default.waterfall([
|
48 | function getAccountList(next) {
|
49 | if (accounts)
|
50 | return next(null);
|
51 | web3.eth.getAccounts(function (_err, _accounts) {
|
52 | accounts = _accounts;
|
53 | next(null);
|
54 | });
|
55 | },
|
56 | function compile(next) {
|
57 | compiler_1.compileFileOrFiles(filepath, isDirectory, { accounts: accounts }, next);
|
58 | },
|
59 | function deployAllContracts(compilationResult, asts, next) {
|
60 |
|
61 | for (var filename in asts) {
|
62 | if (filename.endsWith('_test.sol'))
|
63 | sourceASTs[filename] = asts[filename].ast;
|
64 | }
|
65 | deployer_1.deployAll(compilationResult, web3, false, function (err, contracts) {
|
66 | if (err) {
|
67 | next(err);
|
68 | }
|
69 | next(null, compilationResult, contracts);
|
70 | });
|
71 | },
|
72 | function determineTestContractsToRun(compilationResult, contracts, next) {
|
73 | var contractsToTest = [];
|
74 | var contractsToTestDetails = [];
|
75 | var gatherContractsFrom = function (filename) {
|
76 | if (!filename.endsWith('_test.sol')) {
|
77 | return;
|
78 | }
|
79 | try {
|
80 | Object.keys(compilationResult[filename]).forEach(function (contractName) {
|
81 | contractsToTest.push(contractName);
|
82 | contractsToTestDetails.push(compilationResult[filename][contractName]);
|
83 | });
|
84 | }
|
85 | catch (e) {
|
86 | console.error(e);
|
87 | }
|
88 | };
|
89 | if (isDirectory) {
|
90 | fileSystem_1.default.walkSync(filepath, function (foundpath) {
|
91 | gatherContractsFrom(foundpath);
|
92 | });
|
93 | }
|
94 | else {
|
95 | gatherContractsFrom(filepath);
|
96 | }
|
97 | next(null, contractsToTest, contractsToTestDetails, contracts);
|
98 | },
|
99 | function runTests(contractsToTest, contractsToTestDetails, contracts, next) {
|
100 | var totalPassing = 0;
|
101 | var totalFailing = 0;
|
102 | var totalTime = 0;
|
103 | var errors = [];
|
104 | var _testCallback = function (err, result) {
|
105 | if (err)
|
106 | throw err;
|
107 | if (result.type === 'contract') {
|
108 | signale.name(result.value.white);
|
109 | }
|
110 | else if (result.type === 'testPass') {
|
111 | signale.result(result.value);
|
112 | }
|
113 | else if (result.type === 'testFailure') {
|
114 | signale.result(result.value.red);
|
115 | errors.push(result);
|
116 | }
|
117 | };
|
118 | var _resultsCallback = function (_err, result, cb) {
|
119 | totalPassing += result.passingNum;
|
120 | totalFailing += result.failureNum;
|
121 | totalTime += result.timePassed;
|
122 | cb();
|
123 | };
|
124 | async_1.default.eachOfLimit(contractsToTest, 1, function (contractName, index, cb) {
|
125 | try {
|
126 | var fileAST = sourceASTs[contracts[contractName]['filename']];
|
127 | testRunner_1.runTest(contractName, contracts[contractName], contractsToTestDetails[index], fileAST, { accounts: accounts }, _testCallback, function (err, result) {
|
128 | if (err) {
|
129 | console.log(err);
|
130 | return cb(err);
|
131 | }
|
132 | _resultsCallback(null, result, cb);
|
133 | });
|
134 | }
|
135 | catch (e) {
|
136 | console.error(e);
|
137 | }
|
138 | }, function (err) {
|
139 | if (err) {
|
140 | return next(err);
|
141 | }
|
142 | console.log('\n');
|
143 | if (totalPassing > 0) {
|
144 | console.log(colors_1.default.green(totalPassing + ' passing ') + colors_1.default.grey('(' + totalTime + 's)'));
|
145 | }
|
146 | if (totalFailing > 0) {
|
147 | console.log(colors_1.default.red(totalFailing + ' failing'));
|
148 | }
|
149 | console.log('');
|
150 | errors.forEach(function (error, index) {
|
151 | console.log(' ' + (index + 1) + ') ' + error.context + ' ' + error.value);
|
152 | console.log('');
|
153 | console.log(colors_1.default.red('\t error: ' + error.errMsg));
|
154 | });
|
155 | console.log('');
|
156 | next();
|
157 | });
|
158 | }
|
159 | ], finalCallback);
|
160 | }
|
161 | exports.runTestFiles = runTestFiles;
|
162 |
|
\ | No newline at end of file |