-
Notifications
You must be signed in to change notification settings - Fork 0
/
transform.js
82 lines (65 loc) · 2.14 KB
/
transform.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
// cannot remember if i made this myself or copied it from somewhere
import tapOut from 'tap-out'
import through from 'through2'
import duplexer from 'duplexer'
import format from 'chalk'
import prettyMs from 'pretty-ms'
import _ from 'lodash'
import symbols from 'figures'
export default function (spec) {
spec = spec || {}
const OUTPUT_PADDING = spec.padding || ' '
const output = through()
const parser = tapOut()
const stream = duplexer(parser, output)
const startTime = new Date().getTime()
output.push('\n')
parser.on('test', function (test) {
output.push('\n' + pad(format.underline(test.name)) + '\n\n')
})
// Passing assertions
parser.on('pass', function (assertion) {
const glyph = format.green(symbols.tick)
const name = format.dim(assertion.name)
output.push(pad(' ' + glyph + ' ' + name + '\n'))
})
// Failing assertions
parser.on('fail', function (assertion) {
const glyph = symbols.cross
const title = glyph + ' ' + assertion.name
output.push(pad(' ' + format.red(title) + '\n'))
stream.failed = true
})
parser.on('comment', function (comment) {
output.push(pad(' ' + format.yellow(comment.raw)) + '\n')
})
// All done
parser.on('output', function (results) {
console.log('all done')
output.push('\n\n')
output.push(formatTotals(results))
output.push('\n\n\n')
// Exit if no tests run. This is a result of 1 of 2 things:
// 1. No tests were written
// 2. There was some error before the TAP got to the parser
if (results.tests.length === 0) {
process.exit(1)
}
})
// Utils
function formatTotals (results) {
if (results.tests.length === 0) {
return pad(format.red(symbols.cross + ' No tests found'))
}
return _.filter([
pad('total: ' + results.asserts.length),
pad(format.green('passing: ' + results.pass.length)),
results.fail.length > 0 ? pad(format.red('failing: ' + results.fail.length)) : undefined,
pad('duration: ' + prettyMs(new Date().getTime() - startTime)),
], _.identity).join('\n')
}
function pad (str) {
return OUTPUT_PADDING + str
}
return stream
}