Skip to content

Commit 21cd7af

Browse files
committed
working version with unit tests
1 parent 18f9699 commit 21cd7af

15 files changed

+348
-47
lines changed

package.json

+5
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,10 @@
2222
"homepage": "https://github.com/coderoad/mocha-coderoad#readme",
2323
"dependencies": {
2424
"mocha": "2.4.5"
25+
},
26+
"devDependencies": {
27+
"chai": "^3.5.0",
28+
"chai-as-promised": "^5.2.0",
29+
"chai-spies": "^0.7.1"
2530
}
2631
}

src/createRunner.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,13 @@ function createRunner(config, tests) {
1111
options.env.ATOM_SHELL_INTERNAL_RUN_AS_NODE = 1;
1212
options.env.DIR = config.dir;
1313
options.env.TUTORIAL_DIR = config.tutorialDir;
14-
var node = (process.platform === 'darwin' ?
15-
path.resolve(process.resourcesPath, '..', 'Frameworks', 'Atom Helper.app', 'Contents', 'MacOS', 'Atom Helper') : process.execPath);
14+
var node = null;
15+
if (process.platform === 'darwin' && process.resourcesPath) {
16+
node = path.resolve(process.resourcesPath, '..', 'Frameworks', 'Atom Helper.app', 'Contents', 'MacOS', 'Atom Helper');
17+
}
18+
else {
19+
node = process.execPath;
20+
}
1621
return spawn(node, [
1722
'/usr/local/bin/mocha',
1823
'--bail',

src/reporter.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ function reporter(runner) {
55
var result = {
66
passes: [],
77
failures: [],
8-
failedAt: null
8+
failedAtFile: null
99
};
1010
runner.on('pass', function (test) {
1111
result.passes.push({
@@ -21,7 +21,7 @@ function reporter(runner) {
2121
timedOut: test.timedOut,
2222
duration: test.duration
2323
});
24-
result.failedAt = test.file;
24+
result.failedAtFile = test.file;
2525
});
2626
runner.on('end', function () {
2727
process.stdout.write(utils_1.signal + JSON.stringify(result, null, 2));

src/runner.js

+58-43
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,75 @@
11
"use strict";
22
var utils_1 = require('./utils');
33
var createRunner_1 = require('./createRunner');
4-
function runner(files, config, handleTestResult, handleLog) {
4+
var path = require('path');
5+
function runner(files, config, handleResult, handleLog) {
6+
files = files.map(function (subArray) {
7+
return subArray.map(function (test) {
8+
return path.join(config.tutorialDir, test);
9+
});
10+
});
511
var tests = utils_1.concatAll(files);
612
var runner = createRunner_1.createRunner(config, tests);
7-
runner.stdout.on('data', function (data) {
8-
var result = {
9-
pass: false,
10-
position: 0,
11-
failedAt: null,
12-
failure: null
13-
};
14-
var signalMatch = new RegExp(utils_1.signal);
15-
var match = signalMatch.exec(data);
16-
if (!!match) {
17-
var printed = data.toString().substring(0, match.index);
18-
if (!!printed.length) {
19-
var start = printed.substring(0, printed.length / 2);
20-
var end = printed.substring(printed.length / 2, printed.length);
21-
var message = '';
22-
if (start === end) {
23-
message = start;
13+
var result = {
14+
pass: false,
15+
taskPosition: 0,
16+
failedAtFile: null,
17+
msg: null
18+
};
19+
return new Promise(function (resolve, reject) {
20+
runner.stdout.on('data', function (data) {
21+
var signalMatch = new RegExp(utils_1.signal);
22+
var match = signalMatch.exec(data);
23+
if (!!match) {
24+
var printed = data.toString().substring(0, match.index);
25+
if (!!printed.length) {
26+
var start = printed.substring(0, printed.length / 2);
27+
var end = printed.substring(printed.length / 2, printed.length);
28+
var message = '';
29+
if (start === end) {
30+
message = start;
31+
}
32+
else {
33+
message = printed;
34+
}
35+
handleLog(message);
36+
}
37+
var testResultString = data.toString().substring(match.index + utils_1.signal.length);
38+
var testResult = JSON.parse(JSON.stringify(testResultString));
39+
if (typeof testResult === 'string') {
40+
testResult = JSON.parse(testResult);
41+
}
42+
if (testResult.failedAtFile) {
43+
result.pass = false;
44+
result.taskPosition = findFailureTestPosition(files, testResult.failedAtFile);
45+
result.msg = testResult.failures[0].msg;
46+
result.failedAtFile = testResult.failedAtFile;
2447
}
2548
else {
26-
message = printed;
49+
result.pass = true;
50+
result.taskPosition = files.length;
51+
result.msg = testResult.passes[testResult.passes.length - 1].msg;
2752
}
28-
handleLog(message);
2953
}
30-
var testResultString = data.toString().substring(match.index + 22);
31-
var testResult = JSON.parse(testResultString);
32-
if (!testResult.failed) {
33-
result.pass = false;
34-
result.failure = testResult.failures[0];
35-
result.position = findFailureTestPosition(files, testResult.failedAt);
54+
else {
55+
console.log('Result test data doesn\'t match signal string', data.toString());
56+
}
57+
handleResult(result);
58+
});
59+
runner.stderr.on('data', function (data) {
60+
console.log('test error', data.toString());
61+
});
62+
runner.on('close', function (code) {
63+
if (code === 0) {
64+
resolve(result);
3665
}
3766
else {
38-
result.pass = true;
39-
result.position = files.length;
67+
resolve(result);
4068
}
41-
}
42-
else {
43-
console.log('Error with test', data);
44-
}
45-
handleTestResult(result);
46-
});
47-
runner.stderr.on('error', function (data) {
48-
console.log('test error', data);
49-
});
50-
runner.on('close', function (code) {
51-
if (code === 1) {
52-
console.error('Error running test');
53-
}
69+
});
5470
});
5571
}
56-
Object.defineProperty(exports, "__esModule", { value: true });
57-
exports.default = runner;
72+
exports.runner = runner;
5873
function findFailureTestPosition(files, file) {
5974
for (var i = 0; i < files.length; i++) {
6075
if (files[i].indexOf(file) > -1) {

test/log.spec.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
var expect = require('chai').expect;
2+
3+
describe('log', function () {
4+
5+
describe('double log', function () {});
6+
7+
});

test/result-fail.spec.js

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
var path = require('path');
2+
var chai = require('chai');
3+
var chaiAsPromised = require("chai-as-promised");
4+
chai.use(chaiAsPromised);
5+
var expect = chai.expect;
6+
7+
var runner = require('../src/runner').runner;
8+
var rootDir = __dirname.split('/');
9+
var config = {
10+
dir: rootDir.slice(0, rootDir.length - 1).join('/'),
11+
tutorialDir: __dirname + '/tests'
12+
};
13+
var handleLog = function(log) {
14+
return log;
15+
};
16+
var handleResult = function(result) {
17+
return result;
18+
};
19+
20+
describe('result-failure', function() {
21+
22+
it('returns taskPosition 0 if first test fails', function() {
23+
var files = [
24+
['fail-01.js']
25+
];
26+
var run = runner(files, config, handleResult, handleLog);
27+
var expected = {
28+
pass: false,
29+
taskPosition: 0,
30+
failedAtFile: path.join(config.tutorialDir, 'fail-01.js'),
31+
msg: 'fail-01 should fail'
32+
};
33+
34+
return expect(run).to.eventually.deep.equal(expected);
35+
});
36+
37+
it('returns taskPosition 1 if second test fails', function() {
38+
var files = [
39+
['pass-01.js'], ['fail-01.js']
40+
];
41+
var run = runner(files, config, handleResult, handleLog);
42+
var expected = {
43+
pass: false,
44+
taskPosition: 1,
45+
failedAtFile: path.join(config.tutorialDir, 'fail-01.js'),
46+
msg: 'fail-01 should fail'
47+
};
48+
49+
return expect(run).to.eventually.deep.equal(expected);
50+
});
51+
52+
it('returns taskPosition 3 if fourth test fails', function() {
53+
var files = [
54+
['pass-01.js'], ['pass-02.js'], ['pass-03.js'], ['fail-01.js']
55+
];
56+
var run = runner(files, config, handleResult, handleLog);
57+
var expected = {
58+
pass: false,
59+
taskPosition: 3,
60+
failedAtFile: path.join(config.tutorialDir, 'fail-01.js'),
61+
msg: 'fail-01 should fail'
62+
};
63+
64+
return expect(run).to.eventually.deep.equal(expected);
65+
});
66+
67+
it('returns taskPosition 0 if any of the first tests fail', function () {
68+
var files = [
69+
['pass-01.js', 'pass-02.js', 'fail-01.js']
70+
];
71+
var run = runner(files, config, handleResult, handleLog);
72+
var expected = {
73+
pass: false,
74+
taskPosition: 0,
75+
failedAtFile: path.join(config.tutorialDir, 'fail-01.js'),
76+
msg: 'fail-01 should fail'
77+
};
78+
79+
return expect(run).to.eventually.deep.equal(expected);
80+
});
81+
82+
it('returns the taskPosition at the correct point with arrays of tests', function () {
83+
var files = [
84+
['pass-01.js', 'pass-02.js'], ['pass-03.js'], ['pass-04.js', 'fail-01.js']
85+
];
86+
var run = runner(files, config, handleResult, handleLog);
87+
var expected = {
88+
pass: false,
89+
taskPosition: 2,
90+
failedAtFile: path.join(config.tutorialDir, 'fail-01.js'),
91+
msg: 'fail-01 should fail'
92+
};
93+
94+
return expect(run).to.eventually.deep.equal(expected);
95+
});
96+
97+
98+
});

test/result-pass.spec.js

+66
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
var chai = require('chai');
2+
var chaiAsPromised = require("chai-as-promised");
3+
chai.use(chaiAsPromised);
4+
var expect = chai.expect;
5+
6+
var runner = require('../src/runner').runner;
7+
var rootDir = __dirname.split('/');
8+
var config = {
9+
dir: rootDir.slice(0, rootDir.length - 1).join('/'),
10+
tutorialDir: __dirname + '/tests'
11+
};
12+
var handleLog = function(log) {
13+
return log;
14+
};
15+
var handleResult = function(result) {
16+
return result;
17+
};
18+
19+
describe('result-pass', function() {
20+
21+
it('should take one passing test and return taskPosition 1', function() {
22+
var files = [
23+
['./pass-01.js']
24+
];
25+
var run = runner(files, config, handleResult, handleLog);
26+
var expected = {
27+
pass: true,
28+
taskPosition: 1,
29+
failedAtFile: null,
30+
msg: 'pass-01 should pass'
31+
};
32+
33+
return expect(run).to.eventually.deep.equal(expected);
34+
});
35+
36+
it('should take three passing tests and return taskPosition 3', function () {
37+
var files = [
38+
['./pass-01.js'], ['./pass-02.js'], ['./pass-03.js']
39+
];
40+
var run = runner(files, config, handleResult, handleLog);
41+
var expected = {
42+
pass: true,
43+
taskPosition: 3,
44+
failedAtFile: null,
45+
msg: 'pass-03 should pass'
46+
};
47+
48+
return expect(run).to.eventually.deep.equal(expected);
49+
});
50+
51+
it('should take two arrays of two passing tests and still return taskPosition 2', function () {
52+
var files = [
53+
['./pass-01.js', './pass-02.js'], ['./pass-03.js', './pass-04.js']
54+
];
55+
var run = runner(files, config, handleResult, handleLog);
56+
var expected = {
57+
pass: true,
58+
taskPosition: 2,
59+
failedAtFile: null,
60+
msg: 'pass-04 should pass'
61+
};
62+
63+
return expect(run).to.eventually.deep.equal(expected);
64+
});
65+
66+
});

test/runner.spec.js

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
var chai = require('chai');
2+
var chaiAsPromised = require("chai-as-promised");
3+
4+
chai.use(chaiAsPromised);
5+
var expect = chai.expect;
6+
7+
var runner = require('../src/runner').runner;
8+
var rootDir = __dirname.split('/');
9+
var config = {
10+
dir: rootDir.slice(0, rootDir.length - 1).join('/'),
11+
tutorialDir: __dirname + '/tests'
12+
};
13+
var handleLog = function(log) {
14+
return log;
15+
};
16+
var handleResult = function(result) {
17+
return result;
18+
};
19+
20+
xdescribe('runner', function() {
21+
22+
it('should run to completion', function() {
23+
var files = [
24+
['pass-01.js']
25+
];
26+
var run = runner(files, config, handleResult, handleLog);
27+
expect(run).to.eventually.be.fulfilled;
28+
});
29+
30+
31+
it('should load environmental variables', function () {
32+
var files = [
33+
['env-vars.js']
34+
];
35+
var run = runner(files, config, handleResult, handleLog);
36+
expect(run).to.eventually.equal(Promise.resolve('hi'));
37+
});
38+
39+
});

test/tests/env-vars.js

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
var expect = require('chai').expect;
2+
3+
describe('pass-01', function () {
4+
5+
console.log(process.env.DIR);
6+
console.log(process.env.TUTORIAL_DIR);
7+
8+
it('should pass', function () {
9+
expect(true).to.be.true;
10+
});
11+
12+
});

0 commit comments

Comments
 (0)