// A helper to run a suite of tests. // The "test object" should be an object with function names as keys and a // function as the value. The functions will be called with a "cbnext" param // which should be called when the test is complete. // eg: // test = { // foo: function(cbnext) {... cbnext();} // } function runTests(tests, cbPreTest, cbPostTest) { waitForExplicitFinish(); let testIter = Iterator(tests); if (cbPreTest === undefined) { cbPreTest = function(cb) {cb()}; } if (cbPostTest === undefined) { cbPostTest = function(cb) {cb()}; } let runNextTest = function() { let name, func; try { [name, func] = testIter.next(); } catch (err if err instanceof StopIteration) { // out of items: finish(); return; } // We run on a timeout as the frameworker also makes use of timeouts, so // this helps keep the debug messages sane. window.setTimeout(function() { function cleanupAndRunNextTest() { info("sub-test " + name + " complete"); cbPostTest(runNextTest); } cbPreTest(function() { info("sub-test " + name + " starting"); try { func.call(tests, cleanupAndRunNextTest); } catch (ex) { ok(false, "sub-test " + name + " failed: " + ex.toString() +"\n"+ex.stack); cleanupAndRunNextTest(); } }) }, 0) } runNextTest(); }