VulpesOS/gaia/apps/sharedtest/test/unit/intl_helper_test.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

290 lines
7.7 KiB
JavaScript
Executable file

'use strict';
/* global IntlHelper */
require('/shared/js/intl_helper.js');
suite('IntlHelper', function() {
var realMozL10n;
beforeEach(function() {
IntlHelper._resetObjectCache();
});
setup(function() {
realMozL10n = navigator.mozL10n;
navigator.mozL10n = undefined;
});
teardown(function() {
navigator.mozL10n = realMozL10n;
});
suite('define', function() {
test('should work for a known type', function() {
assert.doesNotThrow(function() {
IntlHelper.define('shortDate', 'datetime', {
'month': 'numeric',
'year': '2-digit'
});
});
});
test('should throw for an unknown type', function() {
assert.throws(function() {
IntlHelper.define('shortDate', 'unknownType', {
'month': 'numeric',
'year': '2-digit'
});
});
});
});
suite('get', function() {
setup(function() {
IntlHelper.define('shortDate', 'datetime', {
'month': 'numeric',
'year': '2-digit'
});
});
test('should work for a defined name', function() {
assert.doesNotThrow(function() {
IntlHelper.get('shortDate');
});
});
test('should return a formatter with the right type', function() {
var formatter = IntlHelper.get('shortDate');
assert.isTrue(formatter instanceof Intl.DateTimeFormat);
});
test('should return a formatter with the right options', function() {
var formatter = IntlHelper.get('shortDate');
var options = formatter.resolvedOptions();
assert.equal(options.month, 'numeric');
assert.equal(options.year, '2-digit');
assert.strictEqual(options.hour, undefined);
assert.strictEqual(options.hour12, undefined);
});
test('should throw for an undefined name', function() {
assert.throws(function() {
IntlHelper.get('unknownName');
});
});
});
suite('observe', function() {
setup(function() {
IntlHelper.define('shortDate', 'datetime', {
'month': 'numeric',
'year': '2-digit'
});
});
test('should work for a defined name', function() {
assert.doesNotThrow(function() {
IntlHelper.observe('shortDate', () => {});
});
});
test('should throw for an undefined name', function() {
assert.throws(function() {
IntlHelper.observe('undefinedName', () => {});
});
});
test('should throw if one of the names is undefined', function() {
assert.throws(function() {
IntlHelper.observe(['shortDate', 'undefinedName'], () => {});
});
});
test('should fire when affected', function(done) {
IntlHelper.observe('shortDate', done);
IntlHelper.handleEvent({type: 'languagechange'});
});
test('should fire once even when defined twice', function() {
var firedCount = 0;
function test() {
firedCount++;
}
IntlHelper.observe('shortDate', test);
IntlHelper.observe('shortDate', test);
IntlHelper.handleEvent({type: 'languagechange'});
assert.equal(firedCount, 1);
});
test('should next event even when the the first one errors', function() {
var firedCount = 0;
function test() {
var x = unknownVariable + 1; // jshint ignore:line
firedCount++;
}
function test2() {
firedCount++;
}
IntlHelper.observe('shortDate', test);
IntlHelper.observe('shortDate', test2);
// be nice to our log, avoid spamming our error
sinon.stub(console, 'error');
IntlHelper.handleEvent({type: 'languagechange'});
console.error.restore();
assert.equal(firedCount, 1);
});
});
suite('unobserve', function() {
setup(function() {
IntlHelper.define('shortDate', 'datetime', {
'month': 'numeric',
'year': '2-digit'
});
});
test('should not fire after unobserved', function() {
var wasFired = false;
function test() {
wasFired = true;
}
IntlHelper.observe('shortDate', test);
IntlHelper.unobserve('shortDate', test);
IntlHelper.handleEvent({type: 'languagechange'});
assert.isFalse(wasFired);
});
});
suite('DateTime', function() {
setup(function() {
IntlHelper.define('shortTime', 'datetime', {
'hour': 'numeric',
'minute': 'numeric'
});
IntlHelper.define('shortDate', 'datetime', {
'month': 'numeric',
'year': '2-digit'
});
});
test('should only fire hour formatter on timeformatchange', function() {
var setTimeFired = false;
var setDateFired = false;
function setTime() {
setTimeFired = true;
}
function setDate() {
setDateFired = true;
}
IntlHelper.observe('shortTime', setTime);
IntlHelper.observe('shortDate', setDate);
IntlHelper.handleEvent({type: 'timeformatchange'});
assert.isTrue(setTimeFired);
assert.isFalse(setDateFired);
});
test('should fire if at least one name is affected', function() {
var setValuesFired = false;
function setValues() {
setValuesFired = true;
}
IntlHelper.observe(['shortDate', 'shortTime'], setValues);
IntlHelper.handleEvent({type: 'timeformatchange'});
assert.isTrue(setValuesFired);
});
test('should not fire if timeformatchange and no hour', function() {
var setValuesFired = false;
function setValues() {
setValuesFired = true;
}
IntlHelper.observe('shortDate', setValues);
IntlHelper.handleEvent({type: 'timeformatchange'});
assert.isFalse(setValuesFired);
});
test('should add hour12 to options', function() {
var expectedValue = false;
function setValues() {
var formatter = IntlHelper.get('shortTime');
assert.equal(formatter.resolvedOptions().hour12, expectedValue);
}
IntlHelper.observe('shortTime', setValues);
navigator.mozHour12 = false;
IntlHelper.handleEvent({type: 'timeformatchange'});
navigator.mozHour12 = true;
expectedValue = true;
IntlHelper.handleEvent({type: 'timeformatchange'});
});
});
suite('Number', function() {
setup(function() {
IntlHelper.define('downloadPercent', 'number', {
'style': 'percent',
});
});
test('should fire formatter on languagechange', function() {
var setValuesFired = false;
function setValues() {
setValuesFired = true;
}
IntlHelper.observe('downloadPercent', setValues);
IntlHelper.handleEvent({type: 'languagechange'});
assert.isTrue(setValuesFired);
});
test('should not fire formatter on timeformatchange', function() {
var setValuesFired = false;
function setValues() {
setValuesFired = true;
}
IntlHelper.observe('downloadPercent', setValues);
IntlHelper.handleEvent({type: 'timeformatchange'});
assert.isFalse(setValuesFired);
});
});
suite('Collator', function() {
setup(function() {
IntlHelper.define('timezoneSorter', 'collator', {
'usage': 'sort',
'sensitivity': 'variant',
});
});
test('should fire formatter on languagechange', function() {
var setValuesFired = false;
function setValues() {
setValuesFired = true;
}
IntlHelper.observe('timezoneSorter', setValues);
IntlHelper.handleEvent({type: 'languagechange'});
assert.isTrue(setValuesFired);
});
test('should not fire formatter on timeformatchange', function() {
var setValuesFired = false;
function setValues() {
setValuesFired = true;
}
IntlHelper.observe('timezoneSorter', setValues);
IntlHelper.handleEvent({type: 'timeformatchange'});
assert.isFalse(setValuesFired);
});
});
});