1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/content/tests/chrome/test_textbox_number.xul Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,353 @@ 1.4 +<?xml version="1.0"?> 1.5 +<?xml-stylesheet href="chrome://global/skin" type="text/css"?> 1.6 +<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?> 1.7 +<!-- 1.8 + XUL Widget Test for textbox type="number" 1.9 + --> 1.10 +<window title="Textbox type='number' test" width="500" height="600" 1.11 + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 1.12 + <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> 1.13 + <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script> 1.14 + 1.15 +<hbox> 1.16 + <textbox id="n1" type="number" size="4"/> 1.17 + <textbox id="n2" type="number" value="10" min="5" max="15" wraparound="true"/> 1.18 +</hbox> 1.19 +<hbox> 1.20 + <textbox id="n3" type="number" size="4" value="25" min="1" max="12" increment="3"/> 1.21 +</hbox> 1.22 +<hbox> 1.23 + <textbox id="n4" type="number" size="4" value="-2" min="-8" max="18"/> 1.24 + <textbox id="n5" type="number" value="-17" min="-10" max="-3"/> 1.25 +</hbox> 1.26 +<hbox> 1.27 + <textbox id="n6" type="number" size="4" value="9" min="12" max="8"/> 1.28 +</hbox> 1.29 +<hbox> 1.30 + <textbox id="n7" type="number" size="4" value="4.678" min="2" max="10.5" decimalplaces="2"/> 1.31 + <textbox id="n8" type="number" hidespinbuttons="true"/> 1.32 +</hbox> 1.33 +<hbox> 1.34 + <textbox id="n9" type="number" size="4" oninput="updateInputEventCount();"/> 1.35 +</hbox> 1.36 + 1.37 + <!-- test results are displayed in the html:body --> 1.38 + <body xmlns="http://www.w3.org/1999/xhtml" style="height: 300px; overflow: auto;"/> 1.39 + 1.40 + <!-- test code goes here --> 1.41 + <script type="application/javascript"><![CDATA[ 1.42 +SimpleTest.waitForExplicitFinish(); 1.43 + 1.44 +// ---- NOTE: the numbers used in these tests are carefully chosen to avoid 1.45 +// ---- floating point rounding issues 1.46 + 1.47 +function doTests() { 1.48 + var n1 = $("n1"); 1.49 + var n2 = $("n2"); 1.50 + var n3 = $("n3"); 1.51 + var n4 = $("n4"); 1.52 + var n5 = $("n5"); 1.53 + var n6 = $("n6"); 1.54 + var n7 = $("n7"); 1.55 + 1.56 + testValsMinMax(n1, "initial n1", 0, 0, Infinity); 1.57 + testValsMinMax(n2, "initial n2", 10, 5, 15); 1.58 + testValsMinMax(n3, "initial n3", 12, 1, 12); 1.59 + testValsMinMax(n4, "initial n4", -2, -8, 18); 1.60 + testValsMinMax(n5, "initial n5", -10, -10, -3); 1.61 + testValsMinMax(n6, "initial n6", 12, 12, 12); 1.62 + testValsMinMax(n7, "initial n7", 4.68, 2, 10.5); // value should be rounded 1.63 + 1.64 + ok(n1.spinButtons != null && n1.spinButtons.localName == "spinbuttons", "spinButtons set"); 1.65 + isnot(n1.decimalSymbol, "", "n1.decimalSymbol is set to something"); 1.66 + n1.decimalSymbol = "."; 1.67 + SimpleTest.ise(n1.decimalSymbol, ".", "n1.decimalSymbol set to '.'"); 1.68 + SimpleTest.ise(n1.wrapAround, false, "wrapAround defaults to false"); 1.69 + SimpleTest.ise(n1.increment, 1, "increment defaults to 1"); 1.70 + SimpleTest.ise(n1.decimalPlaces, 0, "decimalPlaces defaults to 0"); 1.71 + 1.72 + SimpleTest.ise(n2.wrapAround, true, "wrapAround when set to true"); 1.73 + SimpleTest.ise(n3.increment, 3, "increment when set to 1"); 1.74 + SimpleTest.ise(n7.decimalPlaces, 2, "decimalPlaces when set to 2"); 1.75 + 1.76 + // test changing the value 1.77 + n1.value = "1700"; 1.78 + testVals(n1, "set value,", 1700); 1.79 + n1.value = 1600; 1.80 + testVals(n1, "set value int,", 1600); 1.81 + n2.value = "2"; 1.82 + testVals(n2, "set value below min,", 5); 1.83 + n2.value = 2; 1.84 + testVals(n2, "set value below min int,", 5); 1.85 + n2.value = 18; 1.86 + testVals(n2, "set value above max,", 15); 1.87 + n2.value = -6; 1.88 + testVals(n2, "set value below min negative,", 5); 1.89 + n5.value = -2; 1.90 + testVals(n5, "set value above max positive,", -3); 1.91 + n7.value = 5.999; 1.92 + testVals(n7, "set value to decimal,", 6, "6.00"); 1.93 + n7.value = "1.42"; 1.94 + testVals(n7, "set value to decimal below min,", 2.00, "2.00"); 1.95 + n7.value = 24.1; 1.96 + testVals(n7, "set value to decimal above max,", 10.5, "10.50"); 1.97 + n1.value = 4.75; 1.98 + testVals(n1, "set value to decimal round,", 5); 1.99 + 1.100 + // test changing the valueNumber 1.101 + n1.valueNumber = 27; 1.102 + testVals(n1, "set valueNumber,", 27); 1.103 + n2.valueNumber = 1; 1.104 + testVals(n2, "set valueNumber below min,", 5); 1.105 + n2.valueNumber = 77; 1.106 + testVals(n2, "set valueNumber above max,", 15); 1.107 + n2.valueNumber = -5; 1.108 + testVals(n2, "set valueNumber below min negative,", 5); 1.109 + n5.valueNumber = -8; 1.110 + n5.valueNumber = -1; 1.111 + testVals(n5, "set valueNumber above max positive,", -3); 1.112 + n7.valueNumber = 8.23; 1.113 + testVals(n7, "set valueNumber to decimal,", 8.23); 1.114 + n7.valueNumber = 0.77; 1.115 + testVals(n7, "set valueNumber to decimal below min,", 2.00, "2.00"); 1.116 + n7.valueNumber = 29.157; 1.117 + testVals(n7, "set valueNumber to decimal above max,", 10.5, "10.50"); 1.118 + n1.value = 8.9; 1.119 + testVals(n1, "set valueNumber to decimal round,", 9); 1.120 + 1.121 + // test changing the min 1.122 + n1.value = 6; 1.123 + n1.min = 8; 1.124 + testValsMinMax(n1, "set integer min,", 8, 8, Infinity); 1.125 + n7.value = 5.5; 1.126 + n7.min = 6.7; 1.127 + testValsMinMax(n7, "set decimal min,", 6.7, 6.7, 10.5, "6.70"); 1.128 + 1.129 + // test changing the max 1.130 + n1.value = 25; 1.131 + n1.max = 22; 1.132 + testValsMinMax(n1, "set integer max,", 22, 8, 22); 1.133 + n7.value = 10.2; 1.134 + n7.max = 10.1; 1.135 + testValsMinMax(n7, "set decimal max,", 10.1, 6.7, 10.1, "10.10"); 1.136 + 1.137 + // test decrease() and increase() methods 1.138 + testIncreaseDecrease(n1, "integer", 1, 0, 8, 22); 1.139 + testIncreaseDecrease(n7, "decimal", 1, 2, 6.7, 10.1); 1.140 + testIncreaseDecrease(n3, "integer with increment", 3, 0, 1, 12); 1.141 + 1.142 + n7.min = 2.7; 1.143 + n7.value = 10.1; 1.144 + n7.increment = 4.3; 1.145 + SimpleTest.ise(n7.increment, 4.3, "increment changed"); 1.146 + testIncreaseDecrease(n7, "integer with increment", 4.3, 2, 2.7, 10.1); 1.147 + 1.148 + n2.value = n2.min; 1.149 + n2.decrease(); 1.150 + testVals(n2, "integer wraparound decrease method", n2.max); 1.151 + n2.increase(); 1.152 + testVals(n2, "integer wraparound decrease method", n2.min); 1.153 + 1.154 + n7.wrapAround = true; 1.155 + SimpleTest.ise(n7.wrapAround, true, "change wrapAround"); 1.156 + n7.value = n7.min + 0.01; 1.157 + n7.decrease(); 1.158 + testVals(n7, "decimal wraparound decrease method", n7.max, n7.max.toFixed(2)); 1.159 + n7.increase(); 1.160 + testVals(n7, "decimal wraparound decrease method", n7.min, n7.min.toFixed(2)); 1.161 + 1.162 + n1.value = 22; 1.163 + n1.decimalPlaces = 3; 1.164 + testVals(n1, "set decimalPlaces 3", 22, "22.000"); 1.165 + n1.value = 10.624; 1.166 + testVals(n1, "set decimalPlaces 3 set value,", 10.624); 1.167 + n1.decimalPlaces = 0; 1.168 + testVals(n1, "set decimalPlaces 0 set value,", 11); 1.169 + n1.decimalPlaces = Infinity; 1.170 + n1.value = 10.678123; 1.171 + testVals(n1, "set decimalPlaces Infinity set value,", 10.678123); 1.172 + 1.173 + n1.decimalSymbol = ","; 1.174 + SimpleTest.ise(n1.decimalSymbol, ",", "n1.decimalSymbol set to ','"); 1.175 + n1.value = "9.67"; 1.176 + testVals(n1, "set decimalPlaces set value,", 9.67); 1.177 + 1.178 + n1.decimalSymbol = "."; 1.179 + SimpleTest.ise(n1.decimalSymbol, ".", "n1.decimalSymbol set back to '.'"); 1.180 + n1.decimalPlaces = 0; 1.181 + 1.182 + // UI tests 1.183 + n1.min = 5; 1.184 + n1.max = 15; 1.185 + n1.value = 5; 1.186 + n1.focus(); 1.187 + 1.188 + var sb = n1.spinButtons; 1.189 + var sbbottom = sb.getBoundingClientRect().bottom - sb.getBoundingClientRect().top - 2; 1.190 + 1.191 + synthesizeKey("VK_UP", {}); 1.192 + testVals(n1, "key up", 6); 1.193 + 1.194 + synthesizeKey("VK_DOWN", {}); 1.195 + testVals(n1, "key down", 5); 1.196 + 1.197 + synthesizeMouse(sb, 2, 2, {}); 1.198 + testVals(n1, "spinbuttons up", 6); 1.199 + synthesizeMouse(sb, 2, sbbottom, {}); 1.200 + testVals(n1, "spinbuttons down", 5); 1.201 + 1.202 + n1.value = 15; 1.203 + synthesizeKey("VK_UP", {}); 1.204 + testVals(n1, "key up at max", 15); 1.205 + synthesizeMouse(sb, 2, 2, {}); 1.206 + testVals(n1, "spinbuttons up at max", 15); 1.207 + 1.208 + n1.value = 5; 1.209 + synthesizeKey("VK_DOWN", {}); 1.210 + testVals(n1, "key down at min", 5); 1.211 + synthesizeMouse(sb, 2, sbbottom, {}); 1.212 + testVals(n1, "spinbuttons down at min", 5); 1.213 + 1.214 + n1.wrapAround = true; 1.215 + n1.value = 15; 1.216 + synthesizeKey("VK_UP", {}); 1.217 + testVals(n1, "key up wraparound at max", 5); 1.218 + n1.value = 5; 1.219 + synthesizeKey("VK_DOWN", {}); 1.220 + testVals(n1, "key down wraparound at min", 15); 1.221 + 1.222 + n1.value = 15; 1.223 + synthesizeMouse(sb, 2, 2, {}); 1.224 + testVals(n1, "spinbuttons up wraparound at max", 5); 1.225 + n1.value = 5; 1.226 + synthesizeMouse(sb, 2, sbbottom, {}); 1.227 + testVals(n1, "spinbuttons down wraparound at min", 15); 1.228 + 1.229 + // check read only state 1.230 + n1.readOnly = true; 1.231 + n1.min = -10; 1.232 + n1.max = 15; 1.233 + n1.value = 12; 1.234 + // no events should fire and no changes should occur when the field is read only 1.235 + synthesizeKeyExpectEvent("VK_UP", { }, n1, "!change", "key up read only"); 1.236 + is(n1.value, 12, "key up read only value"); 1.237 + synthesizeKeyExpectEvent("VK_DOWN", { }, n1, "!change", "key down read only"); 1.238 + is(n1.value, 12, "key down read only value"); 1.239 + 1.240 + synthesizeMouseExpectEvent(sb, 2, 2, { }, n1, "!change", "mouse up read only"); 1.241 + is(n1.value, 12, "mouse up read only value"); 1.242 + synthesizeMouseExpectEvent(sb, 2, sbbottom, { }, n1, "!change", "mouse down read only"); 1.243 + is(n1.value, 12, "mouse down read only value"); 1.244 + 1.245 + n1.readOnly = false; 1.246 + n1.disabled = true; 1.247 + synthesizeMouseExpectEvent(sb, 2, 2, { }, n1, "!change", "mouse up disabled"); 1.248 + is(n1.value, 12, "mouse up disabled value"); 1.249 + synthesizeMouseExpectEvent(sb, 2, sbbottom, { }, n1, "!change", "mouse down disabled"); 1.250 + is(n1.value, 12, "mouse down disabled value"); 1.251 + 1.252 + var nsbrect = $("n8").spinButtons.getBoundingClientRect(); 1.253 + ok(nsbrect.left == 0 && nsbrect.top == 0 && nsbrect.right == 0, nsbrect.bottom == 0, 1.254 + "hidespinbuttons"); 1.255 + 1.256 + var n9 = $("n9"); 1.257 + is(n9.value, 0, "initial value"); 1.258 + n9.select(); 1.259 + synthesizeKey("4", {}); 1.260 + is(inputEventCount, 1, "input event count"); 1.261 + is(inputEventValue, "4", "input value"); 1.262 + is(n9.value, "4", "updated value"); 1.263 + synthesizeKey("2", {}); 1.264 + is(inputEventCount, 2, "input event count"); 1.265 + is(inputEventValue, "42", "input value"); 1.266 + is(n9.value, "42", "updated value"); 1.267 + synthesizeKey("VK_BACK_SPACE", {}); 1.268 + is(inputEventCount, 3, "input event count"); 1.269 + is(inputEventValue, "4", "input value"); 1.270 + is(n9.value, "4", "updated value"); 1.271 + synthesizeKey("A", {accelKey: true}); 1.272 + synthesizeKey("VK_DELETE", {}); 1.273 + is(inputEventCount, 4, "input event count"); 1.274 + is(inputEventValue, "0", "input value"); 1.275 + is(n9.value, "0", "updated value"); 1.276 + 1.277 + SimpleTest.finish(); 1.278 +} 1.279 + 1.280 +var inputEventCount = 0; 1.281 +var inputEventValue = null; 1.282 +function updateInputEventCount() { 1.283 + inputEventValue = $("n9").value; 1.284 + inputEventCount++; 1.285 +}; 1.286 + 1.287 +function testVals(nb, name, valueNumber, valueFieldNumber) { 1.288 + if (valueFieldNumber === undefined) 1.289 + valueFieldNumber = "" + valueNumber; 1.290 + 1.291 + SimpleTest.ise(nb.value, "" + valueNumber, name + " value is '" + valueNumber + "'"); 1.292 + SimpleTest.ise(nb.valueNumber, valueNumber, name + " valueNumber is " + valueNumber); 1.293 + 1.294 + // This value format depends on the localized decimal symbol. 1.295 + var localizedValue = valueFieldNumber.replace(/\./, nb.decimalSymbol); 1.296 + SimpleTest.ise(nb.inputField.value, localizedValue, 1.297 + name + " inputField value is '" + localizedValue + "'"); 1.298 +} 1.299 + 1.300 +function testValsMinMax(nb, name, valueNumber, min, max, valueFieldNumber) { 1.301 + testVals(nb, name, valueNumber, valueFieldNumber); 1.302 + SimpleTest.ise(nb.min, min, name + " min is " + min); 1.303 + SimpleTest.ise(nb.max, max, name + " max is " + max); 1.304 +} 1.305 + 1.306 +function testIncreaseDecrease(nb, testid, increment, fixedCount, min, max) 1.307 +{ 1.308 + testid += " "; 1.309 + 1.310 + nb.value = max; 1.311 + nb.decrease(); 1.312 + testVals(nb, testid + "decrease method", max - increment, 1.313 + (max - increment).toFixed(fixedCount)); 1.314 + nb.increase(); 1.315 + testVals(nb, testid + "increase method", max, max.toFixed(fixedCount)); 1.316 + nb.value = min; 1.317 + nb.decrease(); 1.318 + testVals(nb, testid + "decrease method at min", min, min.toFixed(fixedCount)); 1.319 + nb.value = max; 1.320 + nb.increase(); 1.321 + testVals(nb, testid + "increase method at max", max, max.toFixed(fixedCount)); 1.322 + 1.323 + nb.focus(); 1.324 + nb.value = min; 1.325 + 1.326 + // pressing the cursor up and down keys should adjust the value 1.327 + synthesizeKeyExpectEvent("VK_UP", { }, nb, "change", testid + "key up"); 1.328 + is(nb.value, min + increment, testid + "key up"); 1.329 + nb.value = max; 1.330 + synthesizeKeyExpectEvent("VK_UP", { }, nb, "!change", testid + "key up at max"); 1.331 + is(nb.value, max, testid + "key up at max"); 1.332 + synthesizeKeyExpectEvent("VK_DOWN", { }, nb, "change", testid + "key down"); 1.333 + is(nb.value, max - increment, testid + "key down"); 1.334 + nb.value = min; 1.335 + synthesizeKeyExpectEvent("VK_DOWN", { }, nb, "!change", testid + "key down at min"); 1.336 + is(nb.value, min, testid + "key down at min"); 1.337 + 1.338 + // check pressing the spinbutton arrows 1.339 + var sb = nb.spinButtons; 1.340 + var sbbottom = sb.getBoundingClientRect().bottom - sb.getBoundingClientRect().top - 2; 1.341 + nb.value = min; 1.342 + synthesizeMouseExpectEvent(sb, 2, 2, { }, nb, "change", testid + "mouse up"); 1.343 + is(nb.value, min + increment, testid + "mouse up"); 1.344 + nb.value = max; 1.345 + synthesizeMouseExpectEvent(sb, 2, 2, { }, nb, "!change", testid + "mouse up at max"); 1.346 + synthesizeMouseExpectEvent(sb, 2, sbbottom, { }, nb, "change", testid + "mouse down"); 1.347 + is(nb.value, max - increment, testid + "mouse down"); 1.348 + nb.value = min; 1.349 + synthesizeMouseExpectEvent(sb, 2, sbbottom, { }, nb, "!change", testid + "mouse down at min"); 1.350 +} 1.351 + 1.352 +SimpleTest.waitForFocus(doTests); 1.353 + 1.354 + ]]></script> 1.355 + 1.356 +</window>