<!DOCTYPE html>
<html>
<body>
<script src="../resources/js-test.js"></script>
<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/services/device/public/interfaces/battery_monitor.mojom.js"></script>
<script src="resources/mock-battery-monitor.js"></script>
<script>
description("Test promise resolution and event listeners callbacks.");

if (!window.testRunner)
    debug('This test cannot be run without the TestRunner');

// Clean-up any unused battery manager objects from previous tests.
gc();
jsTestIsAsync = true;
testRunner.waitUntilDone();

var battery;
function batteryStatusSuccess(batteryManager) {
    debug('batteryStatusSuccess invoked');
    battery = batteryManager;
    testIfBatteryStatusIsUpToDate(battery);

    battery.addEventListener('chargingchange', onChargingChange);
    battery.addEventListener('dischargingtimechange', onDischargingTimeChange);
    battery.addEventListener('chargingtimechange', onChargingTimeChange);
    battery.addEventListener('levelchange', onLevelChange);

    setTimeout(fireNextMockBatteryInfo, 0);
}

function fireNextMockBatteryInfo() {
    setAndFireMockBatteryInfo(true, 11, 22, 0.6);
}

var chargingChanged = 0;
var chargingTimeChanged = 0;
var dischargingTimeChanged = 0;
var levelChanged = 0;

function onChargingChange() {
    debug('chargingchange invoked');
    if (this !== battery) { testFailed('this !== battery'); }
    testIfBatteryStatusIsUpToDate(this);
    chargingChanged++;
    finishIfReady();
}

function onChargingTimeChange() {
    debug('chargingtimechange invoked');
    if (this !== battery) { testFailed('this !== battery'); }
    testIfBatteryStatusIsUpToDate(this);
    chargingTimeChanged++;
    finishIfReady();
}

function onDischargingTimeChange() {
    debug('dischargingtimechange invoked');
    if (this !== battery) { testFailed('this !== battery'); }
    testIfBatteryStatusIsUpToDate(this);
    dischargingTimeChanged++;
    finishIfReady();
}

function onLevelChange() {
    debug('levelchange invoked');
    if (this !== battery) { testFailed('this !== battery'); }
    testIfBatteryStatusIsUpToDate(this);
    levelChanged++;
    finishIfReady();
}

function finishIfReady() {
    if (chargingChanged == 1 && chargingTimeChanged == 1 && dischargingTimeChanged == 1 && levelChanged == 1) {
        battery.removeEventListener('chargingchange', onChargingChange);
        battery.removeEventListener('dischargingtimechange', onDischargingTimeChange);
        battery.removeEventListener('chargingtimechange', onChargingTimeChange);
        battery.removeEventListener('levelchange', onLevelChange);
        setTimeout(finishJSTest, 0);
    }
}

navigator.getBattery().then(batteryStatusSuccess, batteryStatusFailure);
setAndFireMockBatteryInfo(false, 10, 20, 0.5);
</script>
</body>
</html>
