forked from devongovett/qunit-cli
-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
161 lines (127 loc) · 4.85 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
(function() {
// Make sure we're in a non-browser environment
if (typeof QUnit !== 'undefined' || typeof require !== 'function') {
return;
}
var QUnit = require('qunitjs'),
colors = require('colors');
// Get user own config parameters
var optimist = require('optimist')
.describe('urlConfig', 'Add a config parameter of your own in JSON')
.string('urlConfig');
var argv = optimist.argv;
// Define normal config parameters
optimist
.describe('hidepassed', 'Show only the failing tests, hiding all that pass')
.default('hidepassed', false)
.alias('module', 'm')
.describe('module', 'Run an individual module')
.describe('requireExpects', 'Require each test to specify the number of expected assertions')
.default('requireExpects', false)
.alias('testNumber', 't')
.describe('testNumber', 'Run an individual test by number')
.describe('test', 'Run an individual test by number (deprecated)')
.describe('testTimeout', 'Global timeout in milliseconds after which all tests will fail')
.alias('quiet', 'q')
.describe('quiet', 'Hide passed tests (deprecated)')
.boolean('quiet');
// Add user own config parameters and if so, override normal ones
var consts = {};
var urlConfig = argv.urlConfig;
if (urlConfig) {
function addConfig(urlConfig) {
urlConfig = JSON.parse(urlConfig);
// Add config parameter to QUnit-cli so it can be checked
var id = urlConfig.id;
var value = urlConfig.value;
optimist.describe(id, urlConfig.tooltip || urlConfig.label);
if(value == undefined)
optimist.boolean(id);
else if(typeof value == 'string')
{
optimist.boolean(id);
consts[id] = value;
}
else if(!(value instanceof Array))
optimist.string(id);
// Add config parameter to QUnit so it can be processed
QUnit.config.urlConfig.push(urlConfig);
}
if (urlConfig instanceof Array) {
urlConfig.forEach(function(config) {
addConfig(config);
});
} else {
addConfig(urlConfig);
}
};
// Check arguments
argv = optimist.argv;
// Deprecation notices
if(argv.test != undefined)
{
console.warn('"test" parameter is deprecated, please use "testNumber" instead');
argv.testNumber = argv.testNumber || argv.test;
delete argv.test;
};
if(argv.quiet)
console.warn('"quiet" parameter is deprecated, please use "hidepassed" instead');
// QUnit configurations
delete argv.urlConfig;
// Based on qunit's test set up for node
// https://github.com/jquery/qunit/blob/c0d9ad6cfc73157b03bc9bec5b0aee875150b5aa/Gruntfile.js#L176-222
QUnit.config.autorun = false;
for(var key in argv)
QUnit.config[key] = consts[key] || argv[key];
module.exports = QUnit;
var errors = [],
printedModule = false;
function printModule(name)
{
// Separate each module with an empty line
console.log('\n');
// Only print module name if it's defined
if (name)
console.log(name.bold.blue);
}
// keep track of whether we've printed the module name yet
QUnit.moduleStart(function(details) {
if (printedModule = !argv.quiet)
printModule(details.name);
});
// when an individual assertion fails, add it to the list of errors to display
QUnit.log(function(details) {
if (!details.result)
errors.push(details);
});
// when a test ends, print success/failure and any errors
QUnit.testDone(function(details) {
// print the name of each module
if (!printedModule && details.failed)
printModule(details.module);
if (details.failed) {
console.log((' ✖ ' + details.name).red);
errors.forEach(function(error) {
if (error.message)
console.log(' ' + error.message.red);
if (typeof error.actual !== 'undefined')
console.log((' ' + error.actual + ' != ' + error.expected).red);
});
errors.length = 0;
} else if (!argv.quiet) {
console.log((' ✔ ' + details.name).green);
}
});
// when all of the tests are done, print summary
QUnit.done(function(details) {
console.log(('\nTests completed in ' + details.runtime + ' milliseconds.').grey);
var msg = details.passed + ' tests of ' + details.total + ' passed';
if (details.failed > 0)
console.log((msg + ', ' + details.failed + ' failed.').red.bold);
else
console.log((msg + '.').green.bold);
process.once('exit', function() {
process.exit(details.failed);
});
});
})();