input[type=number] does not increment/decrement integers with trailing decimal characters
[WebKit-https.git] / LayoutTests / fast / forms / number / number-stepup-stepdown.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <script src="../../../resources/js-test-pre.js"></script>
5 </head>
6 <body>
7 <script>
8 description('Check stepUp() and stepDown() bahevior for number type.');
9
10 var input = document.createElement('input');
11 var invalidStateErr = '"Error: InvalidStateError: DOM Exception 11"';
12
13 function setInputAttributes(min, max, step, value) {
14     input.min = min;
15     input.max = max;
16     input.step = step;
17     input.value = value;
18 }
19
20 function stepUp(value, step, max, optionalStepCount) {
21     setInputAttributes(null, max, step, value);
22     if (typeof optionalStepCount != "undefined")
23         input.stepUp(optionalStepCount);
24     else
25         input.stepUp();
26     return input.value;
27 }
28
29 function stepDown(value, step, min, optionalStepCount) {
30     setInputAttributes(min, null, step, value);
31     if (typeof optionalStepCount != "undefined")
32         input.stepDown(optionalStepCount);
33     else
34         input.stepDown();
35     return input.value;
36 }
37
38 function stepUpExplicitBounds(min, max, step, value, stepCount) {
39     setInputAttributes(min, max, step, value);
40     if (typeof stepCount !== 'undefined')
41         input.stepUp(stepCount);
42     else
43         input.stepUp();
44     return input.value;
45 }
46
47 function stepDownExplicitBounds(min, max, step, value, stepCount) {
48     setInputAttributes(min, max, step, value);
49     if (typeof stepCount !== 'undefined')
50         input.stepDown(stepCount);
51     else
52         input.stepDown();
53     return input.value;
54 }
55
56 debug('Number type');
57 input.type = 'number';
58
59 debug('');
60 debug('Invalid value');
61 shouldThrow('stepUp("", null, null)', invalidStateErr);
62 shouldThrow('stepDown("", null, null)', invalidStateErr);
63
64 debug('');
65 debug('Non-number arguments');
66 shouldBe('stepUp("0", null, null, "0")', '"0"');
67 shouldBe('stepDown("0", null, null, "0")', '"0"');
68 shouldBe('stepUp("0", null, null, "foo")', '"0"');
69 shouldBe('stepDown("0", null, null, "foo")', '"0"');
70 shouldBe('stepUp("0", null, null, null)', '"0"');
71 shouldBe('stepDown("0", null, null, null)', '"0"');
72
73 debug('');
74 debug('Normal cases');
75 shouldBe('stepUp("0", null, null)', '"1"');
76 shouldBe('stepUp("1", null, null, 2)', '"3"');
77 shouldBe('stepUp("3", null, null, -1)', '"2"');
78 shouldBe('stepDown("2", null, null)', '"1"');
79 shouldBe('stepDown("1", null, null, 2)', '"-1"');
80 shouldBe('stepDown("-1", null, null, -1)', '"0"');
81
82 debug('');
83 debug('Fractional cases')
84 // Base/model/template tests
85 shouldBe('stepUp("0.1", 1, null)', '"1.1"');
86 shouldBe('stepUp("0.2", 1, null)', '"1.2"');
87 shouldBe('stepUp("1.0", 1, null)', '"2"');
88 shouldBe('stepUp("1.1", 1, null)', '"2.1"');
89 shouldBe('stepUp("1.2", 1, null)', '"2.2"');
90 shouldBe('stepUp("2.0", 1, null)', '"3"');
91
92 // Same as above, but with negative numbers.
93 debug('');
94 shouldBe('stepUp("-0.1", 1, null)', '"0.9"');
95 shouldBe('stepUp("-0.2", 1, null)', '"0.8"');
96 shouldBe('stepUp("-1.0", 1, null)', '"0"');
97 shouldBe('stepUp("-1.1", 1, null)', '"-0.1"');
98 shouldBe('stepUp("-1.2", 1, null)', '"-0.2"');
99 shouldBe('stepUp("-2.0", 1, null)', '"-1"');
100
101 // Same as above, but stepping down rather than up.
102 debug('');
103 shouldBe('stepDown("0.1", 1, null)', '"-0.9"');
104 shouldBe('stepDown("0.2", 1, null)', '"-0.8"');
105 shouldBe('stepDown("1.0", 1, null)', '"0"');
106 shouldBe('stepDown("1.1", 1, null)', '"0.1"');
107 shouldBe('stepDown("1.2", 1, null)', '"0.2"');
108 shouldBe('stepDown("2.0", 1, null)', '"1"');
109
110 debug('');
111 shouldBe('stepDown("-0.1", 1, null)', '"-1.1"');
112 shouldBe('stepDown("-0.2", 1, null)', '"-1.2"');
113 shouldBe('stepDown("-1.0", 1, null)', '"-2"');
114 shouldBe('stepDown("-1.1", 1, null)', '"-2.1"');
115 shouldBe('stepDown("-1.2", 1, null)', '"-2.2"');
116 shouldBe('stepDown("-2.0", 1, null)', '"-3"');
117
118 // Same as above, but with leading/trailing zeros removed.
119 debug('');
120 shouldBe('stepUp(".1", 1, null)', '"1.1"');
121 shouldBe('stepUp(".2", 1, null)', '"1.2"');
122 shouldBe('stepUp("1.", 1, null)', '"2"');
123 shouldBe('stepUp("2.", 1, null)', '"3"');
124
125 debug('');
126 shouldBe('stepUp("-.1", 1, null)', '"0.9"');
127 shouldBe('stepUp("-.2", 1, null)', '"0.8"');
128 shouldBe('stepUp("-1.", 1, null)', '"0"');
129 shouldBe('stepUp("-2.", 1, null)', '"-1"');
130
131 debug('');
132 shouldBe('stepDown(".1", 1, null)', '"-0.9"');
133 shouldBe('stepDown(".2", 1, null)', '"-0.8"');
134 shouldBe('stepDown("1.", 1, null)', '"0"');
135 shouldBe('stepDown("2.", 1, null)', '"1"');
136
137 debug('');
138 shouldBe('stepDown("-.1", 1, null)', '"-1.1"');
139 shouldBe('stepDown("-.2", 1, null)', '"-1.2"');
140 shouldBe('stepDown("-1.", 1, null)', '"-2"');
141 shouldBe('stepDown("-2.", 1, null)', '"-3"');
142
143 // Same as above, but stepping by .1 rather than 1.
144 debug('');
145 shouldBe('stepUp("0.1", .1, null)', '"0.2"');
146 shouldBe('stepUp("0.2", .1, null)', '"0.3"');
147 shouldBe('stepUp("1.0", .1, null)', '"1.1"');
148 shouldBe('stepUp("1.1", .1, null)', '"1.2"');
149 shouldBe('stepUp("1.2", .1, null)', '"1.3"');
150 shouldBe('stepUp("2.0", .1, null)', '"2.1"');
151
152 debug('');
153 shouldBe('stepUp("-0.1", .1, null)', '"0"');
154 shouldBe('stepUp("-0.2", .1, null)', '"-0.1"');
155 shouldBe('stepUp("-1.0", .1, null)', '"-0.9"');
156 shouldBe('stepUp("-1.1", .1, null)', '"-1"');
157 shouldBe('stepUp("-1.2", .1, null)', '"-1.1"');
158 shouldBe('stepUp("-2.0", .1, null)', '"-1.9"');
159
160 debug('');
161 shouldBe('stepDown("0.1", .1, null)', '"0"');
162 shouldBe('stepDown("0.2", .1, null)', '"0.1"');
163 shouldBe('stepDown("1.0", .1, null)', '"0.9"');
164 shouldBe('stepDown("1.1", .1, null)', '"1"');
165 shouldBe('stepDown("1.2", .1, null)', '"1.1"');
166 shouldBe('stepDown("2.0", .1, null)', '"1.9"');
167
168 debug('');
169 shouldBe('stepDown("-0.1", .1, null)', '"-0.2"');
170 shouldBe('stepDown("-0.2", .1, null)', '"-0.3"');
171 shouldBe('stepDown("-1.0", .1, null)', '"-1.1"');
172 shouldBe('stepDown("-1.1", .1, null)', '"-1.2"');
173 shouldBe('stepDown("-1.2", .1, null)', '"-1.3"');
174 shouldBe('stepDown("-2.0", .1, null)', '"-2.1"');
175
176 debug('');
177 shouldBe('stepUp(".1", .1, null)', '"0.2"');
178 shouldBe('stepUp(".2", .1, null)', '"0.3"');
179 shouldBe('stepUp("1.", .1, null)', '"1.1"');
180 shouldBe('stepUp("2.", .1, null)', '"2.1"');
181
182 debug('');
183 shouldBe('stepUp("-.1", .1, null)', '"0"');
184 shouldBe('stepUp("-.2", .1, null)', '"-0.1"');
185 shouldBe('stepUp("-1.", .1, null)', '"-0.9"');
186 shouldBe('stepUp("-2.", .1, null)', '"-1.9"');
187
188 debug('');
189 shouldBe('stepDown(".1", .1, null)', '"0"');
190 shouldBe('stepDown(".2", .1, null)', '"0.1"');
191 shouldBe('stepDown("1.", .1, null)', '"0.9"');
192 shouldBe('stepDown("2.", .1, null)', '"1.9"');
193
194 debug('');
195 shouldBe('stepDown("-.1", .1, null)', '"-0.2"');
196 shouldBe('stepDown("-.2", .1, null)', '"-0.3"');
197 shouldBe('stepDown("-1.", .1, null)', '"-1.1"');
198 shouldBe('stepDown("-2.", .1, null)', '"-2.1"');
199
200 debug('');
201 debug('Extra arguments');
202 shouldBe('input.value = "0"; input.min = null; input.step = null; input.stepUp(1, 2); input.value', '"1"');
203 shouldBe('input.value = "1"; input.stepDown(1, 3); input.value', '"0"');
204
205 debug('');
206 debug('Invalid step value');
207 shouldBe('stepUp("0", "foo", null)', '"1"');
208 shouldBe('stepUp("1", "0", null)', '"2"');
209 shouldBe('stepUp("2", "-1", null)', '"3"');
210
211 debug('');
212 debug('Step=any');
213 shouldThrow('stepUp("0", "any", null)', invalidStateErr);
214 shouldThrow('stepDown("0", "any", null)', invalidStateErr);
215
216 debug('');
217 debug('Step=any corner case');
218 shouldThrow('stepUpExplicitBounds("0", "100", "any", "1.5", "1")', invalidStateErr);
219 shouldThrow('stepDownExplicitBounds("0", "100", "any", "1.5", "1")', invalidStateErr);
220
221 debug('');
222 debug('Overflow/underflow');
223 shouldBe('stepDown("1", "1", "0")', '"0"');
224 shouldThrow('stepDown("0", "1", "0")', invalidStateErr);
225 shouldThrow('stepDown("1", "1", "0", 2)', invalidStateErr);
226 shouldBe('input.value', '"1"');
227 shouldThrow('stepDown("1", "3.40282346e+38", "", 2)', invalidStateErr);
228 shouldBe('stepUp("-1", "1", "0")', '"0"');
229 shouldThrow('stepUp("0", "1", "0")', invalidStateErr);
230 shouldThrow('stepUp("-1", "1", "0", 2)', invalidStateErr);
231 shouldBe('input.value', '"-1"');
232 shouldThrow('stepUp("1", "3.40282346e+38", "", 2)', invalidStateErr);
233
234 debug('');
235 debug('stepDown()/stepUp() for stepMismatch values');
236 shouldBe('stepUp("1", "2", "")', '"3"');
237 shouldBe('input.stepDown(); input.value', '"1"');
238 shouldBe('input.min = "0"; stepUp("9", "10", "", 9)', '"99"');
239 shouldBe('stepDown("19", "10", "0")', '"9"');
240 shouldBe('stepUp("89", "10", "99")', '"99"');
241
242 debug('');
243 debug('Huge value and small step');
244 shouldBe('input.min = ""; stepUp("1e+38", "1", "", 999999)', '"1e+38"');
245 shouldBe('input.max = ""; stepDown("1e+38", "1", "", 999999)', '"1e+38"');
246
247 debug('');
248 debug('Fractional numbers');
249 shouldBe('input.min = ""; stepUp("0", "0.33333333333333333", "", 3)', '"1"');
250 shouldBe('stepUp("1", "0.1", "", 10)', '"2"');
251 shouldBe('input.stepUp(); input.stepUp(); input.stepUp(); input.stepUp(); input.stepUp(); input.stepUp(); input.stepUp(); input.stepUp(); input.stepUp(); input.stepUp(); input.value', '"3"');
252 shouldBe('input.min = "0"; stepUp("0", "0.003921568627450980", "1", 255)', '"1"');
253 shouldBe('for (var i = 0; i < 255; i++) { input.stepDown(); }; input.value', '"0"');
254
255 debug('');
256 debug('Rounding');
257 shouldBe('stepUp("5.005", "0.005", "", 2)', '"5.015"');
258 shouldBe('stepUp("5.005", "0.005", "", 11)', '"5.06"');
259 shouldBe('stepUp("5.005", "0.005", "", 12)', '"5.065"');
260 shouldBe('stepUpExplicitBounds("4", "9", "0.005", "5.005", 2)', '"5.015"');
261 shouldBe('stepUpExplicitBounds("4", "9", "0.005", "5.005", 11)', '"5.06"');
262 shouldBe('stepUpExplicitBounds("4", "9", "0.005", "5.005", 12)', '"5.065"');
263
264 debug('');
265 </script>
266 <script src="../../../resources/js-test-post.js"></script>
267 </body>
268 </html>