<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script>
function test()
{
    ProtocolTest.suppressStackTraces = true;

    ProtocolTest.expectException(() => {
        new SyncTestSuite(this);
    });

    ProtocolTest.expectException(() => {
        new SyncTestSuite(this, {});
    });

    ProtocolTest.expectException(() => {
        new SyncTestSuite(this, "      ");
    });

    ProtocolTest.expectException(() => {
        new SyncTestSuite("something", {});
    });

    let badArgsSuite = ProtocolTest.createSyncSuite("dummy");
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase();
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase("string");
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase({
            name: {},
            test() {
                return true;
            },
        });
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase({
            name: "        ",
            test() {
            },
        });
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase({
            name: "foo",
            test: null,
        });
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase({
            name: "foo",
            test() {
            },
            setup: "astd"
        });
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase({
            name: "foo",
            test() {
            },
            setup: 123
        });
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase({
            name: "foo",
            test() {
            },
            setup: Promise.resolve()
        });
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase({
            name: "foo",
            test() {
            },
            teardown: "astd"
        });
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase({
            name: "foo",
            test() {
            },
            teardown: 123
        });
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase({
            name: "foo",
            test() {
            },
            teardown: Promise.resolve()
        });
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase({
            name: "foo",
            async test() {
            },
        });
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase({
            name: "foo",
            async setup() {
            },
            test() {
            },
        });
    });
    ProtocolTest.expectException(() => {
        badArgsSuite.addTestCase({
            name: "foo",
            test() {
            },
            async teardown() {
            },
        });
    });

    ProtocolTest.expectException(() => {
        let runEmptySuite = ProtocolTest.createSyncSuite("SyncTestSuite.RunEmptySuite");
        runEmptySuite.runTestCases();
    });

    let runTwiceSuite = ProtocolTest.createSyncSuite("SyncTestSuite.RunTwiceSuite");
    runTwiceSuite.addTestCase({
        name: "DummyTest0",
        test() {
            return true;
        },
    });

    ProtocolTest.expectThat(runTwiceSuite.runTestCases() === true, "Return value of runTwiceSuite.runTestCases() should be true when all tests pass.");

    ProtocolTest.expectException(() => {
        runTwiceSuite.runTestCases();
    });

    function checkResult(suite, expectedCounts) {
        ProtocolTest.expectThat(suite.runTestCases(), `Return value of ${suite.name}.runTestCases() should be true even if a test case fails.`);
        ProtocolTest.expectEqual(expectedCounts.runCount, suite.runCount, `${suite.name} should have executed ${expectedCounts.runCount} tests.`);
        ProtocolTest.expectEqual(expectedCounts.passCount, suite.passCount, `${suite.name} should have passed ${expectedCounts.passCount} tests.`);
        ProtocolTest.expectEqual(expectedCounts.failCount, suite.failCount, `${suite.name} should have failed ${expectedCounts.failCount} tests.`);
        ProtocolTest.expectEqual(expectedCounts.skipCount, suite.skipCount, `${suite.name} should have skipped ${expectedCounts.skipCount} tests.`);
    }

    let thrownError = new Error({"token": 666});

    let sequentialExecutionPhase = 0;
    let sequentialExecutionSuite = ProtocolTest.createSyncSuite("SyncTestSuite.SequentialExecution");
    sequentialExecutionSuite.addTestCase({
        name: "1 (Pass)",
        test() {
            ProtocolTest.assert(sequentialExecutionPhase === 0);
            sequentialExecutionPhase = 1;
            return true;
        },
    });
    sequentialExecutionSuite.addTestCase({
        name: "2 (Pass)",
        test() {
            ProtocolTest.assert(sequentialExecutionPhase === 1);
            sequentialExecutionPhase = 2;
            return true;
        },
    });
    sequentialExecutionSuite.addTestCase({
        name: "3 (Pass)",
        test() {
            ProtocolTest.assert(sequentialExecutionPhase === 2);
            sequentialExecutionPhase = 3;
            return true;
        },
    });
    sequentialExecutionSuite.addTestCase({
        name: "4 (Pass)",
        test() {
            ProtocolTest.assert(sequentialExecutionPhase === 3);
            sequentialExecutionPhase = 4;
            return true;
        },
    });
    checkResult(sequentialExecutionSuite, {
        runCount: 4,
        passCount: 4,
        failCount: 0,
        skipCount: 0,
    });

    let continueOnFailureSuite = ProtocolTest.createSyncSuite("SyncTestSuite.ContinueOnFailure");
    continueOnFailureSuite.addTestCase({
        name: "1 (Pass)",
        test() {
            return true;
        },
    });
    continueOnFailureSuite.addTestCase({
        name: "2 (Fail)",
        test() {
            ProtocolTest.log("Throwing...");
            throw {x: "ContinueOnFailure throw"};
        },
    });
    continueOnFailureSuite.addTestCase({
        name: "3 (Pass)",
        test() {
            return true;
        },
    });
    continueOnFailureSuite.addTestCase({
        name: "4 (Fail)",
        test() {
            ProtocolTest.log("Failing...");
            return false;
        },
    });
    checkResult(continueOnFailureSuite, {
        runCount: 4,
        passCount: 2,
        failCount: 2,
        skipCount: 0,
    });

    let setupAndTeardownPhase = 0;
    let setupAndTeardownSuite = ProtocolTest.createSyncSuite("SyncTestSuite.SetupAndTeardown");
    setupAndTeardownSuite.addTestCase({
        name: "TestWithSetupAndTeardown",
        setup() {
            ProtocolTest.assert(setupAndTeardownPhase === 0);
            setupAndTeardownPhase = 1;
            return true;
        },
        test() {
            ProtocolTest.assert(setupAndTeardownPhase === 1);
            setupAndTeardownPhase = 2;
            return true;
        },
        teardown() {
            ProtocolTest.assert(setupAndTeardownPhase === 2);
            setupAndTeardownPhase = 3;
            return true;
        },
    });
    setupAndTeardownSuite.addTestCase({
        name: "TestRunningAfterTeardown",
        test() {
            ProtocolTest.assert(setupAndTeardownPhase === 3);
            return true;
        },
    });
    checkResult(setupAndTeardownSuite, {
        runCount: 2,
        passCount: 2,
        failCount: 0,
        skipCount: 0,
    });

    
    let setupExceptionSuite = ProtocolTest.createSyncSuite("SyncTestSuite.SetupException");
    setupExceptionSuite.addTestCase({
        name: "TestWithExceptionDuringSetup",
        setup() {
            ProtocolTest.log("Throwing...");
            throw "SetupException throw";
        },
        test() {
            ProtocolTest.fail("Test should not execute if its setup action threw an exception.");
            return false;
        },
        teardown() {
            ProtocolTest.fail("Teardown action should not execute if its setup action threw an exception.");
            return false;
        },
    });
    setupExceptionSuite.addTestCase({
        name: "TestAfterSetupException",
        setup() {
            ProtocolTest.pass("Setup action should still execute if previous test's setup action threw an exception.");
            return true;
        },
        test() {
            ProtocolTest.pass("Test should still execute if previous test's setup action threw an exception.");
            return true;
        },
        teardown() {
            ProtocolTest.pass("Teardown action should still execute if previous test's setup action threw an exception.");
            return true;
        },
    });
    checkResult(setupExceptionSuite, {
        runCount: 1,
        passCount: 1,
        failCount: 1,
        skipCount: 1,
    });

    let setupFailureSuite = ProtocolTest.createSyncSuite("SyncTestSuite.SetupFailure");
    setupFailureSuite.addTestCase({
        name: "TestWithFailureDuringSetup",
        setup() {
            ProtocolTest.log("Failing...");
            return false;
        },
        test() {
            ProtocolTest.fail("Test should not execute if its setup action failed.");
            return false;
        },
        teardown() {
            ProtocolTest.fail("Teardown action should not execute if its setup action failed.");
            return false;
        },
    });
    setupFailureSuite.addTestCase({
        name: "TestAfterSetupException",
        setup() {
            ProtocolTest.pass("Setup action should still execute if previous test's setup action failed.");
            return true;
        },
        test() {
            ProtocolTest.pass("Test should still execute if previous test's setup action failed.");
            return true;
        },
        teardown() {
            ProtocolTest.pass("Teardown action should still execute if previous test's setup action failed.");
            return true;
        },
    });
    checkResult(setupFailureSuite, {
        runCount: 1,
        passCount: 1,
        failCount: 1,
        skipCount: 1,
    });

    let teardownExceptionSuite = ProtocolTest.createSyncSuite("SyncTestSuite.TeardownException");
    teardownExceptionSuite.addTestCase({
        name: "TestWithExceptionDuringTeardown",
        test() {
            return true;
        },
        teardown() {
            ProtocolTest.log("Throwing...");
            throw "TeardownException throw";
        },
    });
    teardownExceptionSuite.addTestCase({
        name: "TestAfterTeardownException",
        setup() {
            ProtocolTest.pass("Setup action should still execute if previous test's teardown action threw an exception.");
            return true;
        },
        test() {
            ProtocolTest.pass("Test should still execute if previous test's teardown action threw an exception.");
            return true;
        },
        teardown() {
            ProtocolTest.pass("Teardown action should still execute if previous test's teardown action threw an exception.");
            return true;
        },
    });
    checkResult(teardownExceptionSuite, {
        runCount: 2,
        passCount: 1,
        failCount: 1,
        skipCount: 0,
    });

    let teardownFailureSuite = ProtocolTest.createSyncSuite("SyncTestSuite.TeardownFailure");
    teardownFailureSuite.addTestCase({
        name: "TestWithExceptionDuringTeardown",
        test() {
            return true;
        },
        teardown() {
            ProtocolTest.log("Failing...");
            return false;
        },
    });
    teardownFailureSuite.addTestCase({
        name: "TestAfterTeardownException",
        setup() {
            ProtocolTest.pass("Setup action should still execute if previous test's teardown action failed.");
            return true;
        },
        test() {
            ProtocolTest.pass("Test should still execute if previous test's teardown action failed.");
            return true;
        },
        teardown() {
            ProtocolTest.pass("Teardown action should still execute if previous test's teardown action failed.");
            return true;
        },
    });
    checkResult(teardownFailureSuite, {
        runCount: 2,
        passCount: 1,
        failCount: 1,
        skipCount: 0,
    });

    ProtocolTest.completeTest();
}
</script>
</head>
<body onLoad="runTest()">
</body>
</html>
