function test(name, fn){ expected = -1; numTests = 0; reset(); fn(); if ( expected != -1 && expected != numTests ) log( false, "Wrong number of tests run. " + numTests + " ran, expected " + expected ); } var orig = document.getElementById('main').innerHTML; /** * Resets the test setup. Useful for tests that modify the DOM. */ function reset() { document.getElementById('main').innerHTML = orig; } var currentModule = ""; // call on start of module test to prepend name to all tests function module(moduleName) { currentModule = moduleName; } var expected = -1; /** * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. */ function expect(asserts) { expected = asserts; } /** * Asserts true. * @example ok( $("a").size() > 5, "There must be at least 5 anchors" ); */ function ok(a, msg) { log( !!a, msg ); } /** * Asserts that two arrays are the same */ function isSet(a, b, msg) { var ret = true; if ( a && b && a.length != undefined && a.length == b.length ) { for ( var i = 0; i < a.length; i++ ) { if ( a[i] != b[i] ) ret = false; } } else ret = false; if ( !ret ) log( ret, msg + " expected: " + serialArray(b) + " result: " + serialArray(a) ); else log( ret, msg ); } /** * Asserts that two objects are equivalent */ function isObj(a, b, msg) { var ret = true; if ( a && b ) { for ( var i in a ) if ( a[i] != b[i] ) ret = false; for ( i in b ) if ( a[i] != b[i] ) ret = false; } else ret = false; log( ret, msg ); } function serialArray( a ) { var r = []; if ( a && a.length ) for ( var i = 0; i < a.length; i++ ) { var str = a[i] ? a[i].nodeName : ""; if ( str ) { str = str.toLowerCase(); if ( a[i].id ) str += "#" + a[i].id; } else str = a[i]; r.push( str ); } return "[ " + r.join(", ") + " ]" } /** * Returns an array of elements with the given IDs, eg. * @example q("main", "foo", "bar") * @result [