OLD | NEW |
(Empty) | |
| 1 (function() { |
| 2 // Test is initiated from body.onload, so explicit done() call is required. |
| 3 setup({ explicit_done: true }); |
| 4 |
| 5 function checkSubtreeExpectedValues(t, parent, prefix) |
| 6 { |
| 7 var checkedLayout = checkExpectedValues(t, parent, prefix); |
| 8 Array.prototype.forEach.call(parent.childNodes, function(node) { |
| 9 checkedLayout |= checkSubtreeExpectedValues(t, node, prefix); |
| 10 }); |
| 11 return checkedLayout; |
| 12 } |
| 13 |
| 14 function checkAttribute(output, node, attribute) |
| 15 { |
| 16 var result = node.getAttribute && node.getAttribute(attribute); |
| 17 output.checked |= !!result; |
| 18 return result; |
| 19 } |
| 20 |
| 21 function assert_tolerance(actual, expected, message) |
| 22 { |
| 23 if (isNaN(expected) || Math.abs(actual - expected) >= 1) { |
| 24 assert_equals(actual, Number(expected), message); |
| 25 } |
| 26 } |
| 27 |
| 28 function checkExpectedValues(t, node, prefix) |
| 29 { |
| 30 var output = { checked: false }; |
| 31 |
| 32 var expectedWidth = checkAttribute(output, node, "data-expected-width"); |
| 33 if (expectedWidth) { |
| 34 assert_tolerance(node.offsetWidth, expectedWidth, prefix + "width"); |
| 35 } |
| 36 |
| 37 var expectedHeight = checkAttribute(output, node, "data-expected-height"); |
| 38 if (expectedHeight) { |
| 39 assert_tolerance(node.offsetHeight, expectedHeight, prefix + "height"); |
| 40 } |
| 41 |
| 42 var expectedOffset = checkAttribute(output, node, "data-offset-x"); |
| 43 if (expectedOffset) { |
| 44 assert_tolerance(node.offsetLeft, expectedOffset, prefix + "offsetLeft")
; |
| 45 } |
| 46 |
| 47 var expectedOffset = checkAttribute(output, node, "data-offset-y"); |
| 48 if (expectedOffset) { |
| 49 assert_tolerance(node.offsetTop, expectedOffset, prefix + "offsetTop"); |
| 50 } |
| 51 |
| 52 var expectedWidth = checkAttribute(output, node, "data-expected-client-width
"); |
| 53 if (expectedWidth) { |
| 54 assert_tolerance(node.clientWidth, expectedWidth, prefix + "clientWidth"
); |
| 55 } |
| 56 |
| 57 var expectedHeight = checkAttribute(output, node, "data-expected-client-heig
ht"); |
| 58 if (expectedHeight) { |
| 59 assert_tolerance(node.clientHeight, expectedHeight, prefix + "clientHeig
ht"); |
| 60 } |
| 61 |
| 62 var expectedWidth = checkAttribute(output, node, "data-expected-scroll-width
"); |
| 63 if (expectedWidth) { |
| 64 assert_tolerance(node.scrollWidth, expectedWidth, prefix + "scrollWidth"
); |
| 65 } |
| 66 |
| 67 var expectedHeight = checkAttribute(output, node, "data-expected-scroll-heig
ht"); |
| 68 if (expectedHeight) { |
| 69 assert_tolerance(node.scrollHeight, expectedHeight, prefix + "scrollHeig
ht"); |
| 70 } |
| 71 |
| 72 var expectedWidth = checkAttribute(output, node, "data-expected-bounding-cli
ent-rect-width"); |
| 73 if (expectedWidth) { |
| 74 assert_tolerance(node.getBoundingClientRect().width, expectedWidth, pref
ix + "getBoundingClientRect().width"); |
| 75 } |
| 76 |
| 77 var expectedOffset = checkAttribute(output, node, "data-total-x"); |
| 78 if (expectedOffset) { |
| 79 var totalLeft = node.clientLeft + node.offsetLeft; |
| 80 assert_tolerance(totalLeft, expectedOffset, prefix + |
| 81 "clientLeft+offsetLeft (" + node.clientLeft + " + " + n
ode.offsetLeft + ")"); |
| 82 } |
| 83 |
| 84 var expectedOffset = checkAttribute(output, node, "data-total-y"); |
| 85 if (expectedOffset) { |
| 86 var totalTop = node.clientTop + node.offsetTop; |
| 87 assert_tolerance(totalTop, expectedOffset, prefix + |
| 88 "clientTop+offsetTop (" + node.clientTop + " + " + node
.offsetTop + ")"); |
| 89 } |
| 90 |
| 91 var expectedDisplay = checkAttribute(output, node, "data-expected-display"); |
| 92 if (expectedDisplay) { |
| 93 var actualDisplay = getComputedStyle(node).display; |
| 94 assert_equals(actualDisplay, expectedDisplay, prefix + "display"); |
| 95 } |
| 96 |
| 97 var expectedPaddingTop = checkAttribute(output, node, "data-expected-padding
-top"); |
| 98 if (expectedPaddingTop) { |
| 99 var actualPaddingTop = getComputedStyle(node).paddingTop; |
| 100 // Trim the unit "px" from the output. |
| 101 actualPaddingTop = actualPaddingTop.slice(0, -2); |
| 102 assert_equals(actualPaddingTop, expectedPaddingTop, prefix + "padding-to
p"); |
| 103 } |
| 104 |
| 105 var expectedPaddingBottom = checkAttribute(output, node, "data-expected-padd
ing-bottom"); |
| 106 if (expectedPaddingBottom) { |
| 107 var actualPaddingBottom = getComputedStyle(node).paddingBottom; |
| 108 // Trim the unit "px" from the output. |
| 109 actualPaddingBottom = actualPaddingBottom.slice(0, -2); |
| 110 assert_equals(actualPaddingBottom, expectedPaddingBottom, prefix + "padd
ing-bottom"); |
| 111 } |
| 112 |
| 113 var expectedPaddingLeft = checkAttribute(output, node, "data-expected-paddin
g-left"); |
| 114 if (expectedPaddingLeft) { |
| 115 var actualPaddingLeft = getComputedStyle(node).paddingLeft; |
| 116 // Trim the unit "px" from the output. |
| 117 actualPaddingLeft = actualPaddingLeft.slice(0, -2); |
| 118 assert_equals(actualPaddingLeft, expectedPaddingLeft, prefix + "padding-
left"); |
| 119 } |
| 120 |
| 121 var expectedPaddingRight = checkAttribute(output, node, "data-expected-paddi
ng-right"); |
| 122 if (expectedPaddingRight) { |
| 123 var actualPaddingRight = getComputedStyle(node).paddingRight; |
| 124 // Trim the unit "px" from the output. |
| 125 actualPaddingRight = actualPaddingRight.slice(0, -2); |
| 126 assert_equals(actualPaddingRight, expectedPaddingRight, prefix + "paddin
g-right"); |
| 127 } |
| 128 |
| 129 var expectedMarginTop = checkAttribute(output, node, "data-expected-margin-t
op"); |
| 130 if (expectedMarginTop) { |
| 131 var actualMarginTop = getComputedStyle(node).marginTop; |
| 132 // Trim the unit "px" from the output. |
| 133 actualMarginTop = actualMarginTop.slice(0, -2); |
| 134 assert_equals(actualMarginTop, expectedMarginTop, prefix + "margin-top")
; |
| 135 } |
| 136 |
| 137 var expectedMarginBottom = checkAttribute(output, node, "data-expected-margi
n-bottom"); |
| 138 if (expectedMarginBottom) { |
| 139 var actualMarginBottom = getComputedStyle(node).marginBottom; |
| 140 // Trim the unit "px" from the output. |
| 141 actualMarginBottom = actualMarginBottom.slice(0, -2); |
| 142 assert_equals(actualMarginBottom, expectedMarginBottom, prefix + "margin
-bottom"); |
| 143 } |
| 144 |
| 145 var expectedMarginLeft = checkAttribute(output, node, "data-expected-margin-
left"); |
| 146 if (expectedMarginLeft) { |
| 147 var actualMarginLeft = getComputedStyle(node).marginLeft; |
| 148 // Trim the unit "px" from the output. |
| 149 actualMarginLeft = actualMarginLeft.slice(0, -2); |
| 150 assert_equals(actualMarginLeft, expectedMarginLeft, prefix + "margin-lef
t"); |
| 151 } |
| 152 |
| 153 var expectedMarginRight = checkAttribute(output, node, "data-expected-margin
-right"); |
| 154 if (expectedMarginRight) { |
| 155 var actualMarginRight = getComputedStyle(node).marginRight; |
| 156 // Trim the unit "px" from the output. |
| 157 actualMarginRight = actualMarginRight.slice(0, -2); |
| 158 assert_equals(actualMarginRight, expectedMarginRight, prefix + "margin-r
ight"); |
| 159 } |
| 160 |
| 161 return output.checked; |
| 162 } |
| 163 |
| 164 window.checkLayout = function(selectorList, outputContainer) |
| 165 { |
| 166 if (!selectorList) { |
| 167 console.error("You must provide a CSS selector of nodes to check."); |
| 168 return; |
| 169 } |
| 170 var nodes = document.querySelectorAll(selectorList); |
| 171 var testNumber = 0; |
| 172 nodes = Array.prototype.slice.call(nodes); |
| 173 nodes.reverse(); |
| 174 var checkedLayout = false; |
| 175 Array.prototype.forEach.call(nodes, function(node) { |
| 176 test(function(t) { |
| 177 var container = node.parentNode.className == 'container' ? node.pare
ntNode : node; |
| 178 var prefix = "\n" + container.outerHTML + "\n"; |
| 179 var passed = false; |
| 180 try { |
| 181 checkedLayout |= checkExpectedValues(t, node.parentNode, prefix)
; |
| 182 checkedLayout |= checkSubtreeExpectedValues(t, node, prefix); |
| 183 passed = true; |
| 184 } finally { |
| 185 checkedLayout |= !passed; |
| 186 } |
| 187 }, selectorList + ' ' + String(++testNumber)); |
| 188 }); |
| 189 if (!checkedLayout) { |
| 190 console.error("No valid data-* attributes found in selector list : " + s
electorList); |
| 191 } |
| 192 done(); |
| 193 }; |
| 194 |
| 195 })(); |
OLD | NEW |