<!DOCTYPE html>
<meta charset="utf-8">
<title>Battery Test: battery neither empty or full, charger plugged in</title>
<link rel="author" title="Intel" href="http://www.intel.com">
<link rel="help" href="https://www.w3.org/TR/battery-status/">
<meta name="flags" content="interact">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<h2>Description</h2>
<p>
  This test validates that all of the BatteryManager attributes exist and are set to their correct values when battery is charging.
</p>

<h2>Preconditions</h2>
<ol>
  <li>
    The device is plugged in to the charger before this test is run.
  </li>
  <li>
    The battery must neither be empty or full, nor reach empty or full capacity during the test.
  </li>
  <li>
    Waiting for battery level change to fire levelchange event, maybe need a long time
  </li>
</ol>

<script>

setup({ explicit_timeout: true });

async_test(function (t) {
  navigator.getBattery().then(function (battery) {
    t.step(function () {
      assert_true(battery.charging, 'charging must be set to true');
      assert_equals(battery.dischargingTime, Infinity, 'dischargingTime must be set to Infinity');
      assert_greater_than(battery.level, 0, 'level must be greater than 0');
      assert_less_than_equal(battery.level, 1.0, 'level must be less than or equal to 1.0');

      var battery_level = battery.level;
      battery.onlevelchange = t.step_func(function () {
        assert_greater_than(battery.level, battery_level, 'The value of the level attribute must increase');
        t.done();
      });
    });
  }, function (error) {
    t.step(function () {
      assert_unreached(error.message);
    });
    t.done();
  });
}, document.title);

</script>
