Revision 7efc1fe4f0c85c8b1fdc98fe5c53af690d2122af authored by Anne van Kesteren on 24 May 2016, 13:07:58 UTC, committed by Anne van Kesteren on 24 May 2016, 13:07:58 UTC
1 parent c0b620d
Raw File
addRange.html
<!doctype html>
<title>Selection.addRange() tests</title>
<div id=log></div>
<meta name="timeout" content="long">
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=common.js></script>
<script>
"use strict";

function testAddRange(exception, range, endpoints, qualifier, testName) {
    test(function() {
        assert_equals(exception, null, "Test setup must not throw exceptions");

        selection.addRange(range);

        assert_equals(range.startContainer, endpoints[0],
            "addRange() must not modify the startContainer of the Range it's given");
        assert_equals(range.startOffset, endpoints[1],
            "addRange() must not modify the startOffset of the Range it's given");
        assert_equals(range.endContainer, endpoints[2],
            "addRange() must not modify the endContainer of the Range it's given");
        assert_equals(range.endOffset, endpoints[3],
            "addRange() must not modify the endOffset of the Range it's given");
    }, testName + ": " + qualifier + " addRange() must not throw exceptions or modify the range it's given");

    test(function() {
        assert_equals(exception, null, "Test setup must not throw exceptions");

        assert_equals(selection.rangeCount, 1, "rangeCount must be 1");
    }, testName + ": " + qualifier + " addRange() must result in rangeCount being 1");

    // From here on out we check selection.getRangeAt(selection.rangeCount - 1)
    // so as not to double-fail Gecko.

    test(function() {
        assert_equals(exception, null, "Test setup must not throw exceptions");
        assert_not_equals(selection.rangeCount, 0, "Cannot proceed with tests if rangeCount is 0");

        var newRange = selection.getRangeAt(selection.rangeCount - 1);

        assert_not_equals(newRange, null,
            "getRangeAt(rangeCount - 1) must not return null");
        assert_equals(typeof newRange, "object",
            "getRangeAt(rangeCount - 1) must return an object");

        assert_equals(newRange.startContainer, range.startContainer,
            "startContainer of the Selection's last Range must match the added Range");
        assert_equals(newRange.startOffset, range.startOffset,
            "startOffset of the Selection's last Range must match the added Range");
        assert_equals(newRange.endContainer, range.endContainer,
            "endContainer of the Selection's last Range must match the added Range");
        assert_equals(newRange.endOffset, range.endOffset,
            "endOffset of the Selection's last Range must match the added Range");
    }, testName + ": " + qualifier + " addRange() must result in the selection's last range having the specified endpoints");

    test(function() {
        assert_equals(exception, null, "Test setup must not throw exceptions");
        assert_not_equals(selection.rangeCount, 0, "Cannot proceed with tests if rangeCount is 0");

        assert_equals(selection.getRangeAt(selection.rangeCount - 1), range,
            "getRangeAt(rangeCount - 1) must return the same object we added");
    }, testName + ": " + qualifier + " addRange() must result in the selection's last range being the same object we added");

    // Let's not test many different modifications -- one should be enough.
    test(function() {
        assert_equals(exception, null, "Test setup must not throw exceptions");
        assert_not_equals(selection.rangeCount, 0, "Cannot proceed with tests if rangeCount is 0");

        if (range.startContainer == paras[0].firstChild
        && range.startOffset == 0
        && range.endContainer == paras[0].firstChild
        && range.endOffset == 2) {
            // Just in case . . .
            range.setStart(paras[0].firstChild, 1);
        } else {
            range.setStart(paras[0].firstChild, 0);
            range.setEnd(paras[0].firstChild, 2);
        }

        var newRange = selection.getRangeAt(selection.rangeCount - 1);

        assert_equals(newRange.startContainer, range.startContainer,
            "After mutating the " + qualifier + " added Range, startContainer of the Selection's last Range must match the added Range");
        assert_equals(newRange.startOffset, range.startOffset,
            "After mutating the " + qualifier + " added Range, startOffset of the Selection's last Range must match the added Range");
        assert_equals(newRange.endContainer, range.endContainer,
            "After mutating the " + qualifier + " added Range, endContainer of the Selection's last Range must match the added Range");
        assert_equals(newRange.endOffset, range.endOffset,
            "After mutating the " + qualifier + " added Range, endOffset of the Selection's last Range must match the added Range");
    }, testName + ": modifying the " + qualifier + " added range must modify the Selection's last Range");

    // Now test the other way too.
    test(function() {
        assert_equals(exception, null, "Test setup must not throw exceptions");
        assert_not_equals(selection.rangeCount, 0, "Cannot proceed with tests if rangeCount is 0");

        var newRange = selection.getRangeAt(selection.rangeCount - 1);

        if (newRange.startContainer == paras[0].firstChild
        && newRange.startOffset == 4
        && newRange.endContainer == paras[0].firstChild
        && newRange.endOffset == 6) {
            newRange.setStart(paras[0].firstChild, 5);
        } else {
            newRange.setStart(paras[0].firstChild, 4);
            newRange.setStart(paras[0].firstChild, 6);
        }

        assert_equals(newRange.startContainer, range.startContainer,
            "After " + qualifier + " addRange(), after mutating the Selection's last Range, startContainer of the Selection's last Range must match the added Range");
        assert_equals(newRange.startOffset, range.startOffset,
            "After " + qualifier + " addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range");
        assert_equals(newRange.endContainer, range.endContainer,
            "After " + qualifier + " addRange(), after mutating the Selection's last Range, endContainer of the Selection's last Range must match the added Range");
        assert_equals(newRange.endOffset, range.endOffset,
            "After " + qualifier + " addRange(), after mutating the Selection's last Range, endOffset of the Selection's last Range must match the added Range");
    }, testName + ": modifying the Selection's last Range must modify the " + qualifier + " added Range");
}

// Do only n evals, not n^2
var testRangesEvaled = testRanges.map(eval);

for (var i = 0; i < testRanges.length; i++) {
    for (var j = 0; j < testRanges.length; j++) {
        var testName = "Range " + i + " " + testRanges[i]
            + " followed by Range " + j + " " + testRanges[j];

        var exception = null;
        try {
            selection.removeAllRanges();

            var endpoints1 = testRangesEvaled[i];
            var range1 = ownerDocument(endpoints1[0]).createRange();
            range1.setStart(endpoints1[0], endpoints1[1]);
            range1.setEnd(endpoints1[2], endpoints1[3]);

            if (range1.startContainer !== endpoints1[0]) {
                throw "Sanity check: the first Range we created must have the desired startContainer";
            }
            if (range1.startOffset !== endpoints1[1]) {
                throw "Sanity check: the first Range we created must have the desired startOffset";
            }
            if (range1.endContainer !== endpoints1[2]) {
                throw "Sanity check: the first Range we created must have the desired endContainer";
            }
            if (range1.endOffset !== endpoints1[3]) {
                throw "Sanity check: the first Range we created must have the desired endOffset";
            }

            var endpoints2 = testRangesEvaled[j];
            var range2 = ownerDocument(endpoints2[0]).createRange();
            range2.setStart(endpoints2[0], endpoints2[1]);
            range2.setEnd(endpoints2[2], endpoints2[3]);

            if (range2.startContainer !== endpoints2[0]) {
                throw "Sanity check: the second Range we created must have the desired startContainer";
            }
            if (range2.startOffset !== endpoints2[1]) {
                throw "Sanity check: the second Range we created must have the desired startOffset";
            }
            if (range2.endContainer !== endpoints2[2]) {
                throw "Sanity check: the second Range we created must have the desired endContainer";
            }
            if (range2.endOffset !== endpoints2[3]) {
                throw "Sanity check: the second Range we created must have the desired endOffset";
            }
        } catch (e) {
            exception = e;
        }

        testAddRange(exception, range1, endpoints1, "first", testName);
        testAddRange(exception, range2, endpoints2, "second", testName);
    }
}

testDiv.style.display = "none";
</script>
back to top