<!doctype html>
<title>Selection.removeAllRanges()/empty() tests</title>
<div id=log></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script src=common.js></script>
<script>
"use strict";

// Also test a selection with no ranges
testRanges.unshift("[]");

var range = rangeFromEndpoints([paras[0].firstChild, 0, paras[0].firstChild, 1]);

function testRange(rangeDesc, method) {
    test(function() {
        setSelectionForwards(eval(rangeDesc));
        selection[method]();
        assert_equals(selection.rangeCount, 0,
            "After " + method + "(), rangeCount must be 0");
        // Test that it's forwards
        selection.addRange(range);
        assert_equals(selection.anchorOffset, selection.getRangeAt(0).startOffset,
            "After " + method + "(), addRange() must be forwards, so anchorOffset must equal startOffset rather than endOffset");
        assert_equals(selection.focusOffset, selection.getRangeAt(0).endOffset,
            "After " + method + "(), addRange() must be forwards, so focusOffset must equal endOffset rather than startOffset");
    }, method + " on " + rangeDesc + " forwards");

    // Copy-pasted from above
    test(function() {
        setSelectionBackwards(eval(rangeDesc));
        selection[method]();
        assert_equals(selection.rangeCount, 0,
            "After " + method + "(), rangeCount must be 0");
        // Test that it's forwards
        selection.addRange(range);
        assert_equals(selection.anchorOffset, selection.getRangeAt(0).startOffset,
            "After " + method + "(), addRange() must be forwards, so anchorOffset must equal startOffset rather than endOffset");
        assert_equals(selection.focusOffset, selection.getRangeAt(0).endOffset,
            "After " + method + "(), addRange() must be forwards, so focusOffset must equal endOffset rather than startOffset");
    }, method + " on " + rangeDesc + " backwards");
}

for (var i = 0; i < testRanges.length; i++) {
  testRange(testRanges[i], "removeAllRanges");
  testRange(testRanges[i], "empty");
}

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