/*! * Nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed * * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. * Only code on that line will be removed, its mostly to avoid requiring code * that is node specific */ /** * NOTE: this test runner is not listed in index.js because it cannot be * used with the command-line tool, only inside the browser. */ /** * Reporter info string */ exports.info = "Browser-based test reporter"; /** * Run all tests within each module, reporting the results * * @param {Array} files * @api public */ exports.run = function (modules, options, callback) { var start = new Date().getTime(), div; options = options || {}; div = options.div || document.body; function setText(el, txt) { if ('innerText' in el) { el.innerText = txt; } else if ('textContent' in el){ el.textContent = txt; } } function getOrCreate(tag, id) { var el = document.getElementById(id); if (!el) { el = document.createElement(tag); el.id = id; div.appendChild(el); } return el; }; var header = getOrCreate('h1', 'nodeunit-header'); var banner = getOrCreate('h2', 'nodeunit-banner'); var userAgent = getOrCreate('h2', 'nodeunit-userAgent'); var tests = getOrCreate('ol', 'nodeunit-tests'); var result = getOrCreate('p', 'nodeunit-testresult'); setText(userAgent, navigator.userAgent); nodeunit.runModules(modules, { moduleStart: function (name) { /*var mheading = document.createElement('h2'); mheading.innerText = name; results.appendChild(mheading); module = document.createElement('ol'); results.appendChild(module);*/ }, testDone: function (name, assertions) { var test = document.createElement('li'); var strong = document.createElement('strong'); strong.innerHTML = name + ' (' + '' + assertions.failures() + ', ' + '' + assertions.passes() + ', ' + assertions.length + ')'; test.className = assertions.failures() ? 'fail': 'pass'; test.appendChild(strong); var aList = document.createElement('ol'); aList.style.display = 'none'; test.onclick = function () { var d = aList.style.display; aList.style.display = (d == 'none') ? 'block': 'none'; }; for (var i=0; i' + (a.error.stack || a.error) + ''; li.className = 'fail'; } else { li.innerHTML = a.message || a.method || 'no message'; li.className = 'pass'; } aList.appendChild(li); } test.appendChild(aList); tests.appendChild(test); }, done: function (assertions) { var end = new Date().getTime(); var duration = end - start; var failures = assertions.failures(); banner.className = failures ? 'fail': 'pass'; result.innerHTML = 'Tests completed in ' + duration + ' milliseconds.
' + assertions.passes() + ' assertions of ' + '' + assertions.length + ' passed, ' + assertions.failures() + ' failed.'; if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); } }); };