<!DOCTYPE html>
<html>
<head>
<style>
iframe {
    border: 0px;
}
</style>
<script>
let testFiles = [
    "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"
];

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/InitialBlockContainer.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("../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 = [];

function printResult(files, currentTestIndex) {
    let resultContent = currentTestIndex != null ? ("Testing..." + currentTestIndex + " out of " + files.length) : ("Number of tests: " + files.length) ;
    resultContent += "<br><br>Passed: " + ((currentTestIndex != null ? currentTestIndex : files.length) - failedTests.length) + "<br>Failed: " + failedTests.length;
    if (failedTests.length > 0) {
        resultContent += "<br><br>Failed cases:"
        failedTests.forEach(function(item) {
            resultContent += "<br><a href=\"" + files[item] + "\">" + files[item] + "</a>";
        });
    }
    result.innerHTML = resultContent;
}

function runTest(files, currentTestIndex) {
    printResult(files, currentTestIndex);
    let iframe = document.createElement("iframe");
    iframe.src = files[currentTestIndex];
    iframe.id = "testFrame";
    iframe.width = window.innerWidth;
    iframe.height = window.innerHeight;
    iframe.onload = function() {
        let testFrame = document.getElementById("testFrame");
        let passed = runLayout(testFrame.contentWindow);
        testFrame.remove();
        if (!passed)
            failedTests.push(currentTestIndex);
        setTimeout(function() {
            if (currentTestIndex < files.length - 1)
                runTest(files, ++currentTestIndex);
            else
                printResult(files);
        }, 0);
    };
    document.body.appendChild(iframe);
}

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