diff options
Diffstat (limited to 'apps/system/test/unit/battery_manager_test.js')
-rw-r--r-- | apps/system/test/unit/battery_manager_test.js | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/apps/system/test/unit/battery_manager_test.js b/apps/system/test/unit/battery_manager_test.js new file mode 100644 index 0000000..ee85f86 --- /dev/null +++ b/apps/system/test/unit/battery_manager_test.js @@ -0,0 +1,204 @@ +'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 = + '<div id="system-overlay" data-z-index-level="system-overlay">' + + '<div id="battery">' + + '<span class="icon-battery"></span>' + + '<span class="battery-notification" '+ + 'data-l10n-id="battery-almost-empty">Battery almost empty' + + '</span>' + + '</div>' + + '</div>'; + + 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(); + }); + }); + }); +}); |