'use strict';
requireApp('system/test/unit/mock_navigator_battery.js');
requireApp('system/test/unit/mock_settings_listener.js');
requireApp('system/test/unit/mock_sleep_menu.js');
requireApp('system/test/unit/mock_gesture_detector.js');
requireApp('system/test/unit/mocks_helper.js');
requireApp('system/js/battery_manager.js');
var mocksForBatteryManager = [
'SettingsListener',
'SleepMenu',
'GestureDetector'
];
mocksForBatteryManager.forEach(function(mockName) {
if (! window[mockName]) {
window[mockName] = null;
}
});
suite('battery manager >', function() {
var realBattery;
var screenNode, notifNode, overlayNode;
var mocksHelper;
var tinyTimeout = 10;
suiteSetup(function() {
mocksHelper = new MocksHelper(mocksForBatteryManager);
mocksHelper.suiteSetup();
realBattery = BatteryManager._battery;
BatteryManager._battery = MockNavigatorBattery;
// must be big enough, otherwise the BatteryManager timeout occurs
// before the different suites execute.
BatteryManager.TOASTER_TIMEOUT = tinyTimeout;
});
suiteTeardown(function() {
mocksHelper.suiteTeardown();
BatteryManager._battery = realBattery;
realBattery = null;
});
setup(function() {
mocksHelper.setup();
var batteryNotificationMarkup =
'
' +
'
' +
'' +
'Battery almost empty' +
'' +
'
' +
'
';
screenNode = document.createElement('div');
screenNode.id = 'screen';
screenNode.innerHTML = batteryNotificationMarkup;
document.body.appendChild(screenNode);
overlayNode = document.getElementById('system-overlay');
notifNode = document.getElementById('battery');
MockNavigatorBattery.level = 1;
PowerSaveHandler.init();
BatteryManager.init();
});
teardown(function() {
mocksHelper.teardown();
screenNode.parentNode.removeChild(screenNode);
});
function sendScreenChange(val) {
var detail = { screenEnabled: val};
var evt = new CustomEvent('screenchange', { detail: detail });
window.dispatchEvent(evt);
}
function sendLevelChange(level) {
MockNavigatorBattery.level = level;
var evt = new CustomEvent('levelchange');
MockNavigatorBattery.mTriggerEvent(evt);
}
function sendChargingChange(val) {
MockNavigatorBattery.charging = val;
var evt = new CustomEvent('chargingchange');
MockNavigatorBattery.mTriggerEvent(evt);
}
suite('"level is near empty" notification >', function() {
function assertDisplayed() {
assert.ok(overlayNode.classList.contains('battery'));
}
function assertNotDisplayed() {
assert.isFalse(overlayNode.classList.contains('battery'));
}
teardown(function(done) {
// wait for the notification timeout
setTimeout(done, tinyTimeout * 2);
});
suite('init >', function() {
setup(function() {
MockNavigatorBattery.level = 0.02;
BatteryManager.init();
});
test('display notification', function() {
assertDisplayed();
});
});
suite('battery goes empty >', function() {
setup(function() {
sendLevelChange(0.05);
});
test('display notification', function() {
assertDisplayed();
});
test('do not display twice', function(done) {
setTimeout(function() {
sendLevelChange(0.02);
assertNotDisplayed();
done();
}, tinyTimeout * 2);
});
suite('charging >', function() {
setup(function() {
sendChargingChange(true);
});
test('hide notification', function() {
assertNotDisplayed();
});
test('not charging > show notification', function() {
sendChargingChange(false);
assertDisplayed();
});
suite('goes up >', function() {
setup(function() {
sendLevelChange(0.2);
});
test('hide notification', function() {
assertNotDisplayed();
});
suite('not charging >', function() {
setup(function() {
sendChargingChange(false);
});
test('should not display', function() {
assertNotDisplayed();
});
test('goes empty again > display notification', function() {
sendLevelChange(0.02);
assertDisplayed();
});
});
});
});
});
suite('screen goes off > battery goes empty >', function() {
setup(function() {
sendScreenChange(false);
sendLevelChange(0.05);
});
test('no notification', function() {
assertNotDisplayed();
});
test('screen goes on > display notification', function() {
sendScreenChange(true);
assertDisplayed();
});
});
});
});