<!DOCTYPE html>
<meta charset="utf-8">
<title>Battery Test: battery not full, charger unplugging</title>
<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>
  <li>
    The battery must not be full or reach full capacity during the time the test is run.
  </li>
</ol>
<p>
  The highest prime number discovered so far is:  <output id="prime"></output>
</p>

<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 plugged 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(battery.level, 1.0);
      onlevelchange_test.done();
      w.terminate();
    });
  };

  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>
