deadunit
Version:
A dead-simple nestable unit testing library for javascript and node.js.
154 lines (127 loc) • 5.02 kB
JavaScript
var Future = require('async-future')
// built in test formatting helper
module.exports = function(unitTest, printOnTheFly/*, [consoleColors,] format*/) {
if(arguments.length === 3) {
var format = arguments[2]
} else /* if(arguments.length > 3) */{
var color = arguments[2]
var format = arguments[3]
}
var dotText = '.'
if(color !== undefined) {
dotText = color.green('.')
}
var result = new Future
var lastPrintWasDot = false
var printDot = function(dot) {
if(dot) {
process.stdout.write(dotText)
} else if(lastPrintWasDot) {
process.stdout.write('\n')
}
lastPrintWasDot = dot
}
var ended = false
var events = {
end: function(e) {
ended = true
if(printOnTheFly) printDot(false)
var results = unitTest.results()
result.return(formatGroup(results, format, 0).result)
if(format.end !== undefined)
format.end()
}
}
if(printOnTheFly) {
var groups = {}
events.assert = function(e) {
printDot(e.success && !ended)
if(e.success) {
groups[e.parent].testSuccesses++
groups[e.parent].assertSuccesses++
} else {
groups[e.parent].testFailures++
groups[e.parent].assertFailures++
}
if(!e.success || ended) {
console.log(format.assert(e, undefined, true))
}
}
events.exception = function(e) {
printDot(false)
groups[e.parent].exceptions++
console.log(format.exception(e.error, true))
}
events.log = function(e) {
printDot(false)
console.log(format.log(e.values, true))
}
events.group = function(g) {
groups[g.id] = {parent: g.parent, name: g.name, testSuccesses: 0, testFailures: 0, assertSuccesses: 0, assertFailures: 0, exceptions: 0}
}
events.groupEnd = function(g) {
var parent = groups[g.id].parent
if(parent !== undefined) {
printDot(false)
if(groups[g.id].testFailures === 0 && groups[g.id].assertFailures === 0 && groups[g.id].exceptions === 0) {
groups[parent].testSuccesses++
} else {
groups[parent].testFailures++
}
console.log(format.group(groups[g.id].name, undefined, groups[g.id].testSuccesses,groups[g.id].testFailures,groups[g.id].assertSuccesses,groups[g.id].assertFailures,
groups[g.id].exceptions, [], [], 1, false, true))
}
}
}
unitTest.events(events)
return result
}
function formatGroup(testResults, format, nestingLevel) {
var assertSuccesses = 0
var assertFailures = 0
var exceptions = 0
var testCaseSuccesses= 0, testCaseFailures=0;
var results = []
testResults.results.forEach(function(result) {
if(result.type === 'assert') {
if(result.success) {
testCaseSuccesses++
assertSuccesses ++
} else {
testCaseFailures++
assertFailures++
}
results.push(format.assert(result, testResults.name, false))
} else if(result.type === 'group') {
var group = formatGroup(result, format, nestingLevel+1)
exceptions+= group.exceptions
if(group.failures === 0 && group.exceptions === 0)
testCaseSuccesses++
else
testCaseFailures++
results.push(group.result)
assertSuccesses+= group.assertSuccesses
assertFailures+= group.assertFailures
} else if(result.type === 'log') {
results.push(format.log(result.values, false))
} else {
throw new Error("Unknown result type: "+result.type)
}
})
var exceptionResults = []
testResults.exceptions.forEach(function(e) {
exceptionResults.push(format.exception(e, false))
})
exceptions+= testResults.exceptions.length
var formattedGroup = format.group(testResults.name, testResults.duration,
testCaseSuccesses, testCaseFailures,
assertSuccesses, assertFailures, exceptions,
results, exceptionResults, nestingLevel, testResults.timeout, false)
return {result: formattedGroup,
successes: testCaseSuccesses,
failures: testCaseFailures,
assertSuccesses: assertSuccesses,
assertFailures: assertFailures,
exceptions: exceptions
}
}