'use strict'; /* global BaseModule */ /* global MocksHelper */ /* global MockL10n */ /* global MockNavigatorBattery */ /* global MockNavigatorSettings */ require('/shared/test/unit/mocks/mock_lazy_loader.js'); requireApp('system/test/unit/mock_navigator_battery.js'); requireApp('system/shared/test/unit/mocks/mock_settings_listener.js'); requireApp('system/shared/test/unit/mocks/mock_navigator_moz_settings.js'); requireApp('system/test/unit/mock_sleep_menu.js'); requireApp('system/test/unit/mock_screen_manager.js'); require('/shared/test/unit/mocks/mock_gesture_detector.js'); require('/shared/test/unit/mocks/mock_l10n.js'); requireApp('system/js/service.js'); requireApp('system/js/base_module.js'); requireApp('system/js/base_ui.js'); requireApp('system/js/base_icon.js'); requireApp('system/js/battery_icon.js'); requireApp('system/js/power_save.js'); requireApp('system/js/battery_overlay.js'); var mocksForBatteryOverlay = new MocksHelper([ 'SettingsListener', 'sleepMenu', 'GestureDetector', 'LazyLoader' ]).init(); suite('battery manager >', function() { var realBattery; var screenNode, notifNode, overlayNode; var tinyTimeout = 10; var realMozSettings; var realL10n; var subject; mocksForBatteryOverlay.attachTestHelpers(); suiteSetup(function() { realMozSettings = navigator.mozSettings; navigator.mozSettings = MockNavigatorSettings; // for PowerSave realL10n = navigator.mozL10n; navigator.mozL10n = MockL10n; }); suiteTeardown(function() { subject._battery = realBattery; realBattery = null; navigator.mozSettings = realMozSettings; navigator.mozL10n = realL10n; }); setup(function() { subject = BaseModule.instantiate('BatteryOverlay'); realBattery = subject._battery; subject._battery = MockNavigatorBattery; // must be big enough, otherwise the BatteryOverlay timeout occurs // before the different suites execute. subject.TOASTER_TIMEOUT = tinyTimeout; var batteryNotificationMarkup = '
' + '
' + '' + '
' + '' + 'Battery almost empty.' + '' + '' + 'Plug in your charger.' + '' + '
' + '
' + '
'; 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; }); teardown(function() { subject.stop(); 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; subject.start(); }); test('display notification', function() { assertDisplayed(); }); test('should send batteryshutdown when battery is below threshold', function() { this.sinon.stub(window, 'dispatchEvent'); sendLevelChange(0.00); sinon.assert.calledWithMatch(window.dispatchEvent, { type: 'batteryshutdown' }); }); }); suite('battery goes empty >', function() { setup(function() { sendLevelChange(0.05); subject.start(); }); 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() { subject.start(); sendScreenChange(false); sendLevelChange(0.05); }); test('no notification', function() { assertNotDisplayed(); }); test('screen goes on > display notification', function() { sendScreenChange(true); assertDisplayed(); }); }); }); });