<!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) {
    var endpoints = eval(testRanges[i]);
    if (endpoints.length && (!isSelectableNode(endpoints[0]) ||
                             !isSelectableNode(endpoints[2]))) {
      return;
    }
    test(function() {
        setSelectionForwards(endpoints);
        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(endpoints);
        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>
