Range-compareBoundaryPoints.html (7113B)
1 <!doctype html> 2 <title>Range.compareBoundaryPoints() tests</title> 3 <link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name> 4 <meta name=timeout content=long> 5 6 <div id=log></div> 7 <script src=/resources/testharness.js></script> 8 <script src=/resources/testharnessreport.js></script> 9 <script src=../common.js></script> 10 <script> 11 "use strict"; 12 13 var testRangesCached = []; 14 testRangesCached.push(document.createRange()); 15 testRangesCached[0].detach(); 16 for (var i = 0; i < testRangesShort.length; i++) { 17 try { 18 testRangesCached.push(rangeFromEndpoints(eval(testRangesShort[i]))); 19 } catch(e) { 20 testRangesCached.push(null); 21 } 22 } 23 24 var testRangesCachedClones = []; 25 testRangesCachedClones.push(document.createRange()); 26 testRangesCachedClones[0].detach(); 27 for (var i = 1; i < testRangesCached.length; i++) { 28 if (testRangesCached[i]) { 29 testRangesCachedClones.push(testRangesCached[i].cloneRange()); 30 } else { 31 testRangesCachedClones.push(null); 32 } 33 } 34 35 // We want to run a whole bunch of extra tests with invalid "how" values (not 36 // 0-3), but it's excessive to run them for every single pair of ranges -- 37 // there are too many of them. So just run them for a handful of the tests. 38 var extraTests = [0, // detached 39 1 + testRanges.indexOf("[paras[0].firstChild, 2, paras[0].firstChild, 8]"), 40 1 + testRanges.indexOf("[paras[0].firstChild, 3, paras[3], 1]"), 41 1 + testRanges.indexOf("[testDiv, 0, comment, 5]"), 42 1 + testRanges.indexOf("[foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]")]; 43 44 for (var i = 0; i < testRangesCached.length; i++) { 45 var range1 = testRangesCached[i]; 46 var range1Desc = i + " " + (i == 0 ? "[detached]" : testRanges[i - 1]); 47 for (var j = 0; j <= testRangesCachedClones.length; j++) { 48 var range2; 49 var range2Desc; 50 if (j == testRangesCachedClones.length) { 51 range2 = range1; 52 range2Desc = "same as first range"; 53 } else { 54 range2 = testRangesCachedClones[j]; 55 range2Desc = j + " " + (j == 0 ? "[detached]" : testRanges[j - 1]); 56 } 57 58 var hows = [Range.START_TO_START, Range.START_TO_END, Range.END_TO_END, 59 Range.END_TO_START]; 60 if (extraTests.indexOf(i) != -1 && extraTests.indexOf(j) != -1) { 61 // TODO: Make some type of reusable utility function to do this 62 // work. 63 hows.push(-1, 4, 5, NaN, -0, +Infinity, -Infinity); 64 [65536, -65536, 65536*65536, 0.5, -0.5, -72.5].forEach(function(addend) { 65 hows.push(-1 + addend, 0 + addend, 1 + addend, 66 2 + addend, 3 + addend, 4 + addend); 67 }); 68 hows.forEach(function(how) { hows.push(String(how)) }); 69 hows.push("6.5536e4", null, undefined, true, false, "", "quasit"); 70 } 71 72 for (var k = 0; k < hows.length; k++) { 73 var how = hows[k]; 74 test(function() { 75 assert_not_equals(range1, null, 76 "Creating context range threw an exception"); 77 assert_not_equals(range2, null, 78 "Creating argument range threw an exception"); 79 80 // Convert how per WebIDL. TODO: Make some type of reusable 81 // utility function to do this work. 82 // "Let number be the result of calling ToNumber on the input 83 // argument." 84 var convertedHow = Number(how); 85 86 // "If number is NaN, +0, −0, +∞, or −∞, return +0." 87 if (isNaN(convertedHow) 88 || convertedHow == 0 89 || convertedHow == Infinity 90 || convertedHow == -Infinity) { 91 convertedHow = 0; 92 } else { 93 // "Let posInt be sign(number) * floor(abs(number))." 94 var posInt = (convertedHow < 0 ? -1 : 1) * Math.floor(Math.abs(convertedHow)); 95 96 // "Let int16bit be posInt modulo 2^16; that is, a finite 97 // integer value k of Number type with positive sign and 98 // less than 2^16 in magnitude such that the mathematical 99 // difference of posInt and k is mathematically an integer 100 // multiple of 2^16." 101 // 102 // "Return int16bit." 103 convertedHow = posInt % 65536; 104 if (convertedHow < 0) { 105 convertedHow += 65536; 106 } 107 } 108 109 // Now to the actual algorithm. 110 // "If how is not one of 111 // START_TO_START, 112 // START_TO_END, 113 // END_TO_END, and 114 // END_TO_START, 115 // throw a "NotSupportedError" exception and terminate these 116 // steps." 117 if (convertedHow != Range.START_TO_START 118 && convertedHow != Range.START_TO_END 119 && convertedHow != Range.END_TO_END 120 && convertedHow != Range.END_TO_START) { 121 assert_throws_dom("NOT_SUPPORTED_ERR", function() { 122 range1.compareBoundaryPoints(how, range2); 123 }, "NotSupportedError required if first parameter doesn't convert to 0-3 per WebIDL"); 124 return; 125 } 126 127 // "If context object's root is not the same as sourceRange's 128 // root, throw a "WrongDocumentError" exception and terminate 129 // these steps." 130 if (furthestAncestor(range1.startContainer) != furthestAncestor(range2.startContainer)) { 131 assert_throws_dom("WRONG_DOCUMENT_ERR", function() { 132 range1.compareBoundaryPoints(how, range2); 133 }, "WrongDocumentError required if the ranges don't share a root"); 134 return; 135 } 136 137 // "If how is: 138 // START_TO_START: 139 // Let this point be the context object's start. 140 // Let other point be sourceRange's start. 141 // START_TO_END: 142 // Let this point be the context object's end. 143 // Let other point be sourceRange's start. 144 // END_TO_END: 145 // Let this point be the context object's end. 146 // Let other point be sourceRange's end. 147 // END_TO_START: 148 // Let this point be the context object's start. 149 // Let other point be sourceRange's end." 150 var thisPoint = convertedHow == Range.START_TO_START || convertedHow == Range.END_TO_START 151 ? [range1.startContainer, range1.startOffset] 152 : [range1.endContainer, range1.endOffset]; 153 var otherPoint = convertedHow == Range.START_TO_START || convertedHow == Range.START_TO_END 154 ? [range2.startContainer, range2.startOffset] 155 : [range2.endContainer, range2.endOffset]; 156 157 // "If the position of this point relative to other point is 158 // before 159 // Return −1. 160 // equal 161 // Return 0. 162 // after 163 // Return 1." 164 var position = getPosition(thisPoint[0], thisPoint[1], otherPoint[0], otherPoint[1]); 165 var expected; 166 if (position == "before") { 167 expected = -1; 168 } else if (position == "equal") { 169 expected = 0; 170 } else if (position == "after") { 171 expected = 1; 172 } 173 174 assert_equals(range1.compareBoundaryPoints(how, range2), expected, 175 "Wrong return value"); 176 }, i + "," + j + "," + k + ": context range " + range1Desc + ", argument range " + range2Desc + ", how " + format_value(how)); 177 } 178 } 179 } 180 181 testDiv.style.display = "none"; 182 </script>