<!DOCTYPE HTML>
<meta charset="utf-8">
<html>
 <head>
  <title>HTMLInputElement valueAsNumber</title>
  <link rel="author" title="pmdartus" href="mailto:dartus.pierremarie@gmail.com">
  <link rel=help href="https://html.spec.whatwg.org/#dom-input-valueasnumber">

  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
 </head>
 <body>
  <h3>input_valueAsNumber</h3>
  <hr>
  <div id="log"></div>

  <input id="input_date" type="date" />
  <input id="input_month" type="month" />
  <input id="input_week" type="week" />
  <input id="input_time" type="time" />
  <input id="input_datetime-local" type="datetime-local" />
  <input id="input_number" type="number" />
  <input id="input_range" type="range" min="0" max="100" />

  <script>
   "use strict";

   function testValueAsNumberGetter(type, element, cases) {
     for (const [value, expectedValueAsNumber] of cases) {
       test(
         () => {
           element.value = value;
           assert_equals(element.valueAsNumber, expectedValueAsNumber);
         },
         `valueAsNumber getter on type ${type} (actual value: ${value}, ` +
         `expected valueAsNumber: ${expectedValueAsNumber})`
       );
     }
   }

   function testValueAsNumberSetter(type, element, cases) {
     for (const [valueAsNumber, expectedValue] of cases) {
       test(
         () => {
           element.valueAsNumber = valueAsNumber;
           assert_equals(element.value, expectedValue);
         },
         `valueAsNumber setter on type ${type} (actual valueAsNumber: ${valueAsNumber}, ` +
         `expected value: ${expectedValue})`
       );
     }
   }

   const dateInput = document.getElementById("input_date");
   testValueAsNumberGetter("date", dateInput, [
     ["", NaN],
     ["0000-12-10", NaN],
     ["2019-00-12", NaN],
     ["2019-12-00", NaN],
     ["2019-13-10", NaN],
     ["2019-02-29", NaN],
     ["2019-12-10", 1575936000000],
     ["2016-02-29", 1456704000000] // Leap year
   ]);
   testValueAsNumberSetter("date", dateInput, [
     [0, "1970-01-01"],
     [1575936000000, "2019-12-10"],
     [1456704000000, "2016-02-29"] // Leap year
   ]);

   const monthInput = document.getElementById("input_month");
   testValueAsNumberGetter("month", monthInput, [
     ["", NaN],
     ["0000-12", NaN],
     ["2019-00", NaN],
     ["2019-12", 599]
   ]);
   testValueAsNumberSetter("month", monthInput, [[599, "2019-12"]]);

   const weekInput = document.getElementById("input_week");
   testValueAsNumberGetter("week", weekInput, [
     ["", NaN],
     ["0000-W50", NaN],
     ["2019-W00", NaN],
     ["2019-W60", NaN],
     ["2019-W50", 1575849600000]
   ]);
   testValueAsNumberSetter("week", weekInput, [
     [0, "1970-W01"],
     [1575849600000, "2019-W50"]
   ]);

   const timeInput = document.getElementById("input_time");
   testValueAsNumberGetter("time", timeInput, [
     ["", NaN],
     ["24:00", NaN],
     ["00:60", NaN],
     ["00:00", 0],
     ["12:00", 12 * 3600 * 1000],
     ["23:59", ((23 * 3600) + (59 * 60)) * 1000]
   ]);
   testValueAsNumberSetter("time", timeInput, [
     [0, "00:00"],
     [12 * 3600 * 1000, "12:00"],
     [((23 * 3600) + (59 * 60)) * 1000, "23:59"]
   ]);

   const dateTimeLocalInput = document.getElementById("input_datetime-local");
   testValueAsNumberGetter("datetime-local", dateTimeLocalInput, [
     ["", NaN],
     ["2019-12-10T00:00", 1575936000000],
     ["2019-12-10T12:00", 1575979200000]
   ]);
   testValueAsNumberSetter("datetime-local", dateTimeLocalInput, [
     [1575936000000, "2019-12-10T00:00"],
     [1575979200000, "2019-12-10T12:00"]
   ]);

   const numberInput = document.getElementById("input_number");
   testValueAsNumberGetter("number", numberInput, [
     ["", NaN],
     ["123", 123],
     ["123.456", 123.456],
     ["1e3", 1000],
     ["1e", NaN],
     ["-123", -123]
   ]);
   testValueAsNumberSetter("number", numberInput, [
     [123, "123"],
     [123.456, "123.456"],
     [1e3, "1000"],
     [-123, "-123"]
   ]);

   const rangeInput = document.getElementById("input_range");
   testValueAsNumberGetter("range", rangeInput, [
     ["", 50],
     ["0", 0],
     ["50", 50],
     ["100", 100],
     ["-10", 0], // Realign to the min
     ["110", 100] // Realign to the max
   ]);
   testValueAsNumberSetter("range", rangeInput, [
     [0, "0"],
     [50, "50"],
     [100, "100"]
   ]);
  </script>
 </body>
</html>
