Skip to content

Commit

Permalink
chore($ngLocale): refactor i18n closure slurper logic and parse exten…
Browse files Browse the repository at this point in the history
…ded datetime symbols
  • Loading branch information
chirayuk committed Mar 20, 2013
1 parent 0c72708 commit 23abb99
Show file tree
Hide file tree
Showing 8 changed files with 501 additions and 108 deletions.
5 changes: 5 additions & 0 deletions i18n/run-tests.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/bash

set -e
PARENT_DIR="$(dirname "$0")"
jasmine-node "$PARENT_DIR"/spec/
250 changes: 250 additions & 0 deletions i18n/spec/closureI18nExtractorSpec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,250 @@
var closureI18nExtractor = require('../src/closureI18nExtractor.js');
var converter = require('../src/converter.js');
findLocaleId = closureI18nExtractor.findLocaleId;
extractNumberSymbols = closureI18nExtractor.extractNumberSymbols;
extractCurrencySymbols = closureI18nExtractor.extractCurrencySymbols;
extractDateTimeSymbols = closureI18nExtractor.extractDateTimeSymbols;


function newTestLocaleInfo() {
return { fr_CA: {
DATETIME_FORMATS: {
MONTH: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre',
'octobre', 'novembre', 'décembre'],
SHORTMONTH: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.',
'nov.', 'déc.'],
DAY: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
SHORTDAY: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
AMPMS: ['AM', 'PM'],
medium: 'yyyy-MM-dd HH:mm:ss',
short: 'yy-MM-dd HH:mm',
fullDate: 'EEEE d MMMM y',
longDate: 'd MMMM y',
mediumDate: 'yyyy-MM-dd',
shortDate: 'yy-MM-dd',
mediumTime: 'HH:mm:ss',
shortTime: 'HH:mm'
},
NUMBER_FORMATS: {
"DECIMAL_SEP": ".",
"GROUP_SEP": ",",
"PATTERNS": [{
"minInt": 1,
"minFrac": 0,
"macFrac": 0,
"posPre": "",
"posSuf": "",
"negPre": "-",
"negSuf": "",
"gSize": 3,
"lgSize": 3,
"maxFrac": 3
}, {
"minInt": 1,
"minFrac": 2,
"macFrac": 0,
"posPre": "¤",
"posSuf": "",
"negPre": "¤-",
"negSuf": "",
"gSize": 3,
"lgSize": 3,
"maxFrac": 2
}],
"CURRENCY_SYM": "£"
}}};
}


describe("findLocaleId", function () {
it("should find the id from numbers", function() {
expect(findLocaleId("NumberFormatSymbols_en_GB", "num")).toEqual("en_GB");
});


it("should find the id from datetime", function() {
expect(findLocaleId("DateTimeSymbols_en_ISO", "datetime")).toEqual("en_ISO");
});


it("should throw an error otherwise", function() {
expect(function() {
findLocaleId("str", "otherwise")
}).toThrow("unknown type in findLocaleId: otherwise");
});
});

describe("extractNumberSymbols", function () {
it("should extract number data", function() {
var CONTENT = [
"goog.provide('goog.i18n.NumberFormatSymbols_en_GB');",
"goog.i18n.NumberFormatSymbols_en_GB = {",
"DECIMAL_SEP: '.',",
"GROUP_SEP: ',',",
"PERCENT: '%',",
"ZERO_DIGIT: '0',",
"PLUS_SIGN: '+',",
"MINUS_SIGN: '-',",
"EXP_SYMBOL: 'E',",
"PERMILL: '\u2030',",
"INFINITY: '\u221E',",
"NAN: 'NaN',",
"DECIMAL_PATTERN: '#,##0.###',",
"SCIENTIFIC_PATTERN: '#E0',",
"PERCENT_PATTERN: '#,##0%',",
"CURRENCY_PATTERN: '\u00A4#,##0.00',",
"DEF_CURRENCY_CODE: 'GBP' };"
].join('\n');

var currencySymbols = {'GBP':[2, '£', 'GB£']};

var expectedNumberFormats = converter.convertNumberData(
{
DECIMAL_SEP:'.',
GROUP_SEP:',',
DECIMAL_PATTERN:'#,##0.###',
CURRENCY_PATTERN:'\u00A4#,##0.00',
DEF_CURRENCY_CODE: 'GBP'
}, currencySymbols
);

var localeInfo = {};
extractNumberSymbols(CONTENT, localeInfo, currencySymbols);

expect(localeInfo).toEqual({
'en_GB': { NUMBER_FORMATS: expectedNumberFormats }
});
})
});

describe("extractCurrencySymbols", function () {
it("should extract currency data", function() {
var CONTENT = [
"goog.i18n.currency.CurrencyInfo = {",
" 'GBP':[2, '£', 'GB£'],",
"};",
"goog.i18n.currency.CurrencyInfoTier2 = {",
" 'AOA':[2, 'Kz', 'Kz'],",
"};"
].join('\n');

var localeInfo = {};
expect(extractCurrencySymbols(CONTENT)).toEqual({
'GBP':[2, '£', 'GB£'],
'AOA':[2, 'Kz', 'Kz']
});
});
});


describe("extractDateTimeSymbols", function () {
it("should extract date time data", function() {
var CONTENT = [
"goog.i18n.DateTimeSymbols_fr_CA = {",
" ERAS: ['av. J.-C.', 'ap. J.-C.'],",
" ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],",
" NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],",
" STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O',",
" 'N', 'D'],",
" MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet',",
" 'août', 'septembre', 'octobre', 'novembre', 'décembre'],",
" STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin',",
" 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],",
" SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.',",
" 'août', 'sept.', 'oct.', 'nov.', 'déc.'],",
" STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin',",
" 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],",
" WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi',",
" 'samedi'],",
" STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi',",
" 'vendredi', 'samedi'],",
" SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],",
" STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.',",
" 'sam.'],",
" NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],",
" STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],",
" SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],",
" QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],",
" AMPMS: ['AM', 'PM'],",
" DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'yyyy-MM-dd', 'yy-MM-dd'],",
" TIMEFORMATS: ['HH \\'h\\' mm \\'min\\' ss \\'s\\' zzzz', 'HH:mm:ss z',",
" 'HH:mm:ss', 'HH:mm'],",
" FIRSTDAYOFWEEK: 6,",
" WEEKENDRANGE: [5, 6],",
" FIRSTWEEKCUTOFFDAY: 2",
"};"
].join('\n');
var localeInfo = {};
var expectedLocaleInfo = {
fr_CA: {
DATETIME_FORMATS: {
MONTH: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre',
'octobre', 'novembre', 'décembre'],
SHORTMONTH: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.',
'nov.', 'déc.'],
DAY: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
SHORTDAY: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
AMPMS: ['AM', 'PM'],
medium: 'yyyy-MM-dd HH:mm:ss',
short: 'yy-MM-dd HH:mm',
fullDate: 'EEEE d MMMM y',
longDate: 'd MMMM y',
mediumDate: 'yyyy-MM-dd',
shortDate: 'yy-MM-dd',
mediumTime: 'HH:mm:ss',
shortTime: 'HH:mm'
}
}
};
extractDateTimeSymbols(CONTENT, localeInfo);
expect(localeInfo).toEqual(expectedLocaleInfo);
})
});

describe("pluralExtractor", function() {
it("should output PLURAL_CAT in the output string code", function() {
var localeIds = ["fr_CA"];
var content = (
"goog.provide('goog.i18n.pluralRules');\n" +
"\n" +
"goog.i18n.pluralRules.Keyword = {\n" +
" ZERO: 'zero',\n" +
" ONE: 'one',\n" +
" TWO: 'two',\n" +
" FEW: 'few',\n" +
" MANY: 'many',\n" +
" OTHER: 'other'\n" +
"};\n" +
"\n" +
"goog.i18n.pluralRules.frSelect_ = function(n) {\n" +
" if (n >= 0 && n < 2) {\n" +
" return goog.i18n.pluralRules.Keyword.ONE;\n" +
" }\n" +
" return goog.i18n.pluralRules.Keyword.OTHER;\n" +
"};\n" +
"\n" +
"if (goog.LOCALE == 'fr') {\n" +
" goog.i18n.pluralRules.select = goog.i18n.pluralRules.frSelect_;\n" +
"}"
);
var localeInfo = newTestLocaleInfo();
closureI18nExtractor.pluralExtractor(content, localeInfo);
var pluralCat = localeInfo["fr_CA"].pluralCat;
expect(pluralCat).toBeDefined();
// pluralCat is the source text for the pluralCat and contains @@
// placeholders that need to be stripped before evaluation.
// Ref: closureI18nExtractor.pluralExtractor.
pluralCat = pluralCat.replace(/^@@|@@$/g, '');
// pluralCat requires these constants to exist.
var PLURAL_CATEGORY = {
ZERO: "zero", ONE: "one", TWO: "two",
FEW: "few", MANY: "many", OTHER: "other"
};
// Obtain the function by evaluating the source text.
pluralCat = eval("(" + pluralCat + ")");
// Confirm some expectations for pluralCat in fr_CA.
expect(pluralCat(0)).toEqual("one");
expect(pluralCat(3)).toEqual("other");
})
});

2 changes: 2 additions & 0 deletions i18n/spec/parserSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ describe('parsePattern', function() {
parseAndExpect('#,##,##0.###', '', '-', '', '', 1, 0, 3, 2, 3);
parseAndExpect("#,##0.###;\'\u202A\'-#,##0.###\'\u202C\'",
'', '\u202A-', '', '\u202C', 1, 0, 3, 3, 3);
parseAndExpect('#0.###;#0.###-', '', '', '', '-', 1, 0, 3, 0, 0);

});

it('should parse CURRENCY patterns', function() {
Expand Down
Loading

0 comments on commit 23abb99

Please sign in to comment.