<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test.js"></script>
</head>
<body>
<div id="test">a    <span>    </span>    <span>    </span>    b</div>
<div id="console"></div>
<script>

if (!window.internals)
    testFailed("This test requires internals object");

debug("");

let container = document.getElementById("test");

function test(description, rangeToSelect) {
    let selection = window.getSelection();
    selection.removeAllRanges();
    selection.addRange(rangeToSelect);

    debug(description);

    [
        [ ],
        [ "IgnoresWhiteSpaceAtEndOfRun" ],
    ].forEach((behaviors) => {
        debug("  " + (behaviors.join("|") || "Default behavior"));
        for (let {text, range} of internals.statesOfTextIterator(rangeToSelect, behaviors))
            debug(`    '${text.replace("\n", "\\n")}' (location ${internals.locationFromRange(container, range, behaviors)} length ${internals.lengthFromRange(container, range, behaviors)})`);
    });

    debug("");
}

let rangeOfFirstLetter = document.createRange();
rangeOfFirstLetter.setStart(container.firstChild, 0);
rangeOfFirstLetter.setEnd(container.firstChild, 1);

container.style.width = "1ch";
test("Testing first letter with narrow width...", rangeOfFirstLetter);

container.style.width = "";
test("Testing first letter with wide width...", rangeOfFirstLetter);

let rangeUntilLastLetter = document.createRange();
rangeUntilLastLetter.setStart(container.firstChild, 0);
rangeUntilLastLetter.setEnd(container.lastChild, 4);

container.style.width = "1ch";
test("Testing everything except last letter with narrow width...", rangeUntilLastLetter);

container.style.width = "";
test("Testing everything except last letter with wide width...", rangeUntilLastLetter);

let rangeOfNode = document.createRange();
rangeOfNode.selectNode(container);

container.style.width = "1ch";
test("Testing everything with narrow width...", rangeOfNode);

container.style.width = "";
test("Testing everything with wide width...", rangeOfNode);

</script>
</body>
</html>
