<!doctype html> <html> <head> <meta charset="utf-8"> <title>Clone Test-Suite (Browser)</title> <script> var module = {}; var tests = exports = module.exports = {}; function require(moduleName) { if (moduleName == './') { return clone; } } function log(str) { logList.innerHTML += '<li>' + str + '</li>'; } </script> <script src="clone.js"></script> <script src="test.js"></script> </head> <body> <h1 id="nodeunit-header">Clone Test-Suite (Browser)</h1> Tests started: <span id="testsStarted"></span>; Tests finished: <span id="testsFinished"></span>. <ul id="logList"></ul> <script> /* Methods copied from * https://github.com/caolan/nodeunit/blob/master/lib/assert.js */ function isUndefinedOrNull(value) { return value === null || value === undefined; } function isArguments(object) { return Object.prototype.toString.call(object) == '[object Arguments]'; } var _keys = function (obj){ if (Object.keys) return Object.keys(obj); if (typeof obj != 'object' && typeof obj != 'function') { throw new TypeError('-'); } var keys = []; for(var k in obj) if(obj.hasOwnProperty(k)) keys.push(k); return keys; }; function objEquiv(a, b) { if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) return false; if (a.prototype !== b.prototype) return false; if (isArguments(a)) { if (!isArguments(b)) return false; a = pSlice.call(a); b = pSlice.call(b); return _deepEqual(a, b); } try { var ka = _keys(a), kb = _keys(b), key, i; } catch (e) { return false } if (ka.length != kb.length) return false; ka.sort(); kb.sort(); for (i = ka.length - 1; i >= 0; i--) { if (ka[i] != kb[i]) return false; } for (i = ka.length - 1; i >= 0; i--) { key = ka[i]; if (!_deepEqual(a[key], b[key] )) return false; } return true; } function _deepEqual(actual, expected) { if (actual === expected) { return true; } else if (actual instanceof Date && expected instanceof Date) { return actual.getTime() === expected.getTime(); } else if (actual instanceof RegExp && expected instanceof RegExp) { return actual.source === expected.source && actual.global === expected.global && actual.ignoreCase === expected.ignoreCase && actual.multiline === expected.multiline; } else if (typeof actual != 'object' && typeof expected != 'object') { return actual == expected; } else { return objEquiv(actual, expected); } } for (var testName in tests) { setTimeout((function (testName) { try { testsStarted.innerHTML = (parseInt(testsStarted.innerHTML) || 0) + 1; function incFinished() { testsFinished.innerHTML = (parseInt(testsFinished.innerHTML) || 0) + 1; } tests[testName]({ expect: function (num) { this._expect = num }, ok: function (val) { if(!val) throw new Error(val + ' is not ok.') }, equal: function (a,b) { if (a != b) throw new Error(a + ' is not equal to ' + b) }, notEqual: function (a,b) { if (a == b) throw new Error(a + ' is equal to ' + b) }, strictEqual: function (a,b) { if (a !== b) throw new Error(a + ' is not strict equal to ' + b) }, deepEqual: function (a,b) { if (!_deepEqual(a,b)) throw new Error(JSON.stringify(a) + ' is not deep equal to ' + JSON.stringify(b)) }, done: function () { log(testName + ' <span style="color:blue">is ok</span>.'); incFinished(); } }); } catch(e) { log(testName + ' <span style="color:red">FAIL.</span> <small>'+ e +'</small>'); incFinished(); console.log(e); } })(testName), 1); } </script> </body> </html>