diff options
Diffstat (limited to 'toolkit/content/tests/chrome/test_textbox_number.xul')
-rw-r--r-- | toolkit/content/tests/chrome/test_textbox_number.xul | 353 |
1 files changed, 353 insertions, 0 deletions
diff --git a/toolkit/content/tests/chrome/test_textbox_number.xul b/toolkit/content/tests/chrome/test_textbox_number.xul new file mode 100644 index 000000000..369e92785 --- /dev/null +++ b/toolkit/content/tests/chrome/test_textbox_number.xul @@ -0,0 +1,353 @@ +<?xml version="1.0"?> +<?xml-stylesheet href="chrome://global/skin" type="text/css"?> +<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?> +<!-- + XUL Widget Test for textbox type="number" + --> +<window title="Textbox type='number' test" width="500" height="600" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> + <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> + <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script> + +<hbox> + <textbox id="n1" type="number" size="4"/> + <textbox id="n2" type="number" value="10" min="5" max="15" wraparound="true"/> +</hbox> +<hbox> + <textbox id="n3" type="number" size="4" value="25" min="1" max="12" increment="3"/> +</hbox> +<hbox> + <textbox id="n4" type="number" size="4" value="-2" min="-8" max="18"/> + <textbox id="n5" type="number" value="-17" min="-10" max="-3"/> +</hbox> +<hbox> + <textbox id="n6" type="number" size="4" value="9" min="12" max="8"/> +</hbox> +<hbox> + <textbox id="n7" type="number" size="4" value="4.678" min="2" max="10.5" decimalplaces="2"/> + <textbox id="n8" type="number" hidespinbuttons="true"/> +</hbox> +<hbox> + <textbox id="n9" type="number" size="4" oninput="updateInputEventCount();"/> +</hbox> + + <!-- test results are displayed in the html:body --> + <body xmlns="http://www.w3.org/1999/xhtml" style="height: 300px; overflow: auto;"/> + + <!-- test code goes here --> + <script type="application/javascript"><![CDATA[ +SimpleTest.waitForExplicitFinish(); + +// ---- NOTE: the numbers used in these tests are carefully chosen to avoid +// ---- floating point rounding issues + +function doTests() { + var n1 = $("n1"); + var n2 = $("n2"); + var n3 = $("n3"); + var n4 = $("n4"); + var n5 = $("n5"); + var n6 = $("n6"); + var n7 = $("n7"); + + testValsMinMax(n1, "initial n1", 0, 0, Infinity); + testValsMinMax(n2, "initial n2", 10, 5, 15); + testValsMinMax(n3, "initial n3", 12, 1, 12); + testValsMinMax(n4, "initial n4", -2, -8, 18); + testValsMinMax(n5, "initial n5", -10, -10, -3); + testValsMinMax(n6, "initial n6", 12, 12, 12); + testValsMinMax(n7, "initial n7", 4.68, 2, 10.5); // value should be rounded + + ok(n1.spinButtons != null && n1.spinButtons.localName == "spinbuttons", "spinButtons set"); + isnot(n1.decimalSymbol, "", "n1.decimalSymbol is set to something"); + n1.decimalSymbol = "."; + SimpleTest.is(n1.decimalSymbol, ".", "n1.decimalSymbol set to '.'"); + SimpleTest.is(n1.wrapAround, false, "wrapAround defaults to false"); + SimpleTest.is(n1.increment, 1, "increment defaults to 1"); + SimpleTest.is(n1.decimalPlaces, 0, "decimalPlaces defaults to 0"); + + SimpleTest.is(n2.wrapAround, true, "wrapAround when set to true"); + SimpleTest.is(n3.increment, 3, "increment when set to 1"); + SimpleTest.is(n7.decimalPlaces, 2, "decimalPlaces when set to 2"); + + // test changing the value + n1.value = "1700"; + testVals(n1, "set value,", 1700); + n1.value = 1600; + testVals(n1, "set value int,", 1600); + n2.value = "2"; + testVals(n2, "set value below min,", 5); + n2.value = 2; + testVals(n2, "set value below min int,", 5); + n2.value = 18; + testVals(n2, "set value above max,", 15); + n2.value = -6; + testVals(n2, "set value below min negative,", 5); + n5.value = -2; + testVals(n5, "set value above max positive,", -3); + n7.value = 5.999; + testVals(n7, "set value to decimal,", 6, "6.00"); + n7.value = "1.42"; + testVals(n7, "set value to decimal below min,", 2.00, "2.00"); + n7.value = 24.1; + testVals(n7, "set value to decimal above max,", 10.5, "10.50"); + n1.value = 4.75; + testVals(n1, "set value to decimal round,", 5); + + // test changing the valueNumber + n1.valueNumber = 27; + testVals(n1, "set valueNumber,", 27); + n2.valueNumber = 1; + testVals(n2, "set valueNumber below min,", 5); + n2.valueNumber = 77; + testVals(n2, "set valueNumber above max,", 15); + n2.valueNumber = -5; + testVals(n2, "set valueNumber below min negative,", 5); + n5.valueNumber = -8; + n5.valueNumber = -1; + testVals(n5, "set valueNumber above max positive,", -3); + n7.valueNumber = 8.23; + testVals(n7, "set valueNumber to decimal,", 8.23); + n7.valueNumber = 0.77; + testVals(n7, "set valueNumber to decimal below min,", 2.00, "2.00"); + n7.valueNumber = 29.157; + testVals(n7, "set valueNumber to decimal above max,", 10.5, "10.50"); + n1.value = 8.9; + testVals(n1, "set valueNumber to decimal round,", 9); + + // test changing the min + n1.value = 6; + n1.min = 8; + testValsMinMax(n1, "set integer min,", 8, 8, Infinity); + n7.value = 5.5; + n7.min = 6.7; + testValsMinMax(n7, "set decimal min,", 6.7, 6.7, 10.5, "6.70"); + + // test changing the max + n1.value = 25; + n1.max = 22; + testValsMinMax(n1, "set integer max,", 22, 8, 22); + n7.value = 10.2; + n7.max = 10.1; + testValsMinMax(n7, "set decimal max,", 10.1, 6.7, 10.1, "10.10"); + + // test decrease() and increase() methods + testIncreaseDecrease(n1, "integer", 1, 0, 8, 22); + testIncreaseDecrease(n7, "decimal", 1, 2, 6.7, 10.1); + testIncreaseDecrease(n3, "integer with increment", 3, 0, 1, 12); + + n7.min = 2.7; + n7.value = 10.1; + n7.increment = 4.3; + SimpleTest.is(n7.increment, 4.3, "increment changed"); + testIncreaseDecrease(n7, "integer with increment", 4.3, 2, 2.7, 10.1); + + n2.value = n2.min; + n2.decrease(); + testVals(n2, "integer wraparound decrease method", n2.max); + n2.increase(); + testVals(n2, "integer wraparound decrease method", n2.min); + + n7.wrapAround = true; + SimpleTest.is(n7.wrapAround, true, "change wrapAround"); + n7.value = n7.min + 0.01; + n7.decrease(); + testVals(n7, "decimal wraparound decrease method", n7.max, n7.max.toFixed(2)); + n7.increase(); + testVals(n7, "decimal wraparound decrease method", n7.min, n7.min.toFixed(2)); + + n1.value = 22; + n1.decimalPlaces = 3; + testVals(n1, "set decimalPlaces 3", 22, "22.000"); + n1.value = 10.624; + testVals(n1, "set decimalPlaces 3 set value,", 10.624); + n1.decimalPlaces = 0; + testVals(n1, "set decimalPlaces 0 set value,", 11); + n1.decimalPlaces = Infinity; + n1.value = 10.678123; + testVals(n1, "set decimalPlaces Infinity set value,", 10.678123); + + n1.decimalSymbol = ","; + SimpleTest.is(n1.decimalSymbol, ",", "n1.decimalSymbol set to ','"); + n1.value = "9.67"; + testVals(n1, "set decimalPlaces set value,", 9.67); + + n1.decimalSymbol = "."; + SimpleTest.is(n1.decimalSymbol, ".", "n1.decimalSymbol set back to '.'"); + n1.decimalPlaces = 0; + + // UI tests + n1.min = 5; + n1.max = 15; + n1.value = 5; + n1.focus(); + + var sb = n1.spinButtons; + var sbbottom = sb.getBoundingClientRect().bottom - sb.getBoundingClientRect().top - 2; + + synthesizeKey("VK_UP", {}); + testVals(n1, "key up", 6); + + synthesizeKey("VK_DOWN", {}); + testVals(n1, "key down", 5); + + synthesizeMouse(sb, 2, 2, {}); + testVals(n1, "spinbuttons up", 6); + synthesizeMouse(sb, 2, sbbottom, {}); + testVals(n1, "spinbuttons down", 5); + + n1.value = 15; + synthesizeKey("VK_UP", {}); + testVals(n1, "key up at max", 15); + synthesizeMouse(sb, 2, 2, {}); + testVals(n1, "spinbuttons up at max", 15); + + n1.value = 5; + synthesizeKey("VK_DOWN", {}); + testVals(n1, "key down at min", 5); + synthesizeMouse(sb, 2, sbbottom, {}); + testVals(n1, "spinbuttons down at min", 5); + + n1.wrapAround = true; + n1.value = 15; + synthesizeKey("VK_UP", {}); + testVals(n1, "key up wraparound at max", 5); + n1.value = 5; + synthesizeKey("VK_DOWN", {}); + testVals(n1, "key down wraparound at min", 15); + + n1.value = 15; + synthesizeMouse(sb, 2, 2, {}); + testVals(n1, "spinbuttons up wraparound at max", 5); + n1.value = 5; + synthesizeMouse(sb, 2, sbbottom, {}); + testVals(n1, "spinbuttons down wraparound at min", 15); + + // check read only state + n1.readOnly = true; + n1.min = -10; + n1.max = 15; + n1.value = 12; + // no events should fire and no changes should occur when the field is read only + synthesizeKeyExpectEvent("VK_UP", { }, n1, "!change", "key up read only"); + is(n1.value, "12", "key up read only value"); + synthesizeKeyExpectEvent("VK_DOWN", { }, n1, "!change", "key down read only"); + is(n1.value, "12", "key down read only value"); + + synthesizeMouseExpectEvent(sb, 2, 2, { }, n1, "!change", "mouse up read only"); + is(n1.value, "12", "mouse up read only value"); + synthesizeMouseExpectEvent(sb, 2, sbbottom, { }, n1, "!change", "mouse down read only"); + is(n1.value, "12", "mouse down read only value"); + + n1.readOnly = false; + n1.disabled = true; + synthesizeMouseExpectEvent(sb, 2, 2, { }, n1, "!change", "mouse up disabled"); + is(n1.value, "12", "mouse up disabled value"); + synthesizeMouseExpectEvent(sb, 2, sbbottom, { }, n1, "!change", "mouse down disabled"); + is(n1.value, "12", "mouse down disabled value"); + + var nsbrect = $("n8").spinButtons.getBoundingClientRect(); + ok(nsbrect.left == 0 && nsbrect.top == 0 && nsbrect.right == 0, nsbrect.bottom == 0, + "hidespinbuttons"); + + var n9 = $("n9"); + is(n9.value, "0", "initial value"); + n9.select(); + synthesizeKey("4", {}); + is(inputEventCount, 1, "input event count"); + is(inputEventValue, "4", "input value"); + is(n9.value, "4", "updated value"); + synthesizeKey("2", {}); + is(inputEventCount, 2, "input event count"); + is(inputEventValue, "42", "input value"); + is(n9.value, "42", "updated value"); + synthesizeKey("VK_BACK_SPACE", {}); + is(inputEventCount, 3, "input event count"); + is(inputEventValue, "4", "input value"); + is(n9.value, "4", "updated value"); + synthesizeKey("A", {accelKey: true}); + synthesizeKey("VK_DELETE", {}); + is(inputEventCount, 4, "input event count"); + is(inputEventValue, "0", "input value"); + is(n9.value, "0", "updated value"); + + SimpleTest.finish(); +} + +var inputEventCount = 0; +var inputEventValue = null; +function updateInputEventCount() { + inputEventValue = $("n9").value; + inputEventCount++; +}; + +function testVals(nb, name, valueNumber, valueFieldNumber) { + if (valueFieldNumber === undefined) + valueFieldNumber = "" + valueNumber; + + SimpleTest.is(nb.value, "" + valueNumber, name + " value is '" + valueNumber + "'"); + SimpleTest.is(nb.valueNumber, valueNumber, name + " valueNumber is " + valueNumber); + + // This value format depends on the localized decimal symbol. + var localizedValue = valueFieldNumber.replace(/\./, nb.decimalSymbol); + SimpleTest.is(nb.inputField.value, localizedValue, + name + " inputField value is '" + localizedValue + "'"); +} + +function testValsMinMax(nb, name, valueNumber, min, max, valueFieldNumber) { + testVals(nb, name, valueNumber, valueFieldNumber); + SimpleTest.is(nb.min, min, name + " min is " + min); + SimpleTest.is(nb.max, max, name + " max is " + max); +} + +function testIncreaseDecrease(nb, testid, increment, fixedCount, min, max) +{ + testid += " "; + + nb.value = max; + nb.decrease(); + testVals(nb, testid + "decrease method", max - increment, + (max - increment).toFixed(fixedCount)); + nb.increase(); + testVals(nb, testid + "increase method", max, max.toFixed(fixedCount)); + nb.value = min; + nb.decrease(); + testVals(nb, testid + "decrease method at min", min, min.toFixed(fixedCount)); + nb.value = max; + nb.increase(); + testVals(nb, testid + "increase method at max", max, max.toFixed(fixedCount)); + + nb.focus(); + nb.value = min; + + // pressing the cursor up and down keys should adjust the value + synthesizeKeyExpectEvent("VK_UP", { }, nb, "change", testid + "key up"); + is(nb.value, String(min + increment), testid + "key up"); + nb.value = max; + synthesizeKeyExpectEvent("VK_UP", { }, nb, "!change", testid + "key up at max"); + is(nb.value, String(max), testid + "key up at max"); + synthesizeKeyExpectEvent("VK_DOWN", { }, nb, "change", testid + "key down"); + is(nb.value, String(max - increment), testid + "key down"); + nb.value = min; + synthesizeKeyExpectEvent("VK_DOWN", { }, nb, "!change", testid + "key down at min"); + is(nb.value, String(min), testid + "key down at min"); + + // check pressing the spinbutton arrows + var sb = nb.spinButtons; + var sbbottom = sb.getBoundingClientRect().bottom - sb.getBoundingClientRect().top - 2; + nb.value = min; + synthesizeMouseExpectEvent(sb, 2, 2, { }, nb, "change", testid + "mouse up"); + is(nb.value, String(min + increment), testid + "mouse up"); + nb.value = max; + synthesizeMouseExpectEvent(sb, 2, 2, { }, nb, "!change", testid + "mouse up at max"); + synthesizeMouseExpectEvent(sb, 2, sbbottom, { }, nb, "change", testid + "mouse down"); + is(nb.value, String(max - increment), testid + "mouse down"); + nb.value = min; + synthesizeMouseExpectEvent(sb, 2, sbbottom, { }, nb, "!change", testid + "mouse down at min"); +} + +SimpleTest.waitForFocus(doTests); + + ]]></script> + +</window> |