tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>