<!DOCTYPE html>
<html>
<head>
<style>
iframe {
    border: 0px;
}
</style>
<script>
let testFiles = [
    "simple-incremental-layout-with-static-content.html",
    "relative-simple.html",
    "relative-bottom.html",
    "relative-right.html",
    "relative-auto.html",
    "relative-auto-with-parent-offset.html",
    "relative-position-when-containing-block-is-not-in-the-formatting-context.html",
    "relative-siblings.html",
    "padding-simple.html",
    "padding-nested.html",
    "border-simple.html",
    "margin-simple.html",
    "margin-sibling-collapse-propagated.html",
    "margin-propagation-simple-content-height.html",
    "margin-left-right-sizing.html",
    "margin-left-right-sizing-out-of-flow.html",
    "margin-collapse-with-block-formatting-context2.html",
    "margin-collapse-with-block-formatting-context.html",
    "margin-collapse-when-child-has-padding-border.html",
    "margin-collapse-top-nested.html",
    "margin-collapse-simple.html",
    "margin-collapse-first-last-are-floating.html",
    "margin-collapse-bottom-nested.html",
    "margin-collapse-bottom-bottom.html",
    "absolute-auto-with-sibling-margin-bottom.html",
    "absolute-bottom.html",
    "absolute-height-stretch.html",
    "absolute-left-auto.html",
    "absolute-left-right-top-bottom-auto.html",
    "absolute-nested.html",
    "absolute-nested2.html",
    "absolute-simple.html",
    "absolute-width-shrink-to-fit.html",
    "absolute-width-stretch.html",
    "absolute-with-static-block-position-nested.html",
    "absolute-position-when-containing-block-is-not-in-the-formatting-context.html",
    "absolute-position-when-containing-block-is-not-in-the-formatting-context2.html",
    "fixed-nested.html",
    "floating-box-left-and-right-multiple.html",
    "floating-box-right-simple.html",
    "floating-left-right-simple.html",
    "floating-left-right-with-all-margins.html",
    "floating-multiple-lefts-in-body.html",
    "floating-multiple-lefts-multiple-lines.html",
    "floating-multiple-lefts.html",
    "floating-box-with-relative-positioned-sibling.html",
    "floating-lefts-and-rights-simple.html",
    "floating-with-new-block-formatting-context.html",
    "floating-box-clear-right-simple.html",
    "floating-box-with-clear-simple.html",
    "floating-box-with-clear-siblings.html",
    "floating-box-clear-both-simple.html",
    "almost-intruding-left-float-simple.html",
    "negative-margin-simple.html",
    "intruding-left-float-simple.html",
    "simple-inline-text.html",
    "simple-multiline-text.html",
    "inline-formatting-context-with-floats.html",
    "inline-with-floats-right-left-simple.html",
    "inline-formatting-context-with-floats2.html",
    "float-is-inside-inline-formatting-context-simple.html",
    "multiple-left-floats-on-line-simple.html",
    "multiple-left-floats-on-line-from-parent-formatting-context.html",
    "inline-with-floats-when-they-dont-fit.html",
    "inline-with-right-float-simple.html",
    "inline-with-right-floats2.html",
    "inline-with-right-floats3.html",
    "inline-content-simple2.html",
    "inline-floating1.html",
    "inline-formatting-context-floats1.html",
    "inline-formatting-context-floats2.html",
    "inline-with-padding-border-margin-offsets.html",
    "inline-block-with-fixed-width-height.html",
    "inline-with-relative-positioning.html",
    "inline-with-out-of-flow-descendant.html",
    "inline-simple-replaced.html"
];

let debugThis = [];

function addJS(fileName) {
    let script = document.currentScript.src;
    let imported = document.createElement('script');
    imported.src = fileName;
    document.head.appendChild(imported);
}

addJS("./TestHarness.js");
addJS("../Utils.js");
addJS("../Layout.js");
addJS("../TreeBuilder.js");
addJS("../LayoutState.js");
addJS("../LayoutTree/Box.js");
addJS("../LayoutTree/Container.js");
addJS("../LayoutTree/BlockContainer.js");
addJS("../LayoutTree/InlineContainer.js");
addJS("../LayoutTree/InlineBox.js");
addJS("../LayoutTree/Text.js");
addJS("../DisplayTree/Box.js");
addJS("../FormattingState/FormattingState.js");
addJS("../FormattingState/BlockFormattingState.js");
addJS("../FormattingState/InlineFormattingState.js");
addJS("../FormattingState/FloatingState.js");
addJS("../FormattingContext/FormattingContext.js");
addJS("../FormattingContext/FloatingContext.js");
addJS("../FormattingContext/BlockFormatting/BlockFormattingContext.js");
addJS("../FormattingContext/BlockFormatting/BlockMarginCollapse.js");
addJS("../FormattingContext/InlineFormatting/InlineFormattingContext.js");
addJS("../FormattingContext/InlineFormatting/Line.js");

let failedTests = new Array();

let isRunningAsyncTest = false;
let tests;
let testsPassed = 0;
let currentTestIndex = 0;
let subTests = 0;
let subTestPassed = true;
let layoutState = null;

function runAndVerifyLayout(window) {
    layoutState = runLayout(window, layoutState);
    return verifyLayout(window.simplifiedRenderTree);
}

class TestRunner {
    waitUntilDone() {
        isRunningAsyncTest = true;
    }

    notifyDone() {
        let testFrame = document.getElementById("testFrame");
        ASSERT(subTests);
        finishAndMoveToNextTest(subTestPassed);
    }

    forceLayout() {
        let testFrame = document.getElementById("testFrame");
        let needsLayoutRenderers = testFrame.contentWindow.collectRenderersWithNeedsLayout();
        testFrame.contentWindow.document.body.offsetWidth;
        if (layoutState) {
            // Finding box by id won't work unless this is ICB's layout state.
            ASSERT(!layoutState.rootContainer().parent());
            for (let rendererId of needsLayoutRenderers) {
                let layoutBox = Utils.layoutBoxById(rendererId, layoutState.rootContainer());
                layoutState.markNeedsLayout(layoutBox);
            }
        }
        let passed = runAndVerifyLayout(testFrame.contentWindow);
        ++subTests;
        if (!passed) {
            subTestPassed = false;
            if (failedTests.indexOf(currentTestIndex) == -1)
                failedTests.push(currentTestIndex);
        }
        printIntermediateResult();
    }

}

function printFinalResult() {
    let resultContent = "Number of tests: " + tests.length;
    resultContent += "<br><br>Passed: " + (tests.length - failedTests.length) + "<br>Failed: " + failedTests.length;
    if (failedTests.length > 0) {
        resultContent += "<br><br>Failed cases:"
        failedTests.forEach(function(item) {
            resultContent += "<br><a href=\"" + tests[item] + "\">" + tests[item] + "</a>";
        });
    }
    result.innerHTML = resultContent;
}

function printIntermediateResult() {
    let resultContent = "Testing..." + (currentTestIndex + 1) + (subTests > 0 ? "(" + subTests + ")" : "") + " out of " + tests.length;
    resultContent += "<br><br>Passed: " + testsPassed + "<br>Failed: " + failedTests.length;
    if (failedTests.length > 0) {
        resultContent += "<br><br>Failed cases:"
        failedTests.forEach(function(item) {
            resultContent += "<br><a href=\"" + tests[item] + "\">" + tests[item] + "</a>";
        });
    }
    result.innerHTML = resultContent;
}

function finishAndMoveToNextTest(passed) {
    let testFrame = document.getElementById("testFrame");
    testFrame.remove();
    initialContainingBlock = null;
    layoutState = null;
    subTests = 0;
    isRunningAsyncTest = false;
    if (passed)
        ++testsPassed;
    else if (failedTests.indexOf(currentTestIndex) == -1)
        failedTests.push(currentTestIndex);
    setTimeout(function() {
        if (currentTestIndex < tests.length - 1) {
            printIntermediateResult();
            ++currentTestIndex;
            runTest(tests);
            return;
        }
        printFinalResult();
    }, 0);
}

function runTest() {
    let iframe = document.createElement("iframe");
    iframe.src = tests[currentTestIndex];
    iframe.id = "testFrame";
    iframe.width = window.innerWidth;
    iframe.height = window.innerHeight;
    iframe.onload = function() {
        if (isRunningAsyncTest)
            return;
        let testFrame = document.getElementById("testFrame");
        let passed = runAndVerifyLayout(testFrame.contentWindow);
        finishAndMoveToNextTest(passed, tests);
    };
    document.body.appendChild(iframe);
    iframe.contentWindow.testRunner = new TestRunner();
}

function runTests() {
    tests = debugThis.length ? debugThis : testFiles;
    runTest();
}
</script>
</head>
<body onload="runTests()">
<pre id=result></pre>
</body>
</html>
