Skip to content

Commit 2ac2b8a

Browse files
committed
Merge with v2
2 parents 11b5d09 + bff696d commit 2ac2b8a

9 files changed

+253
-203
lines changed

.eslintrc

+2-4
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,12 @@ rules:
2929
use-isnan: 2
3030
valid-typeof: 2
3131
no-unexpected-multiline: 2
32-
no-cond-assign: 2
3332
no-constant-condition: 2
3433
no-control-regex: 2
3534
no-debugger: 2
3635
# code style
3736
consistent-return: 0
38-
curly: 2
37+
curly: [2, "multi-line"]
3938
default-case: 2
4039
dot-notation: 2
4140
dot-location: [2, "property"]
@@ -76,7 +75,6 @@ rules:
7675
quote-props: [2, "as-needed"]
7776
quotes: [2, "single", "avoid-escape"]
7877
semi: [2, "never"]
79-
space-after-keywords: 2
78+
keyword-spacing: 2
8079
space-before-blocks: 2
8180
space-infix-ops: 2
82-
space-return-throw-case: 2

.gitignore

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1-
node_modules
1+
/node_modules/
22
.DS_Store
33
npm-debug.log
4+
build/
5+
coverage/
6+
.nyc_output/

.npmignore

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
example
2-
test
1+
npm-debug.log
32
changelog.md
3+
coverage/
4+
example/
5+
test/
46
.*

.travis.yml

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
language: node_js
22
node_js:
3+
- "stable"
34
- "5"
45
- "4"
56
- "0.12"

bin/cmd.js

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
#!/usr/bin/env node
2+
var minimist = require('minimist')
23

3-
var reporter = require('..')()
4+
var opts = minimist(process.argv.slice(2), {
5+
boolean: true,
6+
alias: {
7+
ansi: 'a',
8+
progress: 'p',
9+
},
10+
default: {
11+
ansi: true,
12+
progress: true,
13+
},
14+
})
15+
16+
var reporter = require('..')(opts)
417

518
process.stdin
619
.pipe(reporter)

index.js

+1-191
Original file line numberDiff line numberDiff line change
@@ -1,192 +1,2 @@
1-
var through = require('through2')
2-
var duplexer = require('duplexer2')
3-
var parser = require('tap-out')
4-
var symbols = require('figures')
5-
var prettyMs = require('pretty-ms')
6-
var parseOpts = require('minimist')
71

8-
var opts = parseOpts(process.argv.slice(2), {
9-
boolean: true,
10-
alias: {
11-
ansi: 'a',
12-
progress: 'p',
13-
},
14-
default: {
15-
ansi: true,
16-
progress: true,
17-
},
18-
})
19-
20-
var showAnsi = opts.ansi
21-
var showProgress = opts.progress
22-
23-
var format = showAnsi ? require('ansi-escape') : require('./lib/no-ansi')
24-
25-
var LF = '\n'
26-
27-
module.exports = function () {
28-
var tap = parser()
29-
var output = through()
30-
var test
31-
32-
var duration = 0
33-
output.push(LF + splitter(' Tests '))
34-
tap.on('test', function (res) {
35-
update()
36-
test = {
37-
name: res.name,
38-
pass: 0,
39-
fail: 0,
40-
get title() {
41-
return this.name +
42-
' [' +
43-
'pass: ' + this.pass +
44-
', fail: ' + this.fail +
45-
(test.end ? ', duration: ' + prettyMs(test.duration) : '') +
46-
']'
47-
},
48-
start: new Date(),
49-
}
50-
if (showProgress) {
51-
output.push(LF + format.cha.eraseLine.escape('# ' + test.title))
52-
}
53-
})
54-
55-
tap.on('pass', function () {
56-
++test.pass
57-
if (showProgress) {
58-
output.push(format.cha.eraseLine.escape('# ' + test.title))
59-
}
60-
})
61-
62-
tap.on('fail', function () {
63-
++test.fail
64-
if (showProgress) {
65-
output.push(format.cha.eraseLine.escape('# ' + test.title))
66-
}
67-
})
68-
69-
tap.on('output', function (res) {
70-
update()
71-
output.push(formatSummary(res, { duration: duration }))
72-
if (res.fail.length) {
73-
dup.failed = true
74-
output.push(formatFail(res))
75-
}
76-
if (res.comments.length) {
77-
output.push(formatComment(res))
78-
}
79-
output.push(LF + LF)
80-
output.push(null)
81-
})
82-
83-
function update() {
84-
if (test) {
85-
test.end = new Date()
86-
test.duration = test.end - test.start
87-
duration += test.duration
88-
if (showAnsi && !showProgress) {
89-
output.push(LF)
90-
}
91-
if (test.fail) {
92-
output.push(format.cha.red.eraseLine.escape(symbols.cross + ' ' + test.title))
93-
} else {
94-
output.push(format.cha.green.eraseLine.escape(symbols.tick + ' ' + test.title))
95-
}
96-
}
97-
}
98-
99-
var dup = duplexer(tap, output)
100-
return dup
101-
}
102-
103-
function formatSummary(res, extra) {
104-
var output = [LF]
105-
output.push(splitter(' Summary '))
106-
output.push(format.cyan.escape('duration: ' + prettyMs(extra.duration)))
107-
output.push(format.cyan.escape('assertions: ' + res.asserts.length))
108-
if (res.pass.length) {
109-
output.push(format.green.escape('pass: ' + res.pass.length))
110-
} else {
111-
output.push(format.cyan.escape('pass: ' + res.pass.length))
112-
}
113-
if (res.fail.length) {
114-
output.push(format.red.escape('fail: ' + res.fail.length))
115-
} else {
116-
output.push(format.cyan.escape('fail: ' + res.fail.length))
117-
}
118-
return output.join(LF)
119-
}
120-
121-
function formatComment(res) {
122-
var comments = res.comments.reduce(function (o, c) {
123-
var name = getTest(c.test, res.tests).raw
124-
o[name] = o[name] || []
125-
o[name].push(c.raw)
126-
return o
127-
}, {})
128-
var output = [LF]
129-
output.push(splitter(' Comments '))
130-
output.push(Object.keys(comments).map(function (name) {
131-
return format.cyan.underline.escape(name) + LF + comments[name].join(LF)
132-
}).join(LF + LF))
133-
return output.join(LF)
134-
}
135-
136-
function splitter(s) {
137-
var len = s && s.length || 0
138-
var max = 80
139-
var left = max - len >> 1
140-
return format.yellow.escape(
141-
repeat('-', left) + (s || '') + repeat('-', max - len - left)
142-
)
143-
}
144-
145-
function repeat(str, n) {
146-
if (str.repeat) {
147-
return str.repeat(n)
148-
}
149-
return (new Array(n + 1)).join(str)
150-
}
151-
152-
function getTest(n, tests) {
153-
for (var i = 0, len = tests.length; i < len; ++i) {
154-
if (~~n === tests[i].number) {
155-
return tests[i]
156-
}
157-
}
158-
return null
159-
}
160-
161-
function formatFail(res) {
162-
var fail = res.fail.reduce(function (o, c) {
163-
var name = getTest(c.test, res.tests).name
164-
o[name] = o[name] || [format.cyan.underline.escape('# ' + name)]
165-
o[name].push(format.red.escape(' ' + symbols.cross + ' ' + c.name))
166-
o[name].push(prettifyError(c))
167-
return o
168-
}, {})
169-
170-
var output = [LF]
171-
output.push(splitter(' Fails '))
172-
output.push(
173-
Object.keys(fail).map(function (name) {
174-
return fail[name].join(LF)
175-
}).join(LF + LF)
176-
)
177-
return output.join(LF)
178-
}
179-
180-
function prettifyError(assertion) {
181-
var rawError = assertion.error.raw
182-
var ret = rawError.split(LF)
183-
var stack = assertion.error.stack
184-
if (stack) {
185-
stack = stack.split(LF)
186-
var padding = repeat(' ', ret[ret.length - 1].length)
187-
ret = ret.concat(stack.map(function (s) {
188-
return padding + s
189-
}))
190-
}
191-
return format.cyan.escape(ret.join(LF))
192-
}
2+
module.exports = require('./lib/summary')

lib/summarize.js

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
var duplexer = require('duplexer2')
2+
var parser = require('tap-out')
3+
var PassThrough = require('stream').PassThrough
4+
5+
module.exports = function () {
6+
var tap = parser()
7+
var output = PassThrough()
8+
var dup = duplexer(tap, output)
9+
dup.output = output
10+
11+
var test
12+
var duration = 0
13+
14+
function handleTestEnd() {
15+
if (test) {
16+
test.end = new Date()
17+
test.duration = test.end - test.start
18+
duration += test.duration
19+
dup.emit('test.end', test)
20+
}
21+
}
22+
23+
tap.on('test', function (res) {
24+
handleTestEnd()
25+
test = {
26+
name: res.name,
27+
pass: 0,
28+
fail: 0,
29+
start: new Date(),
30+
}
31+
dup.emit('test.start', test)
32+
})
33+
34+
tap.on('pass', function () {
35+
++test.pass
36+
dup.emit('test.pass', test)
37+
})
38+
39+
tap.on('fail', function () {
40+
++test.fail
41+
dup.emit('test.fail', test)
42+
})
43+
44+
tap.on('output', function (res) {
45+
handleTestEnd()
46+
47+
if (res.fail.length) {
48+
dup.failed = true
49+
}
50+
51+
dup.emit('summary', {
52+
duration: duration,
53+
assertions: res.asserts.length,
54+
pass: res.pass.length,
55+
fail: res.fail.length,
56+
comments: res.comments.length,
57+
}, res.fail.reduce(function (o, assertion) {
58+
var name = getTest(assertion.test, res.tests).name
59+
o[name] = o[name] || []
60+
o[name].push(assertion)
61+
return o
62+
}, {}), res.comments.reduce(function (o, assertion) {
63+
var name = getTest(assertion.test, res.tests).raw
64+
o[name] = o[name] || []
65+
o[name].push(assertion.raw)
66+
return o
67+
}, {}), res)
68+
})
69+
70+
return dup
71+
}
72+
73+
function getTest(n, tests) {
74+
for (var i = 0, len = tests.length; i < len; ++i) {
75+
if (~~n === tests[i].number) {
76+
return tests[i]
77+
}
78+
}
79+
return null
80+
}
81+

0 commit comments

Comments
 (0)