<!DOCTYPE html>
<meta charset="utf-8">
<title>Battery Test: battery not full, charger plugging in</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 plugged in.
</p>

<h2>Preconditions</h2>
<ol>
  <li>
    The device is unplugged from 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>

<div id="note">
  Plug in 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 plugged in and its charging state is updated, must set the charging attribute\'s value to true and fire a chargingchange event.');
  var onchargingtimechange_test = async_test('When the device is plugged in and its charging time is updated, must set the chargingTime attribute\'s value and fire a chargingtimechange event.');
  var ondischargingtimechange_test = async_test('When the device is plugged in and its discharging time is updated, must set the dischargingTime attribute\'s value to Infinity 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_true(battery.charging, 'The charging attribute must be set to true.');
      onchargingchange_test.done();
    });

    var battery_chargingtime = battery.chargingTime;
    battery.onchargingtimechange = onchargingtimechange_test.step_func(function () {
      assert_less_than(battery.chargingTime, battery_chargingtime, 'The value of the chargingTime attribute must decrease.');
      onchargingtimechange_test.done();
    });

    battery.ondischargingtimechange = ondischargingtimechange_test.step_func(function () {
      assert_equals(battery.dischargingTime, Infinity, 'The value of the dischargingTime attribute must be set to Infinity.');
      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();
    });
  };

  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>
