emile
Version:
no-thrills stand-alone CSS animation JavaScript framework
181 lines (162 loc) • 3.64 kB
JavaScript
/*!
* Sink - Browser & Headless JavaScript Unit Tester
* copyright Dustin Diaz & Jacob Thornton
*
*/
!function(context) {
var total = 0,
fail = false,
tests = [],
item,
setPasses = true,
beforeMethods = [],
afterMethods = [],
currentSetName,
isHeadless = false;
function reset() {
total = 0;
fail = false;
init();
}
function each(items, fn) {
for (var i = 0; i < items.length; i++) {
fn(items[i]);
}
}
function failure(li, check) {
setPasses = false;
if (!isHeadless) {
check.innerHTML = '✗';
li.className = 'fail';
}
reset();
}
function pass(li, check) {
if (!isHeadless) {
check.innerHTML = '✓';
li.className = 'pass';
}
reset();
}
function before(fn) {
fn ? beforeMethods.push(fn) : each(beforeMethods, function (f) {
f();
});
}
function after(fn) {
fn ? afterMethods.push(fn) : each(afterMethods, function (f) {
f();
});
}
function bind(li) {
li.onclick = function() {
this.getElementsByTagName('ul')[0].className = 'show';
};
}
function _test(name, expect, fn) {
before();
total = expect;
var li, check;
if (!isHeadless) {
li = document.createElement('li');
li.innerHTML = name + ' ... <span>o</span><ul></ul>';
item = li.getElementsByTagName('ul')[0];
bind(li);
check = li.getElementsByTagName('span')[0];
document.getElementById('tests').appendChild(li);
} else {
console.log((name + '...').yellow);
}
var start = +new Date;
fn();
setTimeout(function() {
if (+new Date - start > 10000) {
failure(li, check);
after();
} else {
if (fail) {
failure(li, check);
after();
} else if (!total) {
after();
pass(li, check);
} else {
setTimeout(arguments.callee, 10);
}
}
}, 10);
}
function test(name, expect, fn) {
tests.push({
name: name,
expect: expect,
fn: fn
});
}
function init() {
if (tests.length) {
var o = tests.shift();
_test(o.name, o.expect, o.fn);
} else {
setPasses = true;
start();
}
}
function ok(b, message) {
if (isHeadless) {
if (b) {
console.log((message + ' ✓').green);
} else {
console.log((message + ' ✗').red);
}
} else {
var li = document.createElement('li');
li.innerHTML = message + ' ' + (b ? '✓' : '✗');
item.appendChild(li);
}
if (b) {
total--;
} else {
fail = true;
}
}
var modules = [];
function sink(name, fn) {
modules.push({
name: name,
fn: fn
});
}
function nextGroup(name, fn) {
beforeMethods = [];
afterMethods = [];
console.log('MODULE: ' + name);
fn(test, ok, before, after);
currentSetName = name;
init();
}
function start() {
var current = modules.shift();
current ? nextGroup(current.name, current.fn) : !function () {
var message = [
'Congratulations! All tests have passed!',
'There were some errors! The suite has failed.'
];
if (isHeadless) {
message = message[setPasses ? 0 : 1].toUpperCase();
if (setPasses) {
console.log(message.rainbow);
} else {
console.log(message.red);
}
}
}();
}
if (isHeadless) {
exports.sink = sink;
exports.start = start;
} else {
context.sink = sink;
context.start = start;
}
}(this);