michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: const timer = require("sdk/timers"); michael@0: const { Loader } = require("sdk/test/loader"); michael@0: michael@0: var setupCalled = false, teardownCalled = false; michael@0: michael@0: exports.setup = function() { michael@0: setupCalled = true; michael@0: }; michael@0: michael@0: exports.teardown = function() { michael@0: teardownCalled = true; michael@0: setupCalled = false; michael@0: }; michael@0: michael@0: // Important note - unit tests are run in alphabetical order. The following michael@0: // unit tests for setup/teardown are order dependent, sometimes the result of michael@0: // one test is checked in the next test (testing for teardown does this). When michael@0: // tests are cohesively a single unit, they are named - partN where michael@0: // N is their order in the sequence. Secondly, because these tests should be michael@0: // run before all others, they start with an A. michael@0: exports.testASetupTeardownSyncTestPart1 = function(test) { michael@0: test.assertEqual(true, setupCalled, 'setup function was called before this'); michael@0: test.assertEqual(false, teardownCalled, 'teardown function was not called before this'); michael@0: }; michael@0: michael@0: exports.testASetupTeardownSyncTestPart2 = function(test) { michael@0: test.assertEqual(true, setupCalled, 'setup was re-called before this'); michael@0: test.assertEqual(true, teardownCalled, 'teardown was called after first function'); michael@0: }; michael@0: michael@0: exports.testATeardownAsyncTestPart1 = function(test) { michael@0: teardownCalled = false; michael@0: michael@0: timer.setTimeout(function() { michael@0: test.assertEqual(false, teardownCalled, "teardown not called until done"); michael@0: test.done(); michael@0: }, 200); michael@0: test.waitUntilDone(); michael@0: }; michael@0: michael@0: exports.testATeardownAsyncTestPart2 = function(test) { michael@0: test.assertEqual(true, teardownCalled, "teardown called after done"); michael@0: }; michael@0: michael@0: exports.testWaitUntilInstant = function(test) { michael@0: test.waitUntilDone(); michael@0: michael@0: test.waitUntil(function () true, "waitUntil with instant true pass") michael@0: .then(function () test.done()); michael@0: } michael@0: michael@0: exports.testWaitUntil = function(test) { michael@0: test.waitUntilDone(); michael@0: let succeed = false; michael@0: michael@0: test.waitUntil(function () succeed, "waitUntil pass") michael@0: .then(function () test.done()); michael@0: michael@0: timer.setTimeout(function () { michael@0: succeed = true; michael@0: }, 200); michael@0: } michael@0: michael@0: exports.testWaitUntilEqual = function(test) { michael@0: test.waitUntilDone(); michael@0: let succeed = false; michael@0: michael@0: test.waitUntilEqual("foo", function () succeed ? "foo" : "bar", michael@0: "waitUntilEqual pass") michael@0: .then(function () test.done()); michael@0: michael@0: timer.setTimeout(function () { michael@0: succeed = true; michael@0: }, 200); michael@0: } michael@0: michael@0: exports.testWaitUntilNotEqual = function(test) { michael@0: test.waitUntilDone(); michael@0: let succeed = false; michael@0: michael@0: test.waitUntilNotEqual("foo", function () succeed ? "bar" : "foo", michael@0: "waitUntilNotEqual pass") michael@0: .then(function () test.done()); michael@0: michael@0: timer.setTimeout(function () { michael@0: succeed = true; michael@0: }, 200); michael@0: } michael@0: michael@0: exports.testWaitUntilMatches = function(test) { michael@0: test.waitUntilDone(); michael@0: let succeed = false; michael@0: michael@0: test.waitUntilMatches(function () succeed ? "foo" : "bar", michael@0: /foo/, "waitUntilEqual pass") michael@0: .then(function () test.done()); michael@0: michael@0: timer.setTimeout(function () { michael@0: succeed = true; michael@0: }, 200); michael@0: } michael@0: michael@0: exports.testWaitUntilErrorInCallback = function(test) { michael@0: test.waitUntilDone(); michael@0: michael@0: test.expectFail(function() { michael@0: test.waitUntil(function () {throw "oops"}, "waitUntil pass") michael@0: .then(function () test.done()); michael@0: }); michael@0: } michael@0: michael@0: exports.testWaitUntilTimeoutInCallback = function(test) { michael@0: test.waitUntilDone(); michael@0: michael@0: let expected = []; michael@0: let message = 0; michael@0: if (require("@test/options").parseable) { michael@0: expected.push(["print", "TEST-START | wait4ever\n"]); michael@0: expected.push(["error", "fail:", "Timed out"]); michael@0: expected.push(["error", "test assertion never became true:\n", "assertion failed, value is false\n"]); michael@0: expected.push(["print", "TEST-END | wait4ever\n"]); michael@0: } michael@0: else { michael@0: expected.push(["info", "executing 'wait4ever'"]); michael@0: expected.push(["error", "fail:", "Timed out"]); michael@0: expected.push(["error", "test assertion never became true:\n", "assertion failed, value is false\n"]); michael@0: } michael@0: michael@0: function checkExpected(name, args) { michael@0: if (expected.length == 0 || expected[0][0] != name) { michael@0: test.fail("Saw an unexpected console." + name + "() call " + args); michael@0: return; michael@0: } michael@0: michael@0: message++; michael@0: let expectedArgs = expected.shift().slice(1); michael@0: for (let i = 0; i < expectedArgs.length; i++) michael@0: test.assertEqual(args[i], expectedArgs[i], "Should have seen the right message in argument " + i + " of message " + message); michael@0: if (expected.length == 0) michael@0: test.done(); michael@0: } michael@0: michael@0: let runner = new (require("sdk/deprecated/unit-test").TestRunner)({ michael@0: console: { michael@0: error: function() { michael@0: checkExpected("error", Array.slice(arguments)); michael@0: }, michael@0: info: function () { michael@0: checkExpected("info", Array.slice(arguments)); michael@0: }, michael@0: trace: function () {}, michael@0: exception: function () {}, michael@0: print: function () { michael@0: checkExpected("print", Array.slice(arguments)); michael@0: } michael@0: } michael@0: }); michael@0: michael@0: runner.start({ michael@0: test: { michael@0: name: "wait4ever", michael@0: testFunction: function(test) { michael@0: test.waitUntilDone(100); michael@0: test.waitUntil(function() false); michael@0: } michael@0: }, michael@0: onDone: function() {} michael@0: }); michael@0: }; michael@0: michael@0: exports.testExpectFail = function(test) { michael@0: test.expectFail(function() { michael@0: test.fail('expectFail masking .fail'); michael@0: }); michael@0: michael@0: test.expectFail(function() { michael@0: test.assert(false, 'expectFail masking .assert'); michael@0: }); michael@0: michael@0: test.assert(true, 'assert should pass with no expectFail'); michael@0: /* michael@0: test.expectFail(function() { michael@0: test.expectFail(function() { michael@0: test.fail('this should blow up'); michael@0: }); michael@0: }); michael@0: */ michael@0: }; michael@0: michael@0: exports.testAssertFunction = function(test) { michael@0: test.assertFunction(function() {}, 'assertFunction with function'); michael@0: test.expectFail(function() { michael@0: test.assertFunction(null, 'assertFunction with non-function'); michael@0: }); michael@0: }; michael@0: michael@0: exports.testAssertUndefined = function(test) { michael@0: test.assertUndefined(undefined, 'assertUndefined with undefined'); michael@0: test.expectFail(function() { michael@0: test.assertUndefined(null, 'assertUndefined with null'); michael@0: }); michael@0: test.expectFail(function() { michael@0: test.assertUndefined(false, 'assertUndefined with false'); michael@0: }); michael@0: test.expectFail(function() { michael@0: test.assertUndefined(0, 'assertUndefined with 0'); michael@0: }); michael@0: }; michael@0: michael@0: exports.testAssertNotUndefined = function(test) { michael@0: test.expectFail(function() { michael@0: test.assertNotUndefined(undefined, 'assertNotUndefined with undefined'); michael@0: }); michael@0: test.assertNotUndefined(null, 'assertNotUndefined with null'); michael@0: test.assertNotUndefined(false, 'assertNotUndefined with false'); michael@0: test.assertNotUndefined(0, 'assertNotUndefined with 0'); michael@0: }; michael@0: michael@0: exports.testAssertNull = function(test) { michael@0: test.assertNull(null, 'assertNull with null'); michael@0: test.expectFail(function() { michael@0: test.assertNull(undefined, 'assertNull with undefined'); michael@0: }); michael@0: test.expectFail(function() { michael@0: test.assertNull(false, 'assertNull with false'); michael@0: }); michael@0: test.expectFail(function() { michael@0: test.assertNull(0, 'assertNull with 0'); michael@0: }); michael@0: }; michael@0: michael@0: exports.testAssertNotNull = function(test) { michael@0: test.assertNotNull(undefined, 'assertNotNull with undefined'); michael@0: test.assertNotNull(false, 'assertNotNull with false'); michael@0: test.assertNotNull(0, 'assertNotNull with 0'); michael@0: michael@0: test.expectFail(function() { michael@0: test.assertNotNull(null, 'testAssertNotNull with null'); michael@0: }); michael@0: }; michael@0: michael@0: exports.testAssertObject = function(test) { michael@0: test.assertObject({}, 'assertObject with {}' ); michael@0: test.assertObject(new Object(), 'assertObject with new Object'); michael@0: test.expectFail(function() { michael@0: test.assertObject('fail', 'assertObject with string'); michael@0: }); michael@0: }; michael@0: michael@0: exports.testAssertString = function(test) { michael@0: test.assertString('', 'assertString with ""'); michael@0: test.assertString(new String(), 'assertString with new String'); michael@0: }; michael@0: michael@0: exports.testAssertArray = function(test) { michael@0: test.assertArray([], 'assertArray with []'); michael@0: test.assertArray(new Array(), 'assertArray with new Array'); michael@0: }; michael@0: michael@0: exports.testNumber = function(test) { michael@0: test.assertNumber(1, 'assertNumber with 1'); michael@0: test.assertNumber(new Number('2'), 'assertNumber with new Number("2")' ); michael@0: }; michael@0: