<!DOCTYPE html>
<meta charset="utf-8">
<title>Battery Test: charger unplugging</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>
<style>
  #note {
    background-color: #fef1b5;
    border: solid 1px #cdab2d;
    padding: 5px;
    margin: 15px;
    display: block;
  }
</style>

<h2>Description</h2>
<p>
  This test validates that all of the BatteryManager attributes exist and
  are set to correct values, with corresponding events fired,
  when the charger is unplugged.
</p>

<h2>Preconditions</h2>
<ol>
  <li>
    The device is plugged in to the charger before this test is run.
  </li>
</ol>

<div id="note">
  Unplug the charger and wait for all the tests to complete.
</div>

<div id="log"></div>

<script>

(function() {

  setup({ explicit_timeout: true });

  var onchargingchange_test = async_test(
      'When the device is unplugged in and its charging state is updated, ' +
      'must set the charging attribute\'s value to false and ' +
      'fire a chargingchange event.');
  var onchargingtimechange_test = async_test(
      'When the device is unplugged in and its charging time is updated, ' +
      'must set the chargingTime attribute\'s value to Infinity and ' +
      'fire a chargingtimechange event.');
  var ondischargingtimechange_test = async_test(
      'When the device is unplugged in and its discharging time is updated, ' +
      'must set the dischargingTime attribute\'s value and ' +
      'fire a dischargingtimechange event.');
  var onlevelchange_test = async_test(
      'When the device is unplugged in and the battery level is updated, ' +
      'must set the level attribute\'s value and fire a levelchange event.');

  var batterySuccess = function (battery) {
    battery.onchargingchange = onchargingchange_test.step_func(function () {
      assert_false(battery.charging, 'The charging attribute must be set to false.');
      onchargingchange_test.done();
    });

    battery.onchargingtimechange = onchargingtimechange_test.step_func(function () {
      assert_equals(battery.chargingTime, Infinity,
          'The value of the chargingTime attribute must be set to Infinity.');
      onchargingtimechange_test.done();
    });

    battery.ondischargingtimechange = ondischargingtimechange_test.step_func(function () {
      assert_less_than(battery.dischargingTime, Infinity,
          'The value of the dischargingTime attribute must be set to the remaining discharging time.');
      ondischargingtimechange_test.done();
    });

    battery.onlevelchange = onlevelchange_test.step_func(function () {
      assert_greater_than(battery.level, 0);
      assert_less_than_equal(battery.level, 1.0);
      onlevelchange_test.done();
    });
  };

  var batteryFailure = function (error) {
    onchargingchange_test.step(function () {
      assert_unreached(error.message);
     });
    onchargingchange_test.done();

    onchargingtimechange_test.step(function () {
      assert_unreached(error.message);
    });
    onchargingtimechange_test.done();

    ondischargingtimechange_test.step(function () {
      assert_unreached(error.message);
    });
    ondischargingtimechange_test.done();

    onlevelchange_test.step(function () {
      assert_unreached(error.message);
    });
    onlevelchange_test.done();
  };

  navigator.getBattery().then(batterySuccess, batteryFailure);

})();

</script>
