test_stepup_stepdown.html (63206B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=636627 5 --> 6 <head> 7 <title>Test for Bug 636627</title> 8 <script src="/tests/SimpleTest/SimpleTest.js"></script> 9 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 10 </head> 11 <body> 12 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=636627">Mozilla Bug 636627</a> 13 <p id="display"></p> 14 <pre id="test"> 15 <script type="application/javascript"> 16 17 /** Test for Bug 636627 */ 18 19 /** 20 * This test is testing stepDown() and stepUp(). 21 */ 22 23 function checkPresence() 24 { 25 var input = document.createElement('input'); 26 is('stepDown' in input, true, 'stepDown() should be an input function'); 27 is('stepUp' in input, true, 'stepUp() should be an input function'); 28 } 29 30 function checkAvailability() 31 { 32 var testData = 33 [ 34 ["text", false], 35 ["password", false], 36 ["search", false], 37 ["telephone", false], 38 ["email", false], 39 ["url", false], 40 ["hidden", false], 41 ["checkbox", false], 42 ["radio", false], 43 ["file", false], 44 ["submit", false], 45 ["image", false], 46 ["reset", false], 47 ["button", false], 48 ["number", true], 49 ["range", true], 50 ["date", true], 51 ["time", true], 52 ["month", true], 53 ["week", true], 54 ["datetime-local", true], 55 ["color", false], 56 ]; 57 58 var element = document.createElement("input"); 59 element.setAttribute('value', '0'); 60 61 for (data of testData) { 62 var exceptionCaught = false; 63 element.type = data[0]; 64 try { 65 element.stepDown(); 66 } catch (e) { 67 exceptionCaught = true; 68 } 69 is(exceptionCaught, !data[1], "stepDown() availability is not correct"); 70 71 exceptionCaught = false; 72 try { 73 element.stepUp(); 74 } catch (e) { 75 exceptionCaught = true; 76 } 77 is(exceptionCaught, !data[1], "stepUp() availability is not correct"); 78 } 79 } 80 81 function checkStepDown() 82 { 83 // This testData is very similar to the one in checkStepUp with some changes 84 // relative to stepDown. 85 var testData = [ 86 /* Initial value | step | min | max | stepDown arg | final value | exception */ 87 { type: 'number', data: [ 88 // Regular case. 89 [ '1', null, null, null, null, '0', false ], 90 // Argument testing. 91 [ '1', null, null, null, 1, '0', false ], 92 [ '9', null, null, null, 9, '0', false ], 93 [ '1', null, null, null, -1, '2', false ], 94 [ '1', null, null, null, 0, '1', false ], 95 // Float values are rounded to integer (1.1 -> 1). 96 [ '1', null, null, null, 1.1, '0', false ], 97 // With step values. 98 [ '1', '0.5', null, null, null, '0.5', false ], 99 [ '1', '0.25', null, null, 4, '0', false ], 100 // step = 0 isn't allowed (-> step = 1). 101 [ '1', '0', null, null, null, '0', false ], 102 // step < 0 isn't allowed (-> step = 1). 103 [ '1', '-1', null, null, null, '0', false ], 104 // step = NaN isn't allowed (-> step = 1). 105 [ '1', 'foo', null, null, null, '0', false ], 106 // Min values testing. 107 [ '1', '1', 'foo', null, null, '0', false ], 108 [ '1', null, '-10', null, null, '0', false ], 109 [ '1', null, '0', null, null, '0', false ], 110 [ '1', null, '10', null, null, '1', false ], 111 [ '1', null, '2', null, null, '1', false ], 112 [ '1', null, '1', null, null, '1', false ], 113 // Max values testing. 114 [ '1', '1', null, 'foo', null, '0', false ], 115 [ '1', null, null, '10', null, '0', false ], 116 [ '1', null, null, '0', null, '0', false ], 117 [ '1', null, null, '-10', null, '-10', false ], 118 [ '1', null, null, '1', null, '0', false ], 119 [ '5', null, null, '3', '3', '2', false ], 120 [ '5', '2', '-6', '3', '2', '2', false ], 121 [ '-3', '5', '-10', '-3', null, '-5', false ], 122 // Step mismatch. 123 [ '1', '2', '-2', null, null, '0', false ], 124 [ '3', '2', '-2', null, null, '2', false ], 125 [ '3', '2', '-2', null, '2', '0', false ], 126 [ '3', '2', '-2', null, '-2', '6', false ], 127 [ '1', '2', '-6', null, null, '0', false ], 128 [ '1', '2', '-2', null, null, '0', false ], 129 [ '1', '3', '-6', null, null, '0', false ], 130 [ '2', '3', '-6', null, null, '0', false ], 131 [ '2', '3', '1', null, null, '1', false ], 132 [ '5', '3', '1', null, null, '4', false ], 133 [ '3', '2', '-6', null, null, '2', false ], 134 [ '5', '2', '-6', null, null, '4', false ], 135 [ '6', '2', '1', null, null, '5', false ], 136 [ '8', '3', '1', null, null, '7', false ], 137 [ '9', '2', '-10', null, null, '8', false ], 138 [ '7', '3', '-10', null, null, '5', false ], 139 [ '-2', '3', '-10', null, null, '-4', false ], 140 // Clamping. 141 [ '0', '2', '-1', null, null, '-1', false ], 142 [ '10', '2', '0', '4', '10', '0', false ], 143 [ '10', '2', '0', '4', '5', '0', false ], 144 // value = "" (NaN). 145 [ '', null, null, null, null, '-1', false ], 146 [ '', '2', null, null, null, '-2', false ], 147 [ '', '2', '3', null, null, '3', false ], 148 [ '', null, '3', null, null, '3', false ], 149 [ '', '2', '3', '8', null, '3', false ], 150 [ '', null, '-10', '10', null, '-1', false ], 151 [ '', '3', '-10', '10', null, '-1', false ], 152 // With step = 'any'. 153 [ '0', 'any', null, null, 1, null, true ], 154 [ '0', 'ANY', null, null, 1, null, true ], 155 [ '0', 'AnY', null, null, 1, null, true ], 156 [ '0', 'aNy', null, null, 1, null, true ], 157 // With @value = step base. 158 [ '1', '2', null, null, null, '-1', false ], 159 ]}, 160 { type: 'range', data: [ 161 // Regular case. 162 [ '1', null, null, null, null, '0', false ], 163 // Argument testing. 164 [ '1', null, null, null, 1, '0', false ], 165 [ '9', null, null, null, 9, '0', false ], 166 [ '1', null, null, null, -1, '2', false ], 167 [ '1', null, null, null, 0, '1', false ], 168 // Float values are rounded to integer (1.1 -> 1). 169 [ '1', null, null, null, 1.1, '0', false ], 170 // With step values. 171 [ '1', '0.5', null, null, null, '0.5', false ], 172 [ '1', '0.25', null, null, 4, '0', false ], 173 // step = 0 isn't allowed (-> step = 1). 174 [ '1', '0', null, null, null, '0', false ], 175 // step < 0 isn't allowed (-> step = 1). 176 [ '1', '-1', null, null, null, '0', false ], 177 // step = NaN isn't allowed (-> step = 1). 178 [ '1', 'foo', null, null, null, '0', false ], 179 // Min values testing. 180 [ '1', '1', 'foo', null, null, '0', false ], 181 [ '1', null, '-10', null, null, '0', false ], 182 [ '1', null, '0', null, null, '0', false ], 183 [ '1', null, '10', null, null, '10', false ], 184 [ '1', null, '2', null, null, '2', false ], 185 [ '1', null, '1', null, null, '1', false ], 186 // Max values testing. 187 [ '1', '1', null, 'foo', null, '0', false ], 188 [ '1', null, null, '10', null, '0', false ], 189 [ '1', null, null, '0', null, '0', false ], 190 [ '1', null, null, '-10', null, '0', false ], 191 [ '1', null, null, '1', null, '0', false ], 192 [ '5', null, null, '3', '3', '0', false ], 193 [ '5', '2', '-6', '3', '2', '-2', false ], 194 [ '-3', '5', '-10', '-3', null, '-10', false ], 195 // Step mismatch. 196 [ '1', '2', '-2', null, null, '0', false ], 197 [ '3', '2', '-2', null, null, '2', false ], 198 [ '3', '2', '-2', null, '2', '0', false ], 199 [ '3', '2', '-2', null, '-2', '8', false ], 200 [ '1', '2', '-6', null, null, '0', false ], 201 [ '1', '2', '-2', null, null, '0', false ], 202 [ '1', '3', '-6', null, null, '-3', false ], 203 [ '2', '3', '-6', null, null, '0', false ], 204 [ '2', '3', '1', null, null, '1', false ], 205 [ '5', '3', '1', null, null, '1', false ], 206 [ '3', '2', '-6', null, null, '2', false ], 207 [ '5', '2', '-6', null, null, '4', false ], 208 [ '6', '2', '1', null, null, '5', false ], 209 [ '8', '3', '1', null, null, '4', false ], 210 [ '9', '2', '-10', null, null, '8', false ], 211 [ '7', '3', '-10', null, null, '5', false ], 212 [ '-2', '3', '-10', null, null, '-4', false ], 213 // Clamping. 214 [ '0', '2', '-1', null, null, '-1', false ], 215 [ '10', '2', '0', '4', '10', '0', false ], 216 [ '10', '2', '0', '4', '5', '0', false ], 217 // value = "" (default will be 50). 218 [ '', null, null, null, null, '49', false ], 219 // With step = 'any'. 220 [ '0', 'any', null, null, 1, null, true ], 221 [ '0', 'ANY', null, null, 1, null, true ], 222 [ '0', 'AnY', null, null, 1, null, true ], 223 [ '0', 'aNy', null, null, 1, null, true ], 224 // With @value = step base. 225 [ '1', '2', null, null, null, '1', false ], 226 ]}, 227 { type: 'date', data: [ 228 // Regular case. 229 [ '2012-07-09', null, null, null, null, '2012-07-08', false ], 230 // Argument testing. 231 [ '2012-07-09', null, null, null, 1, '2012-07-08', false ], 232 [ '2012-07-09', null, null, null, 5, '2012-07-04', false ], 233 [ '2012-07-09', null, null, null, -1, '2012-07-10', false ], 234 [ '2012-07-09', null, null, null, 0, '2012-07-09', false ], 235 // Month/Year wrapping. 236 [ '2012-08-01', null, null, null, 1, '2012-07-31', false ], 237 [ '1969-01-02', null, null, null, 4, '1968-12-29', false ], 238 [ '1969-01-01', null, null, null, -365, '1970-01-01', false ], 239 [ '2012-02-29', null, null, null, -1, '2012-03-01', false ], 240 // Float values are rounded to integer (1.1 -> 1). 241 [ '2012-01-02', null, null, null, 1.1, '2012-01-01', false ], 242 [ '2012-01-02', null, null, null, 1.9, '2012-01-01', false ], 243 // With step values. 244 [ '2012-01-03', '0.5', null, null, null, '2012-01-02', false ], 245 [ '2012-01-02', '0.5', null, null, null, '2012-01-01', false ], 246 [ '2012-01-01', '2', null, null, null, '2011-12-30', false ], 247 [ '2012-01-02', '0.25',null, null, 4, '2011-12-29', false ], 248 [ '2012-01-15', '1.1', '2012-01-01', null, 1, '2012-01-14', false ], 249 [ '2012-01-12', '1.1', '2012-01-01', null, 2, '2012-01-10', false ], 250 [ '2012-01-23', '1.1', '2012-01-01', null, 10, '2012-01-13', false ], 251 [ '2012-01-23', '1.1', '2012-01-01', null, 11, '2012-01-12', false ], 252 [ '1968-01-12', '1.1', '1968-01-01', null, 8, '1968-01-04', false ], 253 // step = 0 isn't allowed (-> step = 1). 254 [ '2012-01-02', '0', null, null, null, '2012-01-01', false ], 255 // step < 0 isn't allowed (-> step = 1). 256 [ '2012-01-02', '-1', null, null, null, '2012-01-01', false ], 257 // step = NaN isn't allowed (-> step = 1). 258 [ '2012-01-02', 'foo', null, null, null, '2012-01-01', false ], 259 // Min values testing. 260 [ '2012-01-03', '1', 'foo', null, 2, '2012-01-01', false ], 261 [ '2012-01-02', '1', '2012-01-01', null, null, '2012-01-01', false ], 262 [ '2012-01-01', '1', '2012-01-01', null, null, '2012-01-01', false ], 263 [ '2012-01-01', '1', '2012-01-10', null, 1, '2012-01-01', false ], 264 [ '2012-01-05', '3', '2012-01-01', null, null, '2012-01-04', false ], 265 [ '1969-01-01', '5', '1969-01-01', '1969-01-02', null, '1969-01-01', false ], 266 // Max values testing. 267 [ '2012-01-02', '1', null, 'foo', null, '2012-01-01', false ], 268 [ '2012-01-02', null, null, '2012-01-05', null, '2012-01-01', false ], 269 [ '2012-01-03', null, null, '2012-01-03', null, '2012-01-02', false ], 270 [ '2012-01-07', null, null, '2012-01-04', 4, '2012-01-03', false ], 271 [ '2012-01-07', '2', null, '2012-01-04', 3, '2012-01-01', false ], 272 // Step mismatch. 273 [ '2012-01-04', '2', '2012-01-01', null, null, '2012-01-03', false ], 274 [ '2012-01-06', '2', '2012-01-01', null, 2, '2012-01-03', false ], 275 [ '2012-01-05', '2', '2012-01-04', '2012-01-08', null, '2012-01-04', false ], 276 [ '1970-01-04', '2', null, null, null, '1970-01-02', false ], 277 [ '1970-01-09', '3', null, null, null, '1970-01-06', false ], 278 // Clamping. 279 [ '2012-05-01', null, null, '2012-01-05', null, '2012-01-05', false ], 280 [ '1970-01-05', '2', '1970-01-02', '1970-01-05', null, '1970-01-04', false ], 281 [ '1970-01-01', '5', '1970-01-02', '1970-01-09', 10, '1970-01-01', false ], 282 [ '1970-01-07', '5', '1969-12-27', '1970-01-06', 2, '1970-01-01', false ], 283 [ '1970-03-08', '3', '1970-02-01', '1970-02-07', 15, '1970-02-01', false ], 284 [ '1970-01-10', '3', '1970-01-01', '1970-01-06', 2, '1970-01-04', false ], 285 // value = "" (NaN). 286 [ '', null, null, null, null, '1969-12-31', false ], 287 // With step = 'any'. 288 [ '2012-01-01', 'any', null, null, 1, null, true ], 289 [ '2012-01-01', 'ANY', null, null, 1, null, true ], 290 [ '2012-01-01', 'AnY', null, null, 1, null, true ], 291 [ '2012-01-01', 'aNy', null, null, 1, null, true ], 292 ]}, 293 { type: 'time', data: [ 294 // Regular case. 295 [ '16:39', null, null, null, null, '16:38', false ], 296 // Argument testing. 297 [ '16:40', null, null, null, 1, '16:39', false ], 298 [ '16:40', null, null, null, 5, '16:35', false ], 299 [ '16:40', null, null, null, -1, '16:41', false ], 300 [ '16:40', null, null, null, 0, '16:40', false ], 301 // hour/minutes/seconds wrapping. 302 [ '05:00', null, null, null, null, '04:59', false ], 303 [ '05:00:00', 1, null, null, null, '04:59:59', false ], 304 [ '05:00:00', 0.1, null, null, null, '04:59:59.900', false ], 305 [ '05:00:00', 0.01, null, null, null, '04:59:59.990', false ], 306 [ '05:00:00', 0.001, null, null, null, '04:59:59.999', false ], 307 // stepDown() on '00:00' gives '23:59'. 308 [ '00:00', null, null, null, 1, '23:59', false ], 309 [ '00:00', null, null, null, 3, '23:57', false ], 310 // Some random step values.. 311 [ '16:56', '0.5', null, null, null, '16:55:59.500', false ], 312 [ '16:56', '2', null, null, null, '16:55:58', false ], 313 [ '16:56', '0.25',null, null, 4, '16:55:59', false ], 314 [ '16:57', '1.1', '16:00', null, 1, '16:56:59.900', false ], 315 [ '16:57', '1.1', '16:00', null, 2, '16:56:58.800', false ], 316 [ '16:57', '1.1', '16:00', null, 10, '16:56:50', false ], 317 [ '16:57', '1.1', '16:00', null, 11, '16:56:48.900', false ], 318 [ '16:57', '1.1', '16:00', null, 8, '16:56:52.200', false ], 319 // Invalid @step, means that we use the default value. 320 [ '17:01', '0', null, null, null, '17:00', false ], 321 [ '17:01', '-1', null, null, null, '17:00', false ], 322 [ '17:01', 'foo', null, null, null, '17:00', false ], 323 // Min values testing. 324 [ '17:02', '60', 'foo', null, 2, '17:00', false ], 325 [ '17:10', '60', '17:09', null, null, '17:09', false ], 326 [ '17:10', '60', '17:10', null, null, '17:10', false ], 327 [ '17:10', '60', '17:30', null, 1, '17:10', false ], 328 [ '17:10', '180', '17:05', null, null, '17:08', false ], 329 [ '17:10', '300', '17:10', '17:11', null, '17:10', false ], 330 // Max values testing. 331 [ '17:15', '60', null, 'foo', null, '17:14', false ], 332 [ '17:15', null, null, '17:20', null, '17:14', false ], 333 [ '17:15', null, null, '17:15', null, '17:14', false ], 334 [ '17:15', null, null, '17:13', 4, '17:11', false ], 335 [ '17:15', '120', null, '17:13', 3, '17:09', false ], 336 // Step mismatch. 337 [ '17:19', '120', '17:10', null, null, '17:18', false ], 338 [ '17:19', '120', '17:10', null, 2, '17:16', false ], 339 [ '17:19', '120', '17:18', '17:25', null, '17:18', false ], 340 [ '17:19', '120', null, null, null, '17:17', false ], 341 [ '17:19', '180', null, null, null, '17:16', false ], 342 // Clamping. 343 [ '17:22', null, null, '17:11', null, '17:11', false ], 344 [ '17:22', '120', '17:20', '17:22', null, '17:20', false ], 345 [ '17:22', '300', '17:12', '17:20', 10, '17:12', false ], 346 [ '17:22', '300', '17:18', '17:20', 2, '17:18', false ], 347 [ '17:22', '180', '17:00', '17:20', 15, '17:00', false ], 348 [ '17:22', '180', '17:10', '17:20', 2, '17:16', false ], 349 // value = "" (NaN). 350 [ '', null, null, null, null, '23:59', false ], 351 // With step = 'any'. 352 [ '17:26', 'any', null, null, 1, null, true ], 353 [ '17:26', 'ANY', null, null, 1, null, true ], 354 [ '17:26', 'AnY', null, null, 1, null, true ], 355 [ '17:26', 'aNy', null, null, 1, null, true ], 356 ]}, 357 { type: 'month', data: [ 358 // Regular case. 359 [ '2016-08', null, null, null, null, '2016-07', false ], 360 // Argument testing. 361 [ '2016-08', null, null, null, 1, '2016-07', false ], 362 [ '2016-08', null, null, null, 5, '2016-03', false ], 363 [ '2016-08', null, null, null, -1, '2016-09', false ], 364 [ '2016-08', null, null, null, 0, '2016-08', false ], 365 // Month/Year wrapping. 366 [ '2016-01', null, null, null, 1, '2015-12', false ], 367 [ '1969-02', null, null, null, 4, '1968-10', false ], 368 [ '1969-01', null, null, null, -12, '1970-01', false ], 369 // Float values are rounded to integer (1.1 -> 1). 370 [ '2016-08', null, null, null, 1.1, '2016-07', false ], 371 [ '2016-01', null, null, null, 1.9, '2015-12', false ], 372 // With step values. 373 [ '2016-03', '0.5', null, null, null, '2016-02', false ], 374 [ '2016-03', '2', null, null, null, '2016-01', false ], 375 [ '2016-03', '0.25',null, null, 4, '2015-11', false ], 376 [ '2016-12', '1.1', '2016-01', null, 1, '2016-11', false ], 377 [ '2016-12', '1.1', '2016-01', null, 2, '2016-10', false ], 378 [ '2016-12', '1.1', '2016-01', null, 10, '2016-02', false ], 379 [ '2016-12', '1.1', '2016-01', null, 12, '2016-01', false ], 380 [ '1968-12', '1.1', '1968-01', null, 8, '1968-04', false ], 381 // step = 0 isn't allowed (-> step = 1). 382 [ '2016-02', '0', null, null, null, '2016-01', false ], 383 // step < 0 isn't allowed (-> step = 1). 384 [ '2016-02', '-1', null, null, null, '2016-01', false ], 385 // step = NaN isn't allowed (-> step = 1). 386 [ '2016-02', 'foo', null, null, null, '2016-01', false ], 387 // Min values testing. 388 [ '2016-03', '1', 'foo', null, 2, '2016-01', false ], 389 [ '2016-02', '1', '2016-01', null, null, '2016-01', false ], 390 [ '2016-01', '1', '2016-01', null, null, '2016-01', false ], 391 [ '2016-01', '1', '2016-01', null, 1, '2016-01', false ], 392 [ '2016-05', '3', '2016-01', null, null, '2016-04', false ], 393 [ '1969-01', '5', '1969-01', '1969-02', null, '1969-01', false ], 394 // Max values testing. 395 [ '2016-02', '1', null, 'foo', null, '2016-01', false ], 396 [ '2016-02', null, null, '2016-05', null, '2016-01', false ], 397 [ '2016-03', null, null, '2016-03', null, '2016-02', false ], 398 [ '2016-07', null, null, '2016-04', 4, '2016-03', false ], 399 [ '2016-07', '2', null, '2016-04', 3, '2016-01', false ], 400 // Step mismatch. 401 [ '2016-04', '2', '2016-01', null, null, '2016-03', false ], 402 [ '2016-06', '2', '2016-01', null, 2, '2016-03', false ], 403 [ '2016-05', '2', '2016-04', '2016-08', null, '2016-04', false ], 404 [ '1970-04', '2', null, null, null, '1970-02', false ], 405 [ '1970-09', '3', null, null, null, '1970-06', false ], 406 // Clamping. 407 [ '2016-05', null, null, '2016-01', null, '2016-01', false ], 408 [ '1970-05', '2', '1970-02', '1970-05', null, '1970-04', false ], 409 [ '1970-01', '5', '1970-02', '1970-09', 10, '1970-01', false ], 410 [ '1970-07', '5', '1969-12', '1970-10', 2, '1969-12', false ], 411 [ '1970-08', '3', '1970-01', '1970-07', 15, '1970-01', false ], 412 [ '1970-10', '3', '1970-01', '1970-06', 2, '1970-04', false ], 413 // value = "" (NaN). 414 [ '', null, null, null, null, '1969-12', false ], 415 // With step = 'any'. 416 [ '2016-01', 'any', null, null, 1, null, true ], 417 [ '2016-01', 'ANY', null, null, 1, null, true ], 418 [ '2016-01', 'AnY', null, null, 1, null, true ], 419 [ '2016-01', 'aNy', null, null, 1, null, true ], 420 ]}, 421 { type: 'week', data: [ 422 // Regular case. 423 [ '2016-W40', null, null, null, null, '2016-W39', false ], 424 // Argument testing. 425 [ '2016-W40', null, null, null, 1, '2016-W39', false ], 426 [ '2016-W40', null, null, null, 5, '2016-W35', false ], 427 [ '2016-W40', null, null, null, -1, '2016-W41', false ], 428 [ '2016-W40', null, null, null, 0, '2016-W40', false ], 429 // Week/Year wrapping. 430 [ '2016-W01', null, null, null, 1, '2015-W53', false ], 431 [ '1969-W02', null, null, null, 4, '1968-W50', false ], 432 [ '1969-W01', null, null, null, -52, '1970-W01', false ], 433 // Float values are rounded to integer (1.1 -> 1). 434 [ '2016-W40', null, null, null, 1.1, '2016-W39', false ], 435 [ '2016-W01', null, null, null, 1.9, '2015-W53', false ], 436 // With step values. 437 [ '2016-W03', '0.5', null, null, null, '2016-W02', false ], 438 [ '2016-W03', '2', null, null, null, '2016-W01', false ], 439 [ '2016-W03', '0.25', null, null, 4, '2015-W52', false ], 440 [ '2016-W52', '1.1', '2016-W01', null, 1, '2016-W51', false ], 441 [ '2016-W52', '1.1', '2016-W01', null, 2, '2016-W50', false ], 442 [ '2016-W52', '1.1', '2016-W01', null, 10, '2016-W42', false ], 443 [ '2016-W52', '1.1', '2016-W01', null, 52, '2016-W01', false ], 444 [ '1968-W52', '1.1', '1968-W01', null, 8, '1968-W44', false ], 445 // step = 0 isn't allowed (-> step = 1). 446 [ '2016-W02', '0', null, null, null, '2016-W01', false ], 447 // step < 0 isn't allowed (-> step = 1). 448 [ '2016-W02', '-1', null, null, null, '2016-W01', false ], 449 // step = NaN isn't allowed (-> step = 1). 450 [ '2016-W02', 'foo', null, null, null, '2016-W01', false ], 451 // Min values testing. 452 [ '2016-W03', '1', 'foo', null, 2, '2016-W01', false ], 453 [ '2016-W02', '1', '2016-01', null, null, '2016-W01', false ], 454 [ '2016-W01', '1', '2016-W01', null, null, '2016-W01', false ], 455 [ '2016-W01', '1', '2016-W01', null, 1, '2016-W01', false ], 456 [ '2016-W05', '3', '2016-W01', null, null, '2016-W04', false ], 457 [ '1969-W01', '5', '1969-W01', '1969-W02', null, '1969-W01', false ], 458 // Max values testing. 459 [ '2016-W02', '1', null, 'foo', null, '2016-W01', false ], 460 [ '2016-W02', null, null, '2016-W05', null, '2016-W01', false ], 461 [ '2016-W03', null, null, '2016-W03', null, '2016-W02', false ], 462 [ '2016-W07', null, null, '2016-W04', 4, '2016-W03', false ], 463 [ '2016-W07', '2', null, '2016-W04', 3, '2016-W01', false ], 464 // Step mismatch. 465 [ '2016-W04', '2', '2016-W01', null, null, '2016-W03', false ], 466 [ '2016-W06', '2', '2016-W01', null, 2, '2016-W03', false ], 467 [ '2016-W05', '2', '2016-W04', '2016-W08', null, '2016-W04', false ], 468 [ '1970-W04', '2', null, null, null, '1970-W02', false ], 469 [ '1970-W09', '3', null, null, null, '1970-W06', false ], 470 // Clamping. 471 [ '2016-W05', null, null, '2016-W01', null, '2016-W01', false ], 472 [ '1970-W05', '2', '1970-W02', '1970-W05', null, '1970-W04', false ], 473 [ '1970-W01', '5', '1970-W02', '1970-W09', 10, '1970-W01', false ], 474 [ '1970-W07', '5', '1969-W52', '1970-W10', 2, '1969-W52', false ], 475 [ '1970-W08', '3', '1970-W01', '1970-W07', 15, '1970-W01', false ], 476 [ '1970-W10', '3', '1970-W01', '1970-W06', 2, '1970-W04', false ], 477 // value = "" (NaN). 478 [ '', null, null, null, null, '1970-W01', false ], 479 // With step = 'any'. 480 [ '2016-W01', 'any', null, null, 1, null, true ], 481 [ '2016-W01', 'ANY', null, null, 1, null, true ], 482 [ '2016-W01', 'AnY', null, null, 1, null, true ], 483 [ '2016-W01', 'aNy', null, null, 1, null, true ], 484 ]}, 485 { type: 'datetime-local', data: [ 486 // Regular case. 487 [ '2017-02-07T09:30', null, null, null, null, '2017-02-07T09:29', false ], 488 // Argument testing. 489 [ '2017-02-07T09:30', null, null, null, 1, '2017-02-07T09:29', false ], 490 [ '2017-02-07T09:30', null, null, null, 5, '2017-02-07T09:25', false ], 491 [ '2017-02-07T09:30', null, null, null, -1, '2017-02-07T09:31', false ], 492 [ '2017-02-07T09:30', null, null, null, 0, '2017-02-07T09:30', false ], 493 // hour/minutes/seconds wrapping. 494 [ '2000-01-01T05:00', null, null, null, null, '2000-01-01T04:59', false ], 495 [ '2000-01-01T05:00:00', 1, null, null, null, '2000-01-01T04:59:59', false ], 496 [ '2000-01-01T05:00:00', 0.1, null, null, null, '2000-01-01T04:59:59.900', false ], 497 [ '2000-01-01T05:00:00', 0.01, null, null, null, '2000-01-01T04:59:59.990', false ], 498 [ '2000-01-01T05:00:00', 0.001, null, null, null, '2000-01-01T04:59:59.999', false ], 499 // month/year wrapping. 500 [ '2012-08-01T12:00', null, null, null, 1440, '2012-07-31T12:00', false ], 501 [ '1969-01-02T12:00', null, null, null, 5760, '1968-12-29T12:00', false ], 502 [ '1969-12-31T00:00', null, null, null, -1440, '1970-01-01T00:00', false ], 503 [ '2012-02-29T00:00', null, null, null, -1440, '2012-03-01T00:00', false ], 504 // stepDown() on '00:00' gives '23:59'. 505 [ '2017-02-07T00:00', null, null, null, 1, '2017-02-06T23:59', false ], 506 [ '2017-02-07T00:00', null, null, null, 3, '2017-02-06T23:57', false ], 507 // Some random step values.. 508 [ '2017-02-07T16:07', '0.5', null, null, null, '2017-02-07T16:06:59.500', false ], 509 [ '2017-02-07T16:07', '2', null, null, null, '2017-02-07T16:06:58', false ], 510 [ '2017-02-07T16:07', '0.25', null, null, 4, '2017-02-07T16:06:59', false ], 511 [ '2017-02-07T16:07', '1.1', '2017-02-07T16:00', null, 1, '2017-02-07T16:06:59.100', false ], 512 [ '2017-02-07T16:07', '1.1', '2017-02-07T16:00', null, 2, '2017-02-07T16:06:58', false ], 513 [ '2017-02-07T16:07', '1.1', '2017-02-07T16:00', null, 10, '2017-02-07T16:06:49.200', false ], 514 [ '2017-02-07T16:07', '129600', '2017-02-01T00:00', null, 2, '2017-02-05T12:00', false ], 515 // step = 0 isn't allowed (-> step = 1). 516 [ '2017-02-07T10:15', '0', null, null, null, '2017-02-07T10:14', false ], 517 // step < 0 isn't allowed (-> step = 1). 518 [ '2017-02-07T10:15', '-1', null, null, null, '2017-02-07T10:14', false ], 519 // step = NaN isn't allowed (-> step = 1). 520 [ '2017-02-07T10:15', 'foo', null, null, null, '2017-02-07T10:14', false ], 521 // Min values testing. 522 [ '2012-02-02T17:02', '60', 'foo', null, 2, '2012-02-02T17:00', false ], 523 [ '2012-02-02T17:10', '60', '2012-02-02T17:09', null, null, '2012-02-02T17:09', false ], 524 [ '2012-02-02T17:10', '60', '2012-02-02T17:10', null, null, '2012-02-02T17:10', false ], 525 [ '2012-02-02T17:10', '60', '2012-02-02T17:30', null, 1, '2012-02-02T17:10', false ], 526 [ '2012-02-02T17:10', '180', '2012-02-02T17:05', null, null, '2012-02-02T17:08', false ], 527 [ '2012-02-03T20:05', '86400', '2012-02-02T17:05', null, null, '2012-02-03T17:05', false ], 528 [ '2012-02-03T18:00', '129600', '2012-02-01T00:00', null, null, '2012-02-02T12:00', false ], 529 // Max values testing. 530 [ '2012-02-02T17:15', '60', null, 'foo', null, '2012-02-02T17:14', false ], 531 [ '2012-02-02T17:15', null, null, '2012-02-02T17:20', null, '2012-02-02T17:14', false ], 532 [ '2012-02-02T17:15', null, null, '2012-02-02T17:15', null, '2012-02-02T17:14', false ], 533 [ '2012-02-02T17:15', null, null, '2012-02-02T17:13', 4, '2012-02-02T17:11', false ], 534 [ '2012-02-02T17:15', '120', null, '2012-02-02T17:13', 3, '2012-02-02T17:09', false ], 535 [ '2012-02-03T20:05', '86400', null, '2012-02-03T20:05', null, '2012-02-02T20:05', false ], 536 [ '2012-02-03T18:00', '129600', null, '2012-02-03T20:00', null, '2012-02-02T06:00', false ], 537 // Step mismatch. 538 [ '2017-02-07T17:19', '120', '2017-02-07T17:10', null, null, '2017-02-07T17:18', false ], 539 [ '2017-02-07T17:19', '120', '2017-02-07T17:10', null, 2, '2017-02-07T17:16', false ], 540 [ '2017-02-07T17:19', '120', '2017-02-07T17:18', '2017-02-07T17:25', null, '2017-02-07T17:18', false ], 541 [ '2017-02-07T17:19', '120', null, null, null, '2017-02-07T17:17', false ], 542 [ '2017-02-07T17:19', '180', null, null, null, '2017-02-07T17:16', false ], 543 [ '2017-02-07T17:19', '172800', '2017-02-02T17:19', '2017-02-10T17:19', null, '2017-02-06T17:19', false ], 544 // Clamping. 545 [ '2017-02-07T17:22', null, null, '2017-02-07T17:11', null, '2017-02-07T17:11', false ], 546 [ '2017-02-07T17:22', '120', '2017-02-07T17:20', '2017-02-07T17:22', null, '2017-02-07T17:20', false ], 547 [ '2017-02-07T17:22', '300', '2017-02-07T17:12', '2017-02-07T17:20', 10, '2017-02-07T17:12', false ], 548 [ '2017-02-07T17:22', '300', '2017-02-07T17:18', '2017-02-07T17:20', 2, '2017-02-07T17:18', false ], 549 [ '2017-02-07T17:22', '600', '2017-02-02T17:00', '2017-02-07T17:00', 15, '2017-02-07T15:00', false ], 550 [ '2017-02-07T17:22', '600', '2017-02-02T17:00', '2017-02-07T17:00', 2, '2017-02-07T17:00', false ], 551 // value = "" (NaN). 552 [ '', null, null, null, null, '1969-12-31T23:59', false ], 553 // With step = 'any'. 554 [ '2017-02-07T15:20', 'any', null, null, 1, null, true ], 555 [ '2017-02-07T15:20', 'ANY', null, null, 1, null, true ], 556 [ '2017-02-07T15:20', 'AnY', null, null, 1, null, true ], 557 [ '2017-02-07T15:20', 'aNy', null, null, 1, null, true ], 558 ]}, 559 ]; 560 561 for (var test of testData) { 562 for (var data of test.data) { 563 var element = document.createElement("input"); 564 element.type = test.type; 565 566 if (data[1] != null) { 567 element.step = data[1]; 568 } 569 570 if (data[2] != null) { 571 element.min = data[2]; 572 } 573 574 if (data[3] != null) { 575 element.max = data[3]; 576 } 577 578 // Set 'value' last for type=range, because the final sanitized value 579 // after setting 'step', 'min' and 'max' can be affected by the order in 580 // which those attributes are set. Setting 'value' last makes it simpler 581 // to reason about what the final value should be. 582 if (data[0] != null) { 583 element.setAttribute('value', data[0]); 584 } 585 586 var exceptionCaught = false; 587 try { 588 if (data[4] != null) { 589 element.stepDown(data[4]); 590 } else { 591 element.stepDown(); 592 } 593 594 is(element.value, data[5], "The value for type=" + test.type + " should be " + data[5]); 595 } catch (e) { 596 exceptionCaught = true; 597 is(element.value, data[0], e.name + "The value should not have changed"); 598 is(e.name, 'InvalidStateError', 599 "It should be a InvalidStateError exception."); 600 } finally { 601 is(exceptionCaught, data[6], "exception status should be " + data[6]); 602 } 603 } 604 } 605 } 606 607 function checkStepUp() 608 { 609 // This testData is very similar to the one in checkStepDown with some changes 610 // relative to stepUp. 611 var testData = [ 612 /* Initial value | step | min | max | stepUp arg | final value | exception */ 613 { type: 'number', data: [ 614 // Regular case. 615 [ '1', null, null, null, null, '2', false ], 616 // Argument testing. 617 [ '1', null, null, null, 1, '2', false ], 618 [ '9', null, null, null, 9, '18', false ], 619 [ '1', null, null, null, -1, '0', false ], 620 [ '1', null, null, null, 0, '1', false ], 621 // Float values are rounded to integer (1.1 -> 1). 622 [ '1', null, null, null, 1.1, '2', false ], 623 // With step values. 624 [ '1', '0.5', null, null, null, '1.5', false ], 625 [ '1', '0.25', null, null, 4, '2', false ], 626 // step = 0 isn't allowed (-> step = 1). 627 [ '1', '0', null, null, null, '2', false ], 628 // step < 0 isn't allowed (-> step = 1). 629 [ '1', '-1', null, null, null, '2', false ], 630 // step = NaN isn't allowed (-> step = 1). 631 [ '1', 'foo', null, null, null, '2', false ], 632 // Min values testing. 633 [ '1', '1', 'foo', null, null, '2', false ], 634 [ '1', null, '-10', null, null, '2', false ], 635 [ '1', null, '0', null, null, '2', false ], 636 [ '1', null, '10', null, null, '10', false ], 637 [ '1', null, '2', null, null, '2', false ], 638 [ '1', null, '1', null, null, '2', false ], 639 [ '0', null, '4', null, '5', '5', false ], 640 [ '0', '2', '5', null, '3', '5', false ], 641 // Max values testing. 642 [ '1', '1', null, 'foo', null, '2', false ], 643 [ '1', null, null, '10', null, '2', false ], 644 [ '1', null, null, '0', null, '1', false ], 645 [ '1', null, null, '-10', null, '1', false ], 646 [ '1', null, null, '1', null, '1', false ], 647 [ '-3', '5', '-10', '-3', null, '-3', false ], 648 // Step mismatch. 649 [ '1', '2', '0', null, null, '2', false ], 650 [ '1', '2', '0', null, '2', '4', false ], 651 [ '8', '2', null, '9', null, '8', false ], 652 [ '-3', '2', '-6', null, null, '-2', false ], 653 [ '9', '3', '-10', null, null, '11', false ], 654 [ '7', '3', '-10', null, null, '8', false ], 655 [ '7', '3', '5', null, null, '8', false ], 656 [ '9', '4', '3', null, null, '11', false ], 657 [ '-2', '3', '-6', null, null, '0', false ], 658 [ '7', '3', '6', null, null, '9', false ], 659 // Clamping. 660 [ '1', '2', '0', '3', null, '2', false ], 661 [ '0', '5', '1', '8', '10', '6', false ], 662 [ '-9', '3', '-8', '-1', '5', '-2', false ], 663 [ '-9', '3', '8', '15', '15', '14', false ], 664 [ '-1', '3', '-1', '4', '3', '2', false ], 665 [ '-3', '2', '-6', '-2', null, '-2', false ], 666 [ '-3', '2', '-6', '-1', null, '-2', false ], 667 // value = "" (NaN). 668 [ '', null, null, null, null, '1', false ], 669 [ '', null, null, null, null, '1', false ], 670 [ '', '2', null, null, null, '2', false ], 671 [ '', '2', '3', null, null, '3', false ], 672 [ '', null, '3', null, null, '3', false ], 673 [ '', '2', '3', '8', null, '3', false ], 674 [ '', null, '-10', '10', null, '1', false ], 675 [ '', '3', '-10', '10', null, '2', false ], 676 // With step = 'any'. 677 [ '0', 'any', null, null, 1, null, true ], 678 [ '0', 'ANY', null, null, 1, null, true ], 679 [ '0', 'AnY', null, null, 1, null, true ], 680 [ '0', 'aNy', null, null, 1, null, true ], 681 // With @value = step base. 682 [ '1', '2', null, null, null, '3', false ], 683 ]}, 684 { type: 'range', data: [ 685 // Regular case. 686 [ '1', null, null, null, null, '2', false ], 687 // Argument testing. 688 [ '1', null, null, null, 1, '2', false ], 689 [ '9', null, null, null, 9, '18', false ], 690 [ '1', null, null, null, -1, '0', false ], 691 [ '1', null, null, null, 0, '1', false ], 692 // Float values are rounded to integer (1.1 -> 1). 693 [ '1', null, null, null, 1.1, '2', false ], 694 // With step values. 695 [ '1', '0.5', null, null, null, '1.5', false ], 696 [ '1', '0.25', null, null, 4, '2', false ], 697 // step = 0 isn't allowed (-> step = 1). 698 [ '1', '0', null, null, null, '2', false ], 699 // step < 0 isn't allowed (-> step = 1). 700 [ '1', '-1', null, null, null, '2', false ], 701 // step = NaN isn't allowed (-> step = 1). 702 [ '1', 'foo', null, null, null, '2', false ], 703 // Min values testing. 704 [ '1', '1', 'foo', null, null, '2', false ], 705 [ '1', null, '-10', null, null, '2', false ], 706 [ '1', null, '0', null, null, '2', false ], 707 [ '1', null, '10', null, null, '11', false ], 708 [ '1', null, '2', null, null, '3', false ], 709 [ '1', null, '1', null, null, '2', false ], 710 [ '0', null, '4', null, '5', '9', false ], 711 [ '0', '2', '5', null, '3', '11', false ], 712 // Max values testing. 713 [ '1', '1', null, 'foo', null, '2', false ], 714 [ '1', null, null, '10', null, '2', false ], 715 [ '1', null, null, '0', null, '0', false ], 716 [ '1', null, null, '-10', null, '0', false ], 717 [ '1', null, null, '1', null, '1', false ], 718 [ '-3', '5', '-10', '-3', null, '-5', false ], 719 // Step mismatch. 720 [ '1', '2', '0', null, null, '4', false ], 721 [ '1', '2', '0', null, '2', '6', false ], 722 [ '8', '2', null, '9', null, '8', false ], 723 [ '-3', '2', '-6', null, null, '0', false ], 724 [ '9', '3', '-10', null, null, '11', false ], 725 [ '7', '3', '-10', null, null, '11', false ], 726 [ '7', '3', '5', null, null, '11', false ], 727 [ '9', '4', '3', null, null, '15', false ], 728 [ '-2', '3', '-6', null, null, '0', false ], 729 [ '7', '3', '6', null, null, '9', false ], 730 // Clamping. 731 [ '1', '2', '0', '3', null, '2', false ], 732 [ '0', '5', '1', '8', '10', '6', false ], 733 [ '-9', '3', '-8', '-1', '5', '-2', false ], 734 [ '-9', '3', '8', '15', '15', '14', false ], 735 [ '-1', '3', '-1', '4', '3', '2', false ], 736 [ '-3', '2', '-6', '-2', null, '-2', false ], 737 [ '-3', '2', '-6', '-1', null, '-2', false ], 738 // value = "" (default will be 50). 739 [ '', null, null, null, null, '51', false ], 740 // With step = 'any'. 741 [ '0', 'any', null, null, 1, null, true ], 742 [ '0', 'ANY', null, null, 1, null, true ], 743 [ '0', 'AnY', null, null, 1, null, true ], 744 [ '0', 'aNy', null, null, 1, null, true ], 745 // With @value = step base. 746 [ '1', '2', null, null, null, '3', false ], 747 ]}, 748 { type: 'date', data: [ 749 // Regular case. 750 [ '2012-07-09', null, null, null, null, '2012-07-10', false ], 751 // Argument testing. 752 [ '2012-07-09', null, null, null, 1, '2012-07-10', false ], 753 [ '2012-07-09', null, null, null, 9, '2012-07-18', false ], 754 [ '2012-07-09', null, null, null, -1, '2012-07-08', false ], 755 [ '2012-07-09', null, null, null, 0, '2012-07-09', false ], 756 // Month/Year wrapping. 757 [ '2012-07-31', null, null, null, 1, '2012-08-01', false ], 758 [ '1968-12-29', null, null, null, 4, '1969-01-02', false ], 759 [ '1970-01-01', null, null, null, -365, '1969-01-01', false ], 760 [ '2012-03-01', null, null, null, -1, '2012-02-29', false ], 761 // Float values are rounded to integer (1.1 -> 1). 762 [ '2012-01-01', null, null, null, 1.1, '2012-01-02', false ], 763 [ '2012-01-01', null, null, null, 1.9, '2012-01-02', false ], 764 // With step values. 765 [ '2012-01-01', '0.5', null, null, null, '2012-01-02', false ], 766 [ '2012-01-01', '2', null, null, null, '2012-01-03', false ], 767 [ '2012-01-01', '0.25', null, null, 4, '2012-01-05', false ], 768 [ '2012-01-01', '1.1', '2012-01-01', null, 1, '2012-01-02', false ], 769 [ '2012-01-01', '1.1', '2012-01-01', null, 2, '2012-01-03', false ], 770 [ '2012-01-01', '1.1', '2012-01-01', null, 10, '2012-01-11', false ], 771 [ '2012-01-01', '1.1', '2012-01-01', null, 11, '2012-01-12', false ], 772 // step = 0 isn't allowed (-> step = 1). 773 [ '2012-01-01', '0', null, null, null, '2012-01-02', false ], 774 // step < 0 isn't allowed (-> step = 1). 775 [ '2012-01-01', '-1', null, null, null, '2012-01-02', false ], 776 // step = NaN isn't allowed (-> step = 1). 777 [ '2012-01-01', 'foo', null, null, null, '2012-01-02', false ], 778 // Min values testing. 779 [ '2012-01-01', '1', 'foo', null, null, '2012-01-02', false ], 780 [ '2012-01-01', null, '2011-12-01', null, null, '2012-01-02', false ], 781 [ '2012-01-01', null, '2012-01-02', null, null, '2012-01-02', false ], 782 [ '2012-01-01', null, '2012-01-01', null, null, '2012-01-02', false ], 783 [ '2012-01-01', null, '2012-01-04', null, 4, '2012-01-05', false ], 784 [ '2012-01-01', '2', '2012-01-04', null, 3, '2012-01-06', false ], 785 // Max values testing. 786 [ '2012-01-01', '1', null, 'foo', 2, '2012-01-03', false ], 787 [ '2012-01-01', '1', null, '2012-01-10', 1, '2012-01-02', false ], 788 [ '2012-01-02', null, null, '2012-01-01', null, '2012-01-02', false ], 789 [ '2012-01-02', null, null, '2012-01-02', null, '2012-01-02', false ], 790 [ '1969-01-02', '5', '1969-01-01', '1969-01-02', null, '1969-01-02', false ], 791 // Step mismatch. 792 [ '2012-01-02', '2', '2012-01-01', null, null, '2012-01-03', false ], 793 [ '2012-01-02', '2', '2012-01-01', null, 2, '2012-01-05', false ], 794 [ '2012-01-05', '2', '2012-01-01', '2012-01-06', null, '2012-01-05', false ], 795 [ '1970-01-02', '2', null, null, null, '1970-01-04', false ], 796 [ '1970-01-05', '3', null, null, null, '1970-01-08', false ], 797 [ '1970-01-03', '3', null, null, null, '1970-01-06', false ], 798 [ '1970-01-03', '3', '1970-01-02', null, null, '1970-01-05', false ], 799 // Clamping. 800 [ '2012-01-01', null, '2012-01-31', null, null, '2012-01-31', false ], 801 [ '1970-01-02', '2', '1970-01-01', '1970-01-04', null, '1970-01-03', false ], 802 [ '1970-01-01', '5', '1970-01-02', '1970-01-09', 10, '1970-01-07', false ], 803 [ '1969-12-28', '5', '1969-12-29', '1970-01-06', 3, '1970-01-03', false ], 804 [ '1970-01-01', '3', '1970-02-01', '1970-02-07', 15, '1970-02-07', false ], 805 [ '1970-01-01', '3', '1970-01-01', '1970-01-06', 2, '1970-01-04', false ], 806 // value = "" (NaN). 807 [ '', null, null, null, null, '1970-01-02', false ], 808 // With step = 'any'. 809 [ '2012-01-01', 'any', null, null, 1, null, true ], 810 [ '2012-01-01', 'ANY', null, null, 1, null, true ], 811 [ '2012-01-01', 'AnY', null, null, 1, null, true ], 812 [ '2012-01-01', 'aNy', null, null, 1, null, true ], 813 ]}, 814 { type: 'time', data: [ 815 // Regular case. 816 [ '16:39', null, null, null, null, '16:40', false ], 817 // Argument testing. 818 [ '16:40', null, null, null, 1, '16:41', false ], 819 [ '16:40', null, null, null, 5, '16:45', false ], 820 [ '16:40', null, null, null, -1, '16:39', false ], 821 [ '16:40', null, null, null, 0, '16:40', false ], 822 // hour/minutes/seconds wrapping. 823 [ '04:59', null, null, null, null, '05:00', false ], 824 [ '04:59:59', 1, null, null, null, '05:00', false ], 825 [ '04:59:59.900', 0.1, null, null, null, '05:00', false ], 826 [ '04:59:59.990', 0.01, null, null, null, '05:00', false ], 827 [ '04:59:59.999', 0.001, null, null, null, '05:00', false ], 828 // stepUp() on '23:59' gives '00:00'. 829 [ '23:59', null, null, null, 1, '00:00', false ], 830 [ '23:59', null, null, null, 3, '00:02', false ], 831 // Some random step values.. 832 [ '16:56', '0.5', null, null, null, '16:56:00.500', false ], 833 [ '16:56', '2', null, null, null, '16:56:02', false ], 834 [ '16:56', '0.25',null, null, 4, '16:56:01', false ], 835 [ '16:57', '1.1', '16:00', null, 1, '16:57:01', false ], 836 [ '16:57', '1.1', '16:00', null, 2, '16:57:02.100', false ], 837 [ '16:57', '1.1', '16:00', null, 10, '16:57:10.900', false ], 838 [ '16:57', '1.1', '16:00', null, 11, '16:57:12', false ], 839 [ '16:57', '1.1', '16:00', null, 8, '16:57:08.700', false ], 840 // Invalid @step, means that we use the default value. 841 [ '17:01', '0', null, null, null, '17:02', false ], 842 [ '17:01', '-1', null, null, null, '17:02', false ], 843 [ '17:01', 'foo', null, null, null, '17:02', false ], 844 // Min values testing. 845 [ '17:02', '60', 'foo', null, 2, '17:04', false ], 846 [ '17:10', '60', '17:09', null, null, '17:11', false ], 847 [ '17:10', '60', '17:10', null, null, '17:11', false ], 848 [ '17:10', '60', '17:30', null, 1, '17:30', false ], 849 [ '17:10', '180', '17:05', null, null, '17:11', false ], 850 [ '17:10', '300', '17:10', '17:11', null,'17:10', false ], 851 // Max values testing. 852 [ '17:15', '60', null, 'foo', null, '17:16', false ], 853 [ '17:15', null, null, '17:20', null, '17:16', false ], 854 [ '17:15', null, null, '17:15', null, '17:15', false ], 855 [ '17:15', null, null, '17:13', 4, '17:15', false ], 856 [ '17:15', '120', null, '17:13', 3, '17:15', false ], 857 // Step mismatch. 858 [ '17:19', '120', '17:10', null, null, '17:20', false ], 859 [ '17:19', '120', '17:10', null, 2, '17:22', false ], 860 [ '17:19', '120', '17:18', '17:25', null, '17:20', false ], 861 [ '17:19', '120', null, null, null, '17:21', false ], 862 [ '17:19', '180', null, null, null, '17:22', false ], 863 // Clamping. 864 [ '17:22', null, null, '17:11', null, '17:22', false ], 865 [ '17:22', '120', '17:20', '17:22', null, '17:22', false ], 866 [ '17:22', '300', '17:12', '17:20', 10, '17:22', false ], 867 [ '17:22', '300', '17:18', '17:20', 2, '17:22', false ], 868 [ '17:22', '180', '17:00', '17:20', 15, '17:22', false ], 869 [ '17:22', '180', '17:10', '17:20', 2, '17:22', false ], 870 // value = "" (NaN). 871 [ '', null, null, null, null, '00:01', false ], 872 // With step = 'any'. 873 [ '17:26', 'any', null, null, 1, null, true ], 874 [ '17:26', 'ANY', null, null, 1, null, true ], 875 [ '17:26', 'AnY', null, null, 1, null, true ], 876 [ '17:26', 'aNy', null, null, 1, null, true ], 877 ]}, 878 { type: 'month', data: [ 879 // Regular case. 880 [ '2016-08', null, null, null, null, '2016-09', false ], 881 // Argument testing. 882 [ '2016-08', null, null, null, 1, '2016-09', false ], 883 [ '2016-08', null, null, null, 9, '2017-05', false ], 884 [ '2016-08', null, null, null, -1, '2016-07', false ], 885 [ '2016-08', null, null, null, 0, '2016-08', false ], 886 // Month/Year wrapping. 887 [ '2015-12', null, null, null, 1, '2016-01', false ], 888 [ '1968-12', null, null, null, 4, '1969-04', false ], 889 [ '1970-01', null, null, null, -12, '1969-01', false ], 890 // Float values are rounded to integer (1.1 -> 1). 891 [ '2016-01', null, null, null, 1.1, '2016-02', false ], 892 [ '2016-01', null, null, null, 1.9, '2016-02', false ], 893 // With step values. 894 [ '2016-01', '0.5', null, null, null, '2016-02', false ], 895 [ '2016-01', '2', null, null, null, '2016-03', false ], 896 [ '2016-01', '0.25', null, null, 4, '2016-05', false ], 897 [ '2016-01', '1.1', '2016-01', null, 1, '2016-02', false ], 898 [ '2016-01', '1.1', '2016-01', null, 2, '2016-03', false ], 899 [ '2016-01', '1.1', '2016-01', null, 10, '2016-11', false ], 900 [ '2016-01', '1.1', '2016-01', null, 11, '2016-12', false ], 901 // step = 0 isn't allowed (-> step = 1). 902 [ '2016-01', '0', null, null, null, '2016-02', false ], 903 // step < 0 isn't allowed (-> step = 1). 904 [ '2016-01', '-1', null, null, null, '2016-02', false ], 905 // step = NaN isn't allowed (-> step = 1). 906 [ '2016-01', 'foo', null, null, null, '2016-02', false ], 907 // Min values testing. 908 [ '2016-01', '1', 'foo', null, null, '2016-02', false ], 909 [ '2016-01', null, '2015-12', null, null, '2016-02', false ], 910 [ '2016-01', null, '2016-02', null, null, '2016-02', false ], 911 [ '2016-01', null, '2016-01', null, null, '2016-02', false ], 912 [ '2016-01', null, '2016-04', null, 4, '2016-05', false ], 913 [ '2016-01', '2', '2016-04', null, 3, '2016-06', false ], 914 // Max values testing. 915 [ '2016-01', '1', null, 'foo', 2, '2016-03', false ], 916 [ '2016-01', '1', null, '2016-02', 1, '2016-02', false ], 917 [ '2016-02', null, null, '2016-01', null, '2016-02', false ], 918 [ '2016-02', null, null, '2016-02', null, '2016-02', false ], 919 [ '1969-02', '5', '1969-01', '1969-02', null, '1969-02', false ], 920 // Step mismatch. 921 [ '2016-02', '2', '2016-01', null, null, '2016-03', false ], 922 [ '2016-02', '2', '2016-01', null, 2, '2016-05', false ], 923 [ '2016-05', '2', '2016-01', '2016-06', null, '2016-05', false ], 924 [ '1970-02', '2', null, null, null, '1970-04', false ], 925 [ '1970-05', '3', null, null, null, '1970-08', false ], 926 [ '1970-03', '3', null, null, null, '1970-06', false ], 927 [ '1970-03', '3', '1970-02', null, null, '1970-05', false ], 928 // Clamping. 929 [ '2016-01', null, '2016-12', null, null, '2016-12', false ], 930 [ '1970-02', '2', '1970-01', '1970-04', null, '1970-03', false ], 931 [ '1970-01', '5', '1970-02', '1970-09', 10, '1970-07', false ], 932 [ '1969-11', '5', '1969-12', '1970-06', 3, '1970-05', false ], 933 [ '1970-01', '3', '1970-02', '1971-07', 15, '1971-05', false ], 934 [ '1970-01', '3', '1970-01', '1970-06', 2, '1970-04', false ], 935 // value = "" (NaN). 936 [ '', null, null, null, null, '1970-02', false ], 937 // With step = 'any'. 938 [ '2016-01', 'any', null, null, 1, null, true ], 939 [ '2016-01', 'ANY', null, null, 1, null, true ], 940 [ '2016-01', 'AnY', null, null, 1, null, true ], 941 [ '2016-01', 'aNy', null, null, 1, null, true ], 942 ]}, 943 { type: 'week', data: [ 944 // Regular case. 945 [ '2016-W40', null, null, null, null, '2016-W41', false ], 946 // Argument testing. 947 [ '2016-W40', null, null, null, 1, '2016-W41', false ], 948 [ '2016-W40', null, null, null, 20, '2017-W08', false ], 949 [ '2016-W40', null, null, null, -1, '2016-W39', false ], 950 [ '2016-W40', null, null, null, 0, '2016-W40', false ], 951 // Week/Year wrapping. 952 [ '2015-W53', null, null, null, 1, '2016-W01', false ], 953 [ '1968-W52', null, null, null, 4, '1969-W04', false ], 954 [ '1970-W01', null, null, null, -52, '1969-W01', false ], 955 // Float values are rounded to integer (1.1 -> 1). 956 [ '2016-W01', null, null, null, 1.1, '2016-W02', false ], 957 [ '2016-W01', null, null, null, 1.9, '2016-W02', false ], 958 // With step values. 959 [ '2016-W01', '0.5', null, null, null, '2016-W02', false ], 960 [ '2016-W01', '2', null, null, null, '2016-W03', false ], 961 [ '2016-W01', '0.25', null, null, 4, '2016-W05', false ], 962 [ '2016-W01', '1.1', '2016-01', null, 1, '2016-W02', false ], 963 [ '2016-W01', '1.1', '2016-01', null, 2, '2016-W03', false ], 964 [ '2016-W01', '1.1', '2016-01', null, 10, '2016-W11', false ], 965 [ '2016-W01', '1.1', '2016-01', null, 20, '2016-W21', false ], 966 // step = 0 isn't allowed (-> step = 1). 967 [ '2016-W01', '0', null, null, null, '2016-W02', false ], 968 // step < 0 isn't allowed (-> step = 1). 969 [ '2016-W01', '-1', null, null, null, '2016-W02', false ], 970 // step = NaN isn't allowed (-> step = 1). 971 [ '2016-W01', 'foo', null, null, null, '2016-W02', false ], 972 // Min values testing. 973 [ '2016-W01', '1', 'foo', null, null, '2016-W02', false ], 974 [ '2016-W01', null, '2015-W53', null, null, '2016-W02', false ], 975 [ '2016-W01', null, '2016-W02', null, null, '2016-W02', false ], 976 [ '2016-W01', null, '2016-W01', null, null, '2016-W02', false ], 977 [ '2016-W01', null, '2016-W04', null, 4, '2016-W05', false ], 978 [ '2016-W01', '2', '2016-W04', null, 3, '2016-W06', false ], 979 // Max values testing. 980 [ '2016-W01', '1', null, 'foo', 2, '2016-W03', false ], 981 [ '2016-W01', '1', null, '2016-W02', 1, '2016-W02', false ], 982 [ '2016-W02', null, null, '2016-W01', null, '2016-W02', false ], 983 [ '2016-W02', null, null, '2016-W02', null, '2016-W02', false ], 984 [ '1969-W02', '5', '1969-W01', '1969-W02', null, '1969-W02', false ], 985 // Step mismatch. 986 [ '2016-W02', '2', '2016-W01', null, null, '2016-W03', false ], 987 [ '2016-W02', '2', '2016-W01', null, 2, '2016-W05', false ], 988 [ '2016-W05', '2', '2016-W01', '2016-W06', null, '2016-W05', false ], 989 [ '1970-W02', '2', null, null, null, '1970-W04', false ], 990 [ '1970-W05', '3', null, null, null, '1970-W08', false ], 991 [ '1970-W03', '3', null, null, null, '1970-W06', false ], 992 [ '1970-W03', '3', '1970-W02', null, null, '1970-W05', false ], 993 // Clamping. 994 [ '2016-W01', null, '2016-W52', null, null, '2016-W52', false ], 995 [ '1970-W02', '2', '1970-W01', '1970-W04', null, '1970-W03', false ], 996 [ '1970-W01', '5', '1970-W02', '1970-W09', 10, '1970-W07', false ], 997 [ '1969-W50', '5', '1969-W52', '1970-W06', 3, '1970-W05', false ], 998 [ '1970-W01', '3', '1970-W02', '1971-W07', 15, '1970-W44', false ], 999 [ '1970-W01', '3', '1970-W01', '1970-W06', 2, '1970-W04', false ], 1000 // value = "" (NaN). 1001 [ '', null, null, null, null, '1970-W02', false ], 1002 // With step = 'any'. 1003 [ '2016-W01', 'any', null, null, 1, null, true ], 1004 [ '2016-W01', 'ANY', null, null, 1, null, true ], 1005 [ '2016-W01', 'AnY', null, null, 1, null, true ], 1006 [ '2016-W01', 'aNy', null, null, 1, null, true ], 1007 ]}, 1008 { type: 'datetime-local', data: [ 1009 // Regular case. 1010 [ '2017-02-07T17:09', null, null, null, null, '2017-02-07T17:10', false ], 1011 // Argument testing. 1012 [ '2017-02-07T17:10', null, null, null, 1, '2017-02-07T17:11', false ], 1013 [ '2017-02-07T17:10', null, null, null, 5, '2017-02-07T17:15', false ], 1014 [ '2017-02-07T17:10', null, null, null, -1, '2017-02-07T17:09', false ], 1015 [ '2017-02-07T17:10', null, null, null, 0, '2017-02-07T17:10', false ], 1016 // hour/minutes/seconds wrapping. 1017 [ '2000-01-01T04:59', null, null, null, null, '2000-01-01T05:00', false ], 1018 [ '2000-01-01T04:59:59', 1, null, null, null, '2000-01-01T05:00', false ], 1019 [ '2000-01-01T04:59:59.900', 0.1, null, null, null, '2000-01-01T05:00', false ], 1020 [ '2000-01-01T04:59:59.990', 0.01, null, null, null, '2000-01-01T05:00', false ], 1021 [ '2000-01-01T04:59:59.999', 0.001, null, null, null, '2000-01-01T05:00', false ], 1022 // month/year wrapping. 1023 [ '2012-07-31T12:00', null, null, null, 1440, '2012-08-01T12:00', false ], 1024 [ '1968-12-29T12:00', null, null, null, 5760, '1969-01-02T12:00', false ], 1025 [ '1970-01-01T00:00', null, null, null, -1440, '1969-12-31T00:00', false ], 1026 [ '2012-03-01T00:00', null, null, null, -1440, '2012-02-29T00:00', false ], 1027 // stepUp() on '23:59' gives '00:00'. 1028 [ '2017-02-07T23:59', null, null, null, 1, '2017-02-08T00:00', false ], 1029 [ '2017-02-07T23:59', null, null, null, 3, '2017-02-08T00:02', false ], 1030 // Some random step values.. 1031 [ '2017-02-07T17:40', '0.5', null, null, null, '2017-02-07T17:40:00.500', false ], 1032 [ '2017-02-07T17:40', '2', null, null, null, '2017-02-07T17:40:02', false ], 1033 [ '2017-02-07T17:40', '0.25', null, null, 4, '2017-02-07T17:40:01', false ], 1034 [ '2017-02-07T17:40', '1.1', '2017-02-07T17:00', null, 1, '2017-02-07T17:40:00.200', false ], 1035 [ '2017-02-07T17:40', '1.1', '2017-02-07T17:00', null, 2, '2017-02-07T17:40:01.300', false ], 1036 [ '2017-02-07T17:40', '1.1', '2017-02-07T17:00', null, 10, '2017-02-07T17:40:10.100', false ], 1037 [ '2017-02-07T17:40', '129600', '2017-02-01T00:00', null, 2, '2017-02-10T00:00', false ], 1038 // step = 0 isn't allowed (-> step = 1). 1039 [ '2017-02-07T17:39', '0', null, null, null, '2017-02-07T17:40', false ], 1040 // step < 0 isn't allowed (-> step = 1). 1041 [ '2017-02-07T17:39', '-1', null, null, null, '2017-02-07T17:40', false ], 1042 // step = NaN isn't allowed (-> step = 1). 1043 [ '2017-02-07T17:39', 'foo', null, null, null, '2017-02-07T17:40', false ], 1044 // Min values testing. 1045 [ '2012-02-02T17:00', '60', 'foo', null, 2, '2012-02-02T17:02', false ], 1046 [ '2012-02-02T17:10', '60', '2012-02-02T17:10', null, null, '2012-02-02T17:11', false ], 1047 [ '2012-02-02T17:10', '60', '2012-02-02T17:30', null, 1, '2012-02-02T17:30', false ], 1048 [ '2012-02-02T17:10', '180', '2012-02-02T17:05', null, null, '2012-02-02T17:11', false ], 1049 [ '2012-02-02T17:10', '86400', '2012-02-02T17:05', null, null, '2012-02-03T17:05', false ], 1050 [ '2012-02-02T17:10', '129600', '2012-02-01T00:00', null, null, '2012-02-04T00:00', false ], 1051 // Max values testing. 1052 [ '2012-02-02T17:15', '60', null, 'foo', null, '2012-02-02T17:16', false ], 1053 [ '2012-02-02T17:15', null, null, '2012-02-02T17:20', null, '2012-02-02T17:16', false ], 1054 [ '2012-02-02T17:15', null, null, '2012-02-02T17:15', null, '2012-02-02T17:15', false ], 1055 [ '2012-02-02T17:15', null, null, '2012-02-02T17:13', 4, '2012-02-02T17:15', false ], 1056 [ '2012-02-02T20:05', '86400', null, '2012-02-03T20:05', null, '2012-02-03T20:05', false ], 1057 [ '2012-02-02T18:00', '129600', null, '2012-02-04T20:00', null, '2012-02-04T06:00', false ], 1058 // Step mismatch. 1059 [ '2017-02-07T17:19', '120', '2017-02-07T17:10', null, null, '2017-02-07T17:20', false ], 1060 [ '2017-02-07T17:19', '120', '2017-02-07T17:10', null, 2, '2017-02-07T17:22', false ], 1061 [ '2017-02-07T17:19', '120', '2017-02-07T17:18', '2017-02-07T17:25', null, '2017-02-07T17:20', false ], 1062 [ '2017-02-07T17:19', '120', null, null, null, '2017-02-07T17:21', false ], 1063 [ '2017-02-07T17:19', '180', null, null, null, '2017-02-07T17:22', false ], 1064 [ '2017-02-03T17:19', '172800', '2017-02-02T17:19', '2017-02-10T17:19', null, '2017-02-04T17:19', false ], 1065 // Clamping. 1066 [ '2017-02-07T17:22', null, null, '2017-02-07T17:11', null, '2017-02-07T17:22', false ], 1067 [ '2017-02-07T17:22', '120', '2017-02-07T17:20', '2017-02-07T17:22', null, '2017-02-07T17:22', false ], 1068 [ '2017-02-07T17:22', '300', '2017-02-07T17:12', '2017-02-07T17:20', 10, '2017-02-07T17:22', false ], 1069 [ '2017-02-07T17:22', '300', '2017-02-07T17:18', '2017-02-07T17:20', 2, '2017-02-07T17:22', false ], 1070 [ '2017-02-06T17:22', '600', '2017-02-02T17:00', '2017-02-07T17:20', 15, '2017-02-06T19:50', false ], 1071 [ '2017-02-06T17:22', '600', '2017-02-02T17:10', '2017-02-07T17:20', 2, '2017-02-06T17:40', false ], 1072 // value = "" (NaN). 1073 [ '', null, null, null, null, '1970-01-01T00:01', false ], 1074 // With step = 'any'. 1075 [ '2017-02-07T17:30', 'any', null, null, 1, null, true ], 1076 [ '2017-02-07T17:30', 'ANY', null, null, 1, null, true ], 1077 [ '2017-02-07T17:30', 'AnY', null, null, 1, null, true ], 1078 [ '2017-02-07T17:30', 'aNy', null, null, 1, null, true ], 1079 ]}, 1080 ]; 1081 1082 for (var test of testData) { 1083 for (var data of test.data) { 1084 var element = document.createElement("input"); 1085 element.type = test.type; 1086 1087 if (data[1] != null) { 1088 element.step = data[1]; 1089 } 1090 1091 if (data[2] != null) { 1092 element.min = data[2]; 1093 } 1094 1095 if (data[3] != null) { 1096 element.max = data[3]; 1097 } 1098 1099 // Set 'value' last for type=range, because the final sanitized value 1100 // after setting 'step', 'min' and 'max' can be affected by the order in 1101 // which those attributes are set. Setting 'value' last makes it simpler 1102 // to reason about what the final value should be. 1103 if (data[0] != null) { 1104 element.setAttribute('value', data[0]); 1105 } 1106 1107 var exceptionCaught = false; 1108 try { 1109 if (data[4] != null) { 1110 element.stepUp(data[4]); 1111 } else { 1112 element.stepUp(); 1113 } 1114 1115 is(element.value, data[5], "The value for type=" + test.type + " should be " + data[5]); 1116 } catch (e) { 1117 exceptionCaught = true; 1118 is(element.value, data[0], e.name + "The value should not have changed"); 1119 is(e.name, 'InvalidStateError', 1120 "It should be a InvalidStateError exception."); 1121 } finally { 1122 is(exceptionCaught, data[6], "exception status should be " + data[6]); 1123 } 1124 } 1125 } 1126 } 1127 1128 checkPresence(); 1129 checkAvailability(); 1130 1131 checkStepDown(); 1132 checkStepUp(); 1133 1134 </script> 1135 </pre> 1136 </body> 1137 </html>