(function(){
var ConsoleTestRunner = Evidence.AutoRunner.RUNNERS.console,
ConsoleTestResult = Evidence.UI.Console.TestResult,
AutoRunner = Evidence.AutoRunner,
printf = Evidence.UI.printf
function inherit(superclass, extra) {
var klass = function(){
this.initialize.apply(this, arguments)
}
var tmp = function(){}
tmp.prototype = superclass.prototype
klass.prototype = new tmp()
klass.prototype.constructor = klass
klass.prototype.initialize = function(){
superclass.apply(this, arguments)
}
if (extra) {
var methods = extra.call(klass, superclass.prototype)
for (var method in methods) klass.prototype[method] = methods[method]
}
return klass
}
var TestRunner = inherit(ConsoleTestRunner, function(_super) {
AutoRunner.RUNNERS.zepto = this
return {
_makeResult: function() { return new TestResult(this.logger) }
}
})
var TestResult = inherit(ConsoleTestResult, function(_super) {
return {
start: function(t0) {
Evidence.TestResult.prototype.start.call(this, t0)
this.logger.debug('Started tests.')
},
stop: function(t1) {
_super.stop.call(this, t1)
displayResults(this, (t1-this.t0)/1000)
checkLeakedGlobals()
},
pauseTest: function(testcase) {
this.logger.debug('Paused testcase ' + testcase + '.')
},
restartTest: function(testcase) {
this.logger.debug('Restarted testcase ' + testcase + '.')
},
startSuite: function(suite) {
this.logger.debug('Started suite ' + suite + '.')
},
addFailure: function(testcase, reason) {
this.logToServer(testcase, reason)
_super.addFailure.call(this, testcase, reason)
},
addError: function(testcase, error) {
this.logToServer(testcase, error)
_super.addError.call(this, testcase, error)
},
logToServer: function(testcase, error) {
if (location.protocol == 'file:') return
var name = testcase.parent.name + '#' + testcase.name,
message = error.template ?
Evidence.UI.printf(error.template, error.args) + (error.message ? ' ' + error.message : '') :
error.message,
body = 'name=' + encodeURIComponent(name) + '&' +
'message=' + encodeURIComponent(message) + '&' +
'trace=' + encodeURIComponent(error.stack || '')
var xhr = new XMLHttpRequest()
xhr.open('POST', '/test/log', true)
xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
xhr.send(body)
}
}
})
Evidence.TestCase.prototype.debug = function(message) {
this._result.logToServer(this, { message: message })
}
// HACK: force our test runner as default
;(function(){
var _super = AutoRunner.prototype.retrieveOptions
AutoRunner.prototype.retrieveOptions = function() {
var options = _super.call(this)
if (!options.runner) options.runner = 'zepto'
return options
}
})()
function $(id) { return document.getElementById(id) }
function displayResults(results, seconds) {
var container = $('results')
if (container) {
if (results.failureCount || results.errorCount) {
container.className = 'failed'
container.innerHTML = printf("Finished in %d s. – %d failures, %d errors (%d assertions)",
[seconds, results.failureCount, results.errorCount, results.assertionCount])
} else {
container.className = 'passed'
container.innerHTML = printf("Finished in %d s. – %d tests passed (%d assertions)",
[seconds, results.testCount, results.assertionCount])
}
container.className += ' finished'
}
}
var globals = [], expected = ['Zepto', '$', 'Evidence', '_zid', 'jsonpDummy']
for (var key in window) globals.push(key)
function checkLeakedGlobals() {
var opera = /^Opera\b/.test(navigator.userAgent)
for (var key in window)
if ( globals.indexOf(key) < 0 && expected.indexOf(key) < 0 &&
(!opera || typeof window[key] != 'object' || window[key].id != key) &&
window.console && console.warn
)
console.warn("unexpected global: " + key)
}
})()