Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
243 lines
6.9 KiB
JavaScript
Executable file
243 lines
6.9 KiB
JavaScript
Executable file
/* globals gTonesFrequencies, KeypadManager, loadBodyHTML,
|
|
MockIccManager, MockL10n, MockNavigatorMozTelephony,
|
|
MockNavigatorSettings, MockSettingsListener, MocksHelper,
|
|
MockTonePlayer
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
require('/shared/test/unit/load_body_html_helper.js');
|
|
require('/shared/test/unit/mocks/mock_confirm_dialog.js');
|
|
require('/shared/test/unit/mocks/mock_iccmanager.js');
|
|
require('/shared/test/unit/mocks/mock_l10n.js');
|
|
require('/shared/test/unit/mocks/mock_lazy_loader.js');
|
|
require('/shared/test/unit/mocks/mock_navigator_moz_settings.js');
|
|
require('/shared/test/unit/mocks/mock_navigator_moz_telephony.js');
|
|
require('/shared/test/unit/mocks/mock_settings_listener.js');
|
|
require('/shared/test/unit/mocks/dialer/mock_call.js');
|
|
require('/shared/test/unit/mocks/dialer/mock_utils.js');
|
|
require('/shared/test/unit/mocks/dialer/mock_tone_player.js');
|
|
|
|
require('/shared/js/dialer/dtmf_tone.js');
|
|
require('/js/keypad.js');
|
|
|
|
|
|
var mocksHelperForKeypad = new MocksHelper([
|
|
'LazyLoader',
|
|
'Utils',
|
|
'SettingsListener',
|
|
'TonePlayer'
|
|
]).init();
|
|
|
|
suite('Keypad', function() {
|
|
var subject;
|
|
var realMozIccManager;
|
|
var realMozL10n;
|
|
var realMozSettings;
|
|
var realMozTelephony;
|
|
|
|
mocksHelperForKeypad.attachTestHelpers();
|
|
|
|
// Dummy node used as event target
|
|
var dummyNode = document.createElement('div');
|
|
|
|
/**
|
|
* Simulate a touchstart event
|
|
*
|
|
* @param key {String} The target's dataset value, the touched key
|
|
*/
|
|
function mockTouchStart(key) {
|
|
var fakeEvent = {
|
|
target: dummyNode,
|
|
preventDefault: function() {},
|
|
stopPropagation: function() {},
|
|
type: 'touchstart'
|
|
};
|
|
dummyNode.dataset.value = key;
|
|
subject.keyHandler(fakeEvent);
|
|
}
|
|
|
|
/**
|
|
* Simulate a touchend event
|
|
*
|
|
* @param key {String} The target's dataset value, the touched key
|
|
*/
|
|
function mockTouchEnd(key) {
|
|
var fakeEvent = {
|
|
target: dummyNode,
|
|
preventDefault: function() {},
|
|
stopPropagation: function() {},
|
|
type: 'touchend'
|
|
};
|
|
dummyNode.dataset.value = key;
|
|
subject.keyHandler(fakeEvent);
|
|
}
|
|
|
|
suiteSetup(function() {
|
|
realMozIccManager = navigator.mozIccManager;
|
|
navigator.mozIccManager = new MockIccManager();
|
|
|
|
realMozL10n = navigator.mozL10n;
|
|
navigator.mozL10n = MockL10n;
|
|
|
|
realMozSettings = navigator.mozSettings;
|
|
navigator.mozSettings = MockNavigatorSettings;
|
|
MockNavigatorSettings.mSyncRepliesOnly = true;
|
|
|
|
realMozTelephony = navigator.mozTelephony;
|
|
navigator.mozTelephony = MockNavigatorMozTelephony;
|
|
});
|
|
|
|
suiteTeardown(function() {
|
|
navigator.mozIccManager = realMozIccManager;
|
|
navigator.mozL10n = realMozL10n;
|
|
navigator.mozSettings = realMozSettings;
|
|
MockNavigatorSettings.mSyncRepliesOnly = false;
|
|
MockNavigatorMozTelephony.mSuiteTeardown();
|
|
navigator.mozTelephony = realMozTelephony;
|
|
});
|
|
|
|
setup(function() {
|
|
loadBodyHTML('/test/unit/mock_dialer_index.html');
|
|
|
|
dummyNode = document.createElement('div');
|
|
|
|
subject = KeypadManager;
|
|
subject.init(false);
|
|
|
|
this.sinon.useFakeTimers();
|
|
});
|
|
|
|
teardown(function() {
|
|
dummyNode = null;
|
|
MockNavigatorMozTelephony.mTeardown();
|
|
});
|
|
|
|
suite('Keypad Manager', function() {
|
|
test('initializates the TonePlayer to use the "system" channel',
|
|
function() {
|
|
this.sinon.spy(MockTonePlayer, 'init');
|
|
KeypadManager.init(/* oncall */ false);
|
|
|
|
sinon.assert.calledWith(MockTonePlayer.init, 'system');
|
|
});
|
|
|
|
test('sanitizePhoneNumber', function(done) {
|
|
var testCases = {
|
|
'111-111-1111': '111-111-1111',
|
|
' 222-222-2222 ': '222-222-2222',
|
|
' 333 - 333 - 3333 ': '333-333-3333',
|
|
'4444 4444 4444': '444444444444',
|
|
'555\n555\n5555': '5555555555',
|
|
'666\t666\t6666': '6666666666'
|
|
};
|
|
|
|
var counter = 0;
|
|
|
|
function verifyNumber(index) {
|
|
return function() {
|
|
var sanitized = subject.sanitizePhoneNumber(index);
|
|
assert.equal(sanitized, testCases[index]);
|
|
};
|
|
}
|
|
|
|
for (var i in testCases) {
|
|
counter++;
|
|
test('#sanitizePhoneNumber - test case ' + counter, verifyNumber(i));
|
|
}
|
|
|
|
done();
|
|
});
|
|
|
|
test('Adds active class to keys when pressed', function() {
|
|
subject._phoneNumber = '';
|
|
|
|
mockTouchStart('1');
|
|
assert.isTrue(dummyNode.classList.contains('active'));
|
|
mockTouchEnd('1');
|
|
assert.isFalse(dummyNode.classList.contains('active'));
|
|
});
|
|
|
|
test('Multi-tap events are ignored', function() {
|
|
mockTouchStart('1');
|
|
assert.equal(subject._phoneNumber, '1');
|
|
mockTouchStart('2');
|
|
assert.equal(subject._phoneNumber, '1');
|
|
mockTouchEnd('2');
|
|
assert.equal(subject._phoneNumber, '1');
|
|
mockTouchEnd('1');
|
|
assert.equal(subject._phoneNumber, '1');
|
|
});
|
|
|
|
suite('Audible and DTMF tones when composing numbers', function() {
|
|
|
|
setup(function() {
|
|
subject._observePreferences();
|
|
MockSettingsListener.mCallbacks['phone.ring.keypad'](true);
|
|
});
|
|
|
|
test('Pressing a button plays a short tone', function() {
|
|
var startSpy = this.sinon.spy(MockTonePlayer, 'start');
|
|
var stopSpy = this.sinon.spy(MockTonePlayer, 'stop');
|
|
|
|
mockTouchStart('1');
|
|
assert.isTrue(startSpy.calledWith(gTonesFrequencies['1'], true));
|
|
mockTouchEnd('1');
|
|
assert.isTrue(stopSpy.calledOnce);
|
|
});
|
|
|
|
test('Button tones are disabled via prefs', function() {
|
|
var startSpy = this.sinon.spy(MockTonePlayer, 'start');
|
|
|
|
MockSettingsListener.mCallbacks['phone.ring.keypad'](false);
|
|
mockTouchStart('1');
|
|
assert.isTrue(startSpy.notCalled);
|
|
mockTouchEnd('1');
|
|
assert.isTrue(startSpy.notCalled);
|
|
});
|
|
|
|
test('Pressing a button does not play a DTMF tone', function() {
|
|
var startToneSpy =
|
|
this.sinon.spy(MockNavigatorMozTelephony, 'startTone');
|
|
var stopToneSpy =
|
|
this.sinon.spy(MockNavigatorMozTelephony, 'stopTone');
|
|
|
|
mockTouchStart('1');
|
|
assert.isTrue(stopToneSpy.notCalled);
|
|
assert.isTrue(startToneSpy.notCalled);
|
|
});
|
|
});
|
|
|
|
suite('Keypad vibration', function() {
|
|
setup(function() {
|
|
this.sinon.spy(navigator, 'vibrate');
|
|
subject._observePreferences();
|
|
});
|
|
|
|
test('vibrates if setting is set', function() {
|
|
MockSettingsListener.mCallbacks['keyboard.vibration'](true);
|
|
|
|
mockTouchStart('1');
|
|
sinon.assert.calledWith(navigator.vibrate, 50);
|
|
});
|
|
|
|
test('does not vibrate if setting is not set', function() {
|
|
MockSettingsListener.mCallbacks['keyboard.vibration'](false);
|
|
|
|
mockTouchStart('1');
|
|
sinon.assert.notCalled(navigator.vibrate);
|
|
});
|
|
});
|
|
|
|
suite('Long press', function() {
|
|
setup(function() {
|
|
this.sinon.spy(window, 'setTimeout');
|
|
});
|
|
|
|
test('should not try to detect the voicemail action', function() {
|
|
mockTouchStart('1');
|
|
sinon.assert.calledOnce(window.setTimeout);
|
|
});
|
|
});
|
|
});
|
|
});
|