blob: 7794d1043734f9b806a4f41226d436f1fb1267ae [file] [log] [blame]
<!doctype html>
<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script>
function test()
{
ProtocolTest.suppressStackTraces = true;
try {
let result = new AsyncTestSuite(this);
ProtocolTest.fail("instantiating AsyncTestSuite requires name argument.");
} catch (e) {
ProtocolTest.pass("instantiating AsyncTestSuite requires name argument.");
}
try {
let result = new AsyncTestSuite(this, {});
ProtocolTest.fail("instantiating AsyncTestSuite requires string name argument.");
} catch (e) {
ProtocolTest.pass("instantiating AsyncTestSuite requires string name argument.");
}
try {
let result = new AsyncTestSuite(this, " ");
ProtocolTest.fail("instantiating AsyncTestSuite requires non-whitespace name argument.");
} catch (e) {
ProtocolTest.pass("instantiating AsyncTestSuite requires non-whitespace name argument.");
}
try {
let result = new AsyncTestSuite("something", {});
ProtocolTest.fail("instantiating AsyncTestSuite requires test harness argument.");
} catch (e) {
ProtocolTest.pass("instantiating AsyncTestSuite requires test harness argument.");
}
let badArgsSuite = ProtocolTest.createAsyncSuite("dummy");
try {
badArgsSuite.addTestCase();
ProtocolTest.fail("should not be able to add empty test case.");
} catch (e) {
ProtocolTest.pass("should not be able to add empty test case.");
}
try {
badArgsSuite.addTestCase("string");
ProtocolTest.fail("should not be able to add non-object test case.");
} catch (e) {
ProtocolTest.pass("should not be able to add non-object test case.");
}
try {
badArgsSuite.addTestCase({
name: {},
test() {},
});
ProtocolTest.fail("test case should require string name.");
} catch (e) {
ProtocolTest.pass("test case should require string name.");
}
try {
badArgsSuite.addTestCase({
name: " ",
test() {},
});
ProtocolTest.fail("test case should require non-whitespace name.");
} catch (e) {
ProtocolTest.pass("test case should require non-whitespace name.");
}
try {
badArgsSuite.addTestCase({
name: "foo",
test: null,
});
ProtocolTest.fail("test case should require test function.");
} catch (e) {
ProtocolTest.pass("test case should require test function.");
}
try {
badArgsSuite.addTestCase({
name: "foo",
test() {},
setup: "astd"
});
ProtocolTest.fail("should not be able to specify non-Function `setup` parameter.");
} catch (e) {
ProtocolTest.pass("should not be able to specify non-Function `setup` parameter.");
}
try {
badArgsSuite.addTestCase({
name: "foo",
test() {},
setup: 123
});
ProtocolTest.fail("should not be able to specify non-Function `setup` parameter.");
} catch (e) {
ProtocolTest.pass("should not be able to specify non-Function `setup` parameter.");
}
try {
badArgsSuite.addTestCase({
name: "foo",
test() {},
setup: {}
});
ProtocolTest.fail("should not be able to specify non-Function `setup` parameter.");
} catch (e) {
ProtocolTest.pass("should not be able to specify non-Function `setup` parameter.");
}
try {
badArgsSuite.addTestCase({
name: "foo",
test() {},
teardown: "astd"
});
ProtocolTest.fail("should not be able to specify non-Function `teardown` parameter.");
} catch (e) {
ProtocolTest.pass("should not be able to specify non-Function `teardown` parameter.");
}
try {
badArgsSuite.addTestCase({
name: "foo",
test() {},
teardown: 123
});
ProtocolTest.fail("should not be able to specify non-Function `teardown` parameter.");
} catch (e) {
ProtocolTest.pass("should not be able to specify non-Function `teardown` parameter.");
}
try {
badArgsSuite.addTestCase({
name: "foo",
test() {},
teardown: {}
});
ProtocolTest.fail("should not be able to specify non-Function `teardown` parameter.");
} catch (e) {
ProtocolTest.pass("should not be able to specify non-Function `teardown` parameter.");
}
let runEmptySuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.RunEmptySuite");
try {
runEmptySuite.runTestCases();
ProtocolTest.fail("should not be able to run empty test suite.");
} catch (e) {
ProtocolTest.pass("should not be able to run empty test suite.");
}
let runTwiceSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.RunTwiceSuite");
runTwiceSuite.addTestCase({
name: "DummyTest0",
description: "Check that a suite can't run more than once.",
test(resolve, reject) { resolve(); }
});
let result = runTwiceSuite.runTestCases();
try {
// Test cases won't run in this event loop; this call should still throw.
// Later tests are chained to this suite to avoid nondeterminism.
runTwiceSuite.runTestCases();
ProtocolTest.fail("should not be able to run a test suite twice.");
} catch (e) {
ProtocolTest.pass("should not be able to run a test suite twice.");
}
let rejectToken = {"token": 666};
let thrownError = new Error(rejectToken);
let sequentialExecutionSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.SequentialExecution");
sequentialExecutionSuite.addTestCase({
name: "DummyTest1",
description: "Check test case execution order.",
test(resolve, reject) { resolve(); }
});
sequentialExecutionSuite.addTestCase({
name: "DummyTest2",
description: "Check test case execution order.",
test(resolve, reject) { resolve(); }
});
sequentialExecutionSuite.addTestCase({
name: "DummyTest3",
description: "Check test case execution order.",
test(resolve, reject) { resolve(); }
});
sequentialExecutionSuite.addTestCase({
name: "FailingTest4",
description: "Check that test fails by throwing an Error instance.",
test(resolve, reject) { throw thrownError; }
});
let abortOnFailureSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.AbortOnFailure");
abortOnFailureSuite.addTestCase({
name: "PassingTest5",
description: "This test is a dummy.",
test(resolve, reject) { resolve(); }
});
abortOnFailureSuite.addTestCase({
name: "FailingTest6",
description: "This test should fail by explicitly calling the `reject` callback.",
test(resolve, reject) { reject(rejectToken); }
});
abortOnFailureSuite.addTestCase({
name: "PassingTest7",
description: "This test should not executed when the preceding test fails.",
test(resolve, reject) { resolve(); }
});
result = result.then(() => {
let promise = sequentialExecutionSuite.runTestCases();
ProtocolTest.expectThat(result instanceof Promise, "AsyncTestSuite.RunTestCases() should return a Promise.");
return promise;
});
result = result.then(function resolved() {
ProtocolTest.fail("Promise from sequentialExecutionSuite.runTestCases() should reject when a test case fails.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.pass("Promise from sequentialExecutionSuite.runTestCases() should reject when a test case fails.");
ProtocolTest.expectThat(e === thrownError, "Promise from sequentialExecutionSuite.runTestCases() should reject without altering its result value.");
ProtocolTest.expectThat(sequentialExecutionSuite.runCount === 4, "sequentialExecutionSuite should have executed four tests.");
ProtocolTest.expectThat(sequentialExecutionSuite.passCount === 3, "sequentialExecutionSuite should have passed three tests.");
ProtocolTest.expectThat(sequentialExecutionSuite.failCount === 1, "sequentialExecutionSuite should have failed 1 test.");
ProtocolTest.expectThat(sequentialExecutionSuite.skipCount === 0, "sequentialExecutionSuite should have skipped zero tests.");
return Promise.resolve(); // Continue this test.
});
result = result.then(() => {
return abortOnFailureSuite.runTestCases();
}).then(function resolved() {
ProtocolTest.fail("Promise from abortOnFailureSuite.runTestCases() should reject when a test case fails.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.pass("Promise from abortOnFailureSuite.runTestCases() should reject when a test case fails.");
ProtocolTest.expectThat(e === rejectToken, "Promise from abortOnFailureSuite.runTestCases() should reject without altering its result value.");
ProtocolTest.expectThat(abortOnFailureSuite.runCount === 2, "abortOnFailureSuite should have executed two tests.");
ProtocolTest.expectThat(abortOnFailureSuite.passCount === 1, "abortOnFailureSuite should have passed one test.");
ProtocolTest.expectThat(abortOnFailureSuite.failCount === 1, "abortOnFailureSuite should have failed one test.");
ProtocolTest.expectThat(abortOnFailureSuite.skipCount === 1, "abortOnFailureSuite should have skipped one test.");
return Promise.resolve(); // Continue this test.
});
var setupAndTeardownSymbol = Symbol("async-suite-setup-and-teardown-token");
window[setupAndTeardownSymbol] = 0;
let setupAndTeardownTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.SetupAndTeardown");
setupAndTeardownTestSuite.addTestCase({
name: "TestWithSetupAndTeardown",
description: "Check execution order for setup and teardown actions.",
setup: (resolve, reject) => {
window[setupAndTeardownSymbol] = 1;
resolve();
},
test(resolve, reject) {
ProtocolTest.expectThat(window[setupAndTeardownSymbol] === 1, "Test should see side effects of running setup() action.");
window[setupAndTeardownSymbol] = 2;
resolve();
},
teardown: (resolve, reject) => {
ProtocolTest.expectThat(window[setupAndTeardownSymbol] === 2, "Teardown should see side effects of running setup() action.");
window[setupAndTeardownSymbol] = 3;
resolve();
}
});
setupAndTeardownTestSuite.addTestCase({
name: "TestRunningAfterTeardown",
description: "Check execution order for test after a teardown action.",
test(resolve, reject) {
ProtocolTest.expectThat(window[setupAndTeardownSymbol] === 3, "Test should see side effects of previous test's teardown() action.");
resolve();
},
});
result = result.then(() => {
return setupAndTeardownTestSuite.runTestCases();
}).then(function resolved() {
ProtocolTest.pass("Promise from setupAndTeardownTestSuite.runTestCases() should resolve.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.fail("Promise from setupAndTeardownTestSuite.runTestCases() should resolve.");
return Promise.resolve(); // Continue this test.
});
let setupExceptionTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.SetupException");
setupExceptionTestSuite.addTestCase({
name: "TestWithExceptionDuringSetup",
description: "Check execution order for setup action that throws an exception.",
setup: (resolve, reject) => { throw new Error() },
test(resolve, reject) {
ProtocolTest.assert(false, "Test should not execute if its setup action threw an exception.");
reject();
},
teardown: (resolve, reject) => {
ProtocolTest.assert(false, "Teardown action should not execute if its setup action threw an exception.");
reject();
}
});
result = result.then(() => {
return setupExceptionTestSuite.runTestCases();
}).then(function resolved() {
ProtocolTest.fail("Promise from setupExceptionTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.pass("Promise from setupExceptionTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
});
let setupFailureTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.SetupFailure");
setupFailureTestSuite.addTestCase({
name: "TestWithFailureDuringSetup",
description: "Check execution order for setup action that has failed.",
setup: (resolve, reject) => { reject(); },
test(resolve, reject) {
ProtocolTest.assert(false, "Test should not execute if its setup action failed.")
reject();
},
teardown: (resolve, reject) => {
ProtocolTest.assert(false, "Teardown action should not execute if its setup action failed.")
reject();
}
});
result = result.then(() => {
return setupFailureTestSuite.runTestCases();
}).then(function resolved() {
ProtocolTest.fail("Promise from setupFailureTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.pass("Promise from setupFailureTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
});
let teardownExceptionTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.TeardownException");
teardownExceptionTestSuite.addTestCase({
name: "TestWithExceptionDuringTeardown",
description: "Check execution order for teardown action that throws an exception.",
test(resolve, reject) { resolve(); },
teardown: (resolve, reject) => { throw new Error() }
});
teardownExceptionTestSuite.addTestCase({
name: "TestAfterTeardownException",
descrption: "Check execution order for test after previous test's teardown throws an exception.",
setup: (resolve, reject) => {
ProtocolTest.assert(false, "Setup action should not execute if previous test's teardown action threw an exception.");
reject();
},
test(resolve, reject) {
ProtocolTest.assert(false, "Test should not execute if previous test's teardown action threw an exception.");
reject();
}
});
result = result.then(() => {
return teardownExceptionTestSuite.runTestCases();
}).then(function resolved() {
ProtocolTest.fail("Promise from teardownExceptionTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.pass("Promise from teardownExceptionTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
});
let teardownFailureTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.TeardownFailure");
teardownFailureTestSuite.addTestCase({
name: "TestWithExceptionDuringTeardown",
description: "Check execution order for teardown action that has failed.",
test(resolve, reject) { resolve(); },
teardown: (resolve, reject) => { reject(); },
});
teardownFailureTestSuite.addTestCase({
name: "TestAfterTeardownException",
description: "Check execution order for test after previous test's teardown throws an exception",
setup: (resolve, reject) => {
ProtocolTest.assert(false, "Setup action should not execute if previous test's teardown action failed.");
reject();
},
test(resolve, reject) {
ProtocolTest.assert(false, "Test should not execute if previous test's teardown action failed.");
reject();
}
});
result = result.then(() => {
return teardownFailureTestSuite.runTestCases();
}).then(function resolved() {
ProtocolTest.fail("Promise from teardownFailureTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.pass("Promise from teardownFailureTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
});
// Async test functions.
let asyncFunctionSuccessTestSuiteDidEvaluate = false;
let asyncFunctionSuccessTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.AsyncFunctionSuccess");
asyncFunctionSuccessTestSuite.addTestCase({
name: "AsyncFunctionSuccess",
description: "Check that an async suite with async test functions can succeed",
async test() {
asyncFunctionSuccessTestSuiteDidEvaluate = true;
return 42;
}
});
result = result.then(() => {
return asyncFunctionSuccessTestSuite.runTestCases();
}).then(function resolve(x) {
ProtocolTest.pass("Promise from asyncFunctionSuccessTestSuite.runTestCases() should succeed.");
ProtocolTest.expectThat(asyncFunctionSuccessTestSuiteDidEvaluate, "Promise did evaluate the async test function.");
ProtocolTest.expectEqual(x, 42, "Resolved value should be 42.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.fail("Promise from asyncFunctionSuccessTestSuite.runTestCases() should succeed.");
return Promise.resolve(); // Continue this test.
});
let asyncFunctionExplicitFailureTestSuiteDidEvaluate = false;
let asyncFunctionExplicitFailureTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.AsyncFunctionExplicitFailure");
asyncFunctionExplicitFailureTestSuite.addTestCase({
name: "AsyncFunctionFailure",
description: "Check that an async suite with async test functions that throws will reject",
async test() {
asyncFunctionExplicitFailureTestSuiteDidEvaluate = true;
throw "AsyncFunctionFailure Exception Message";
}
});
result = result.then(() => {
return asyncFunctionExplicitFailureTestSuite.runTestCases();
}).then(function resolve() {
ProtocolTest.fail("Promise from asyncFunctionExplicitFailureTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.pass("Promise from asyncFunctionExplicitFailureTestSuite.runTestCases() should reject.");
ProtocolTest.expectThat(asyncFunctionExplicitFailureTestSuiteDidEvaluate, "Promise did evaluate the async test function.");
ProtocolTest.expectEqual(e, "AsyncFunctionFailure Exception Message", "Rejected value should be thrown exception.");
return Promise.resolve(); // Continue this test.
});
let asyncFunctionRuntimeFailureTestSuiteDidEvaluate = false;
let asyncFunctionRuntimeFailureTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.AsyncFunctionRuntimeFailure");
asyncFunctionRuntimeFailureTestSuite.addTestCase({
name: "AsyncFunctionFailure",
description: "Check that an async suite with async test functions that throws with a runtime error will reject",
async test() {
asyncFunctionRuntimeFailureTestSuiteDidEvaluate = true;
({}).x.x.x;
}
});
result = result.then(() => {
return asyncFunctionRuntimeFailureTestSuite.runTestCases();
}).then(function resolve() {
ProtocolTest.fail("Promise from asyncFunctionRuntimeFailureTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.pass("Promise from asyncFunctionRuntimeFailureTestSuite.runTestCases() should reject.");
ProtocolTest.expectThat(asyncFunctionRuntimeFailureTestSuiteDidEvaluate, "Promise did evaluate the async test function.");
ProtocolTest.expectThat(e instanceof TypeError, "Rejected value should be a runtime exception.");
return Promise.resolve(); // Continue this test.
});
// Async setup() and teardown() success test cases.
const asyncSetupAndTeardownSymbol = Symbol("async-suite-async-setup-and-teardown-token");
window[asyncSetupAndTeardownSymbol] = 0;
let asyncSetupAndAsyncTeardownTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.AsyncSetupAndAsyncTeardown");
asyncSetupAndAsyncTeardownTestSuite.addTestCase({
name: "TestWithSetupAndTeardown",
description: "Check execution order for setup and teardown actions.",
async setup() {
window[asyncSetupAndTeardownSymbol] = 1;
},
async test() {
ProtocolTest.expectThat(window[asyncSetupAndTeardownSymbol] === 1, "Test should see side effects of running setup() action.");
window[asyncSetupAndTeardownSymbol] = 2;
},
async teardown() {
ProtocolTest.expectThat(window[asyncSetupAndTeardownSymbol] === 2, "Teardown should see side effects of running setup() action.");
window[asyncSetupAndTeardownSymbol] = 3;
}
});
asyncSetupAndAsyncTeardownTestSuite.addTestCase({
name: "TestRunningAfterTeardown",
description: "Check execution order for test after a teardown action.",
test(resolve, reject) {
ProtocolTest.expectThat(window[asyncSetupAndTeardownSymbol] === 3, "Test should see side effects of previous test's teardown() action.");
resolve();
},
});
result = result.then(() => {
return asyncSetupAndAsyncTeardownTestSuite.runTestCases();
}).then(function resolved() {
ProtocolTest.pass("Promise from asyncSetupAndAsyncTeardownTestSuite.runTestCases() should resolve.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.fail("Promise from asyncSetupAndAsyncTeardownTestSuite.runTestCases() should resolve.");
return Promise.resolve(); // Continue this test.
});
// Async setup() failure test cases.
let asyncSetupExplicitFailureTestSuiteDidEvaluate = false;
let asyncSetupExplicitFailureTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.AsyncSetupExplicitFailure");
asyncSetupExplicitFailureTestSuite.addTestCase({
name: "AsyncFunctionFailure",
description: "Check that an async suite with async test functions that throws will reject",
async test() {
asyncSetupExplicitFailureTestSuiteDidEvaluate = true;
throw "AsyncFunctionFailure Exception Message";
}
});
result = result.then(() => {
return asyncSetupExplicitFailureTestSuite.runTestCases();
}).then(function resolve() {
ProtocolTest.fail("Promise from asyncSetupExplicitFailureTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.pass("Promise from asyncSetupExplicitFailureTestSuite.runTestCases() should reject.");
ProtocolTest.expectThat(asyncSetupExplicitFailureTestSuiteDidEvaluate, "Promise did evaluate the async setup function.");
ProtocolTest.expectEqual(e, "AsyncFunctionFailure Exception Message", "Rejected value should be thrown exception.");
return Promise.resolve(); // Continue this test.
});
let asyncSetupRuntimeFailureTestSuiteDidEvaluate = false;
let asyncSetupRuntimeFailureTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.AsyncSetupRuntimeFailure");
asyncSetupRuntimeFailureTestSuite.addTestCase({
name: "AsyncFunctionFailure",
description: "Check that an async suite with an async setup function that throws with a runtime error will reject",
async setup() {
asyncSetupRuntimeFailureTestSuiteDidEvaluate = true;
({}).x.x.x;
},
async test() { return true; },
});
result = result.then(() => {
return asyncSetupRuntimeFailureTestSuite.runTestCases();
}).then(function resolve() {
ProtocolTest.fail("Promise from asyncSetupRuntimeFailureTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.pass("Promise from asyncSetupRuntimeFailureTestSuite.runTestCases() should reject.");
ProtocolTest.expectThat(asyncSetupRuntimeFailureTestSuiteDidEvaluate, "Promise did evaluate the async setup function.");
ProtocolTest.expectThat(e instanceof TypeError, "Rejected value should be a runtime exception.");
return Promise.resolve(); // Continue this test.
});
// Async teardown() failure test cases.
let asyncTeardownExplicitFailureTestSuiteDidEvaluate = false;
let asyncTeardownExplicitFailureTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.AsyncTeardownExplicitFailure");
asyncTeardownExplicitFailureTestSuite.addTestCase({
name: "AsyncFunctionFailure",
description: "Check that an async suite with async test functions that throws will reject",
async test() { return true; },
async teardown() {
asyncTeardownExplicitFailureTestSuiteDidEvaluate = true;
throw "AsyncFunctionFailure Exception Message";
},
});
result = result.then(() => {
return asyncTeardownExplicitFailureTestSuite.runTestCases();
}).then(function resolve() {
ProtocolTest.fail("Promise from asyncTeardownExplicitFailureTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.pass("Promise from asyncTeardownExplicitFailureTestSuite.runTestCases() should reject.");
ProtocolTest.expectThat(asyncTeardownExplicitFailureTestSuiteDidEvaluate, "Promise did evaluate the async teardown function.");
ProtocolTest.expectEqual(e, "AsyncFunctionFailure Exception Message", "Rejected value should be thrown exception.");
return Promise.resolve(); // Continue this test.
});
let asyncTeardownRuntimeFailureTestSuiteDidEvaluate = false;
let asyncTeardownRuntimeFailureTestSuite = ProtocolTest.createAsyncSuite("AsyncTestSuite.AsyncTeardownRuntimeFailure");
asyncTeardownRuntimeFailureTestSuite.addTestCase({
name: "AsyncFunctionFailure",
description: "Check that an async suite with an async teardown function that throws with a runtime error will reject",
async test() { return true; },
async teardown() {
asyncTeardownRuntimeFailureTestSuiteDidEvaluate = true;
({}).x.x.x;
},
});
result = result.then(() => {
return asyncTeardownRuntimeFailureTestSuite.runTestCases();
}).then(function resolve() {
ProtocolTest.fail("Promise from asyncTeardownRuntimeFailureTestSuite.runTestCases() should reject.");
return Promise.resolve(); // Continue this test.
}, function rejected(e) {
ProtocolTest.pass("Promise from asyncTeardownRuntimeFailureTestSuite.runTestCases() should reject.");
ProtocolTest.expectThat(asyncTeardownRuntimeFailureTestSuiteDidEvaluate, "Promise did evaluate the async teardown function.");
ProtocolTest.expectThat(e instanceof TypeError, "Rejected value should be a runtime exception.");
return Promise.resolve(); // Continue this test.
});
// This will finish the test whether the chain was resolved or rejected.
result = result.then(() => { ProtocolTest.completeTest(); });
}
</script>
</head>
<body onLoad="runTest()">
</body>
</html>