diff options
Diffstat (limited to 'intl/locale/tests')
19 files changed, 1516 insertions, 0 deletions
diff --git a/intl/locale/tests/nsLocaleTest.html b/intl/locale/tests/nsLocaleTest.html new file mode 100644 index 000000000..5b7aa415b --- /dev/null +++ b/intl/locale/tests/nsLocaleTest.html @@ -0,0 +1,44 @@ +<html> +<head> + <title>nsLocale Scriptability Test</title> + +</head> + +<script> + +var localeService = null; +var applicationLocale = null; +var systemLocale = null; + +function get_locale_service() { + localeService = Components.classes["@mozilla.org/intl/nslocaleservice;1"].createInstance(); + localeService = localeService.QueryInterface(Components.interfaces.nsILocaleService); + applicationLocale = localeService.GetApplicationLocale(); + systemLocale = localeService.GetSystemLocale(); +} + +function do_application_locale(t) { + t.value = applicationLocale.GetCategory("NSILOCALE_MESSAGES"); +} + +function do_system_locale(t) { + t.value = systemLocale.GetCategory("NSILOCALE_MESSAGES"); +} + +</script> + +<body BGCOLOR="#FFFFFF" TEXT="#000000" onLoad="get_locale_service();"> + +<form name="locale"> +<b>Application Locale: </b> +<input type="button" value="Get Application Locale" onClick=do_application_locale(this);></br> +<b>System Locale: </b> +<input type="button" value="Get System Locale" onClick=do_system_locale(this);></br> +</form> + +<hr> +<address><a href="mailto:tague@netscape.com">Tague Griffith</a></address> +</body> +</html> + + diff --git a/intl/locale/tests/sort/us-ascii_base.txt b/intl/locale/tests/sort/us-ascii_base.txt new file mode 100644 index 000000000..3bc7fbc7b --- /dev/null +++ b/intl/locale/tests/sort/us-ascii_base.txt @@ -0,0 +1,95 @@ + +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? +@ +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +[ +\ +] +^ +_ +` +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +{ +| +} +~ diff --git a/intl/locale/tests/sort/us-ascii_base_case_res.txt b/intl/locale/tests/sort/us-ascii_base_case_res.txt new file mode 100644 index 000000000..3e526d226 --- /dev/null +++ b/intl/locale/tests/sort/us-ascii_base_case_res.txt @@ -0,0 +1,96 @@ +' +- + +! +" +# +$ +% +& +( +) +* +, +. +/ +: +; +? +@ +[ +\ +] +^ +_ +` +{ +| +} +~ ++ +< += +> +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +A +b +B +c +C +d +D +e +E +f +F +g +G +h +H +i +I +j +J +k +K +l +L +m +M +n +N +o +O +p +P +q +Q +r +R +s +S +t +T +u +U +v +V +w +W +x +X +y +Y +z +Z + diff --git a/intl/locale/tests/sort/us-ascii_base_nocase_res.txt b/intl/locale/tests/sort/us-ascii_base_nocase_res.txt new file mode 100644 index 000000000..2d18096db --- /dev/null +++ b/intl/locale/tests/sort/us-ascii_base_nocase_res.txt @@ -0,0 +1,96 @@ +' +- + +! +" +# +$ +% +& +( +) +* +, +. +/ +: +; +? +@ +[ +\ +] +^ +_ +` +{ +| +} +~ ++ +< += +> +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +a +B +b +C +c +d +D +e +E +f +F +g +G +h +H +i +I +j +J +k +K +L +l +m +M +n +N +O +o +p +P +q +Q +r +R +s +S +t +T +u +U +v +V +w +W +X +x +Y +y +Z +z + diff --git a/intl/locale/tests/sort/us-ascii_sort.txt b/intl/locale/tests/sort/us-ascii_sort.txt new file mode 100644 index 000000000..b6962f8de --- /dev/null +++ b/intl/locale/tests/sort/us-ascii_sort.txt @@ -0,0 +1,78 @@ +ludwig van beethoven +Ludwig van Beethoven +Ludwig van beethoven +Jane +jane +JANE +jAne +jaNe +janE +JAne +JaNe +JanE +JANe +JaNE +JAnE +jANE +Umberto Eco +Umberto eco +umberto eco +umberto Eco +UMBERTO ECO +ace +bash +*ace +!ace +%ace +~ace +#ace +cork +denizen +[denizen] +(denizen) +{denizen} +/denizen/ +#denizen# +$denizen$ +@denizen +elf +full +gnome +gnomic investigation of typological factors in the grammaticalization process of Malayo-Polynesian substaratum in the protoAltaic vocabulary core in the proto-layers of pre-historic Japanese +gnomic investigation of typological factors in the grammaticalization process of Malayo-Polynesian substaratum in the protoAltaic vocabulary core in the proto-layers of pre-historic Javanese +hint +Internationalization +Zinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalization +Zinternationalization internationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizatio +n +Zinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalization internationalizationinternationalizationinternationalizationinternationalizationinternationalization +ZinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizaTioninternationalizationinternationalizationinternationalizationinternationalization +ZinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizaTion +jostle +kin +Laymen +lumens +Lumens +motleycrew +motley crew +niven's creative talents +nivens creative talents +opie +posh restaurants in surbanized and still urban incorporated subsection of this beautifl city in the Rockies +posh restaurants in surbanized and still urban incorporated subsection of this beautifl city in the Rokkies +posh restaurants in surbanized and still urban incorporated subsection of this beautifl city in the rockies +quilt's +quilts +quilt +Rondo +street +tamale oxidization and iodization in rapid progress +tamale oxidization and iodization in rapid Progress +until +vera +Wobble +Xanadu's legenary imaginary floccinaucinihilipilification in localization of theoretical portions of glottochronological understanding of the phoneme +Xanadu's legenary imaginary floccinaucinihilipilification in localization of theoretical portions of glottochronological understanding of the phoname +yearn +zodiac + diff --git a/intl/locale/tests/sort/us-ascii_sort_case_res.txt b/intl/locale/tests/sort/us-ascii_sort_case_res.txt new file mode 100644 index 000000000..2720a8342 --- /dev/null +++ b/intl/locale/tests/sort/us-ascii_sort_case_res.txt @@ -0,0 +1,79 @@ +!ace +#ace +#denizen# +$denizen$ +%ace +(denizen) +*ace +/denizen/ +@denizen +[denizen] +{denizen} +~ace +ace +bash +cork +denizen +elf +full +gnome +gnomic investigation of typological factors in the grammaticalization process of Malayo-Polynesian substaratum in the protoAltaic vocabulary core in the proto-layers of pre-historic Japanese +gnomic investigation of typological factors in the grammaticalization process of Malayo-Polynesian substaratum in the protoAltaic vocabulary core in the proto-layers of pre-historic Javanese +hint +Internationalization +jane +janE +jaNe +jAne +jANE +Jane +JanE +JaNe +JaNE +JAne +JAnE +JANe +JANE +jostle +kin +Laymen +ludwig van beethoven +Ludwig van beethoven +Ludwig van Beethoven +lumens +Lumens +motley crew +motleycrew +nivens creative talents +niven's creative talents +opie +posh restaurants in surbanized and still urban incorporated subsection of this beautifl city in the rockies +posh restaurants in surbanized and still urban incorporated subsection of this beautifl city in the Rockies +posh restaurants in surbanized and still urban incorporated subsection of this beautifl city in the Rokkies +quilt +quilts +quilt's +Rondo +street +tamale oxidization and iodization in rapid progress +tamale oxidization and iodization in rapid Progress +umberto eco +umberto Eco +Umberto eco +Umberto Eco +UMBERTO ECO +until +veda +Veda +vera +Vera +Wobble +Xanadu's legenary imaginary floccinaucinihilipilification in localization of theoretical portions of glottochronological understanding of the phoname +Xanadu's legenary imaginary floccinaucinihilipilification in localization of theoretical portions of glottochronological understanding of the phoneme +yearn +Zinternationalization internationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalization +Zinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalization internationalizationinternationalizationinternationalizationinternationalizationinternationalization +Zinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalization +ZinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizaTion +ZinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizaTioninternationalizationinternationalizationinternationalizationinternationalization +zodiac diff --git a/intl/locale/tests/sort/us-ascii_sort_nocase_res.txt b/intl/locale/tests/sort/us-ascii_sort_nocase_res.txt new file mode 100644 index 000000000..fa3426d4e --- /dev/null +++ b/intl/locale/tests/sort/us-ascii_sort_nocase_res.txt @@ -0,0 +1,79 @@ +!ace +#ace +#denizen# +$denizen$ +%ace +(denizen) +*ace +/denizen/ +@denizen +[denizen] +{denizen} +~ace +ace +bash +cork +denizen +elf +full +gnome +gnomic investigation of typological factors in the grammaticalization process of Malayo-Polynesian substaratum in the protoAltaic vocabulary core in the proto-layers of pre-historic Japanese +gnomic investigation of typological factors in the grammaticalization process of Malayo-Polynesian substaratum in the protoAltaic vocabulary core in the proto-layers of pre-historic Javanese +hint +Internationalization +JANe +jANE +JAnE +JaNE +Jane +JanE +JaNe +JAne +janE +jaNe +jAne +JANE +jane +jostle +kin +Laymen +Ludwig van beethoven +Ludwig van Beethoven +ludwig van beethoven +Lumens +lumens +motley crew +motleycrew +nivens creative talents +niven's creative talents +opie +posh restaurants in surbanized and still urban incorporated subsection of this beautifl city in the rockies +posh restaurants in surbanized and still urban incorporated subsection of this beautifl city in the Rockies +posh restaurants in surbanized and still urban incorporated subsection of this beautifl city in the Rokkies +quilt +quilts +quilt's +Rondo +street +tamale oxidization and iodization in rapid Progress +tamale oxidization and iodization in rapid progress +Umberto eco +Umberto Eco +umberto eco +UMBERTO ECO +umberto Eco +until +Veda +veda +Vera +vera +Wobble +Xanadu's legenary imaginary floccinaucinihilipilification in localization of theoretical portions of glottochronological understanding of the phoname +Xanadu's legenary imaginary floccinaucinihilipilification in localization of theoretical portions of glottochronological understanding of the phoneme +yearn +Zinternationalization internationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalization +Zinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalization internationalizationinternationalizationinternationalizationinternationalizationinternationalization +ZinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizaTioninternationalizationinternationalizationinternationalizationinternationalization +ZinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizaTion +Zinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalizationinternationalization +zodiac diff --git a/intl/locale/tests/unit/data/chrome.manifest b/intl/locale/tests/unit/data/chrome.manifest new file mode 100644 index 000000000..a8678deef --- /dev/null +++ b/intl/locale/tests/unit/data/chrome.manifest @@ -0,0 +1 @@ +content locale ./ diff --git a/intl/locale/tests/unit/data/intl_on_workers_worker.js b/intl/locale/tests/unit/data/intl_on_workers_worker.js new file mode 100644 index 000000000..98aeeb5c0 --- /dev/null +++ b/intl/locale/tests/unit/data/intl_on_workers_worker.js @@ -0,0 +1,4 @@ +self.onmessage = function (data) { + let myLocale = Intl.NumberFormat().resolvedOptions().locale; + self.postMessage(myLocale); +}; diff --git a/intl/locale/tests/unit/test_bug1086527.js b/intl/locale/tests/unit/test_bug1086527.js new file mode 100644 index 000000000..ae0c5b17a --- /dev/null +++ b/intl/locale/tests/unit/test_bug1086527.js @@ -0,0 +1,20 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * This unit test makes sure that PluralForm.get can be called from strict mode + */ + +Components.utils.import("resource://gre/modules/PluralForm.jsm"); + +delete PluralForm.numForms; +delete PluralForm.get; +[PluralForm.get, PluralForm.numForms] = PluralForm.makeGetter(9); + +function run_test() { + "use strict"; + + do_check_eq(3, PluralForm.numForms()); + do_check_eq("one", PluralForm.get(5, 'one;many')); +} diff --git a/intl/locale/tests/unit/test_bug22310.js b/intl/locale/tests/unit/test_bug22310.js new file mode 100644 index 000000000..d0877db5d --- /dev/null +++ b/intl/locale/tests/unit/test_bug22310.js @@ -0,0 +1,54 @@ +String.prototype.has = function(s) { return this.indexOf(s) != -1; } + +var Cc = Components.classes; +var Ci = Components.interfaces; + +function dt(locale) { + var date = new Date("2008-06-30T13:56:34"); + const dtOptions = { year: 'numeric', month: 'long', day: 'numeric', + hour: 'numeric', minute: 'numeric', second: 'numeric' }; + return date.toLocaleString(locale, dtOptions); +} + +var all_passed = true; +const tests = +[ + [dt("en-US").has("June"), "month name in en-US"], + [dt("en-US").has("2008"), "year in en-US"], + [dt("da").has("jun"), "month name in da"], + [dt("da-DK") == dt("da"), "da same as da-DK"], + [dt("en-GB").has("30") && dt("en-GB").has("June") && + dt("en-GB").indexOf("30") < dt("en-GB").indexOf("June"), + "day before month in en-GB"], + [dt("en-US").has("30") && dt("en-US").has("June") && + dt("en-US").indexOf("30") > dt("en-US").indexOf("June"), + "month before day in en-US"], + [dt("ja-JP").has("\u5E746\u670830\u65E5"), "year month and day in ja-JP"], + // The Firefox locale code ja-JP-mac will be resolved to a BCP47-compliant + // tag ja-JP-x-lvariant-mac by uloc_toLanguageTag + [dt("ja-JP") == dt("ja-JP-x-lvariant-mac"), "ja-JP-x-lvariant-mac same as ja-JP"], + [dt("nn-NO").has("juni"), "month name in nn-NO"], + [dt("nb-NO").has("juni"), "month name in nb-NO"], + // Bug 1261775 - failures on win10 + //[dt("no-NO").has("30. juni"), "month name in no-NO"], + [dt("sv-SE").has("30 jun"), "month name in sv-SE"], + [dt("kok").has("\u091C\u0942\u0928"), "month name in kok"], + [dt("ta-IN").has("\u0B9C\u0BC2\u0BA9\u0BCD"), "month name in ta-IN"], + [dt("ab-CD").length > 0, "fallback for ab-CD"] +]; + +function one_test(testcase, msg) +{ + if (!testcase) { + all_passed = false; + dump("Unexpected date format: " + msg + "\n"); + } +} + +function run_test() +{ + for (var i = 0; i < tests.length; ++i) { + one_test(tests[i][0], tests[i][1]); + } + do_check_true(all_passed); +} diff --git a/intl/locale/tests/unit/test_bug371611.js b/intl/locale/tests/unit/test_bug371611.js new file mode 100644 index 000000000..807c9ecc5 --- /dev/null +++ b/intl/locale/tests/unit/test_bug371611.js @@ -0,0 +1,26 @@ +var Cc = Components.classes; +var Ci = Components.interfaces; +var Cr = Components.results; + +function test_formatdatetime_return() +{ + var dateConv = Cc["@mozilla.org/intl/scriptabledateformat;1"]. + getService(Ci.nsIScriptableDateFormat); + + /* Testing if we throw instead of crashing when we are passed 0s. */ + var x = false; + try { + dateConv.FormatDate("", Ci.nsIScriptableDateFormat.dateFormatLong, + 0, 0, 0); + } + catch (e if (e.result == Cr.NS_ERROR_INVALID_ARG)) { + x = true; + } + if (!x) + do_throw("FormatDate didn't throw when passed 0 for its arguments."); +} + +function run_test() +{ + test_formatdatetime_return(); +} diff --git a/intl/locale/tests/unit/test_bug374040.js b/intl/locale/tests/unit/test_bug374040.js new file mode 100644 index 000000000..f662c235d --- /dev/null +++ b/intl/locale/tests/unit/test_bug374040.js @@ -0,0 +1,39 @@ +function test_full() { + var date = new Date(); + var scriptableDateServ = + Components.classes["@mozilla.org/intl/scriptabledateformat;1"].createInstance(Components.interfaces.nsIScriptableDateFormat); + + var dateStrXpcom = scriptableDateServ.FormatDateTime("", + scriptableDateServ.dateFormatLong, scriptableDateServ.timeFormatSeconds, + date.getFullYear(), date.getMonth()+1, date.getDate(), date.getHours(), + date.getMinutes(), date.getSeconds()); + + var dateStrJs = date.toLocaleString(); + + do_check_eq(dateStrXpcom, dateStrJs); + +} + +function test_kTimeFormatSeconds() { + var date = new Date(); + var scriptableDateServ = + Components.classes["@mozilla.org/intl/scriptabledateformat;1"].createInstance(Components.interfaces.nsIScriptableDateFormat); + + var dateStrXpcom = scriptableDateServ.FormatDateTime("", + scriptableDateServ.dateFormatLong, scriptableDateServ.timeFormatNone, + date.getFullYear(), date.getMonth()+1, date.getDate(), date.getHours(), + date.getMinutes(), date.getSeconds()); + + var dateStrJs = date.toLocaleDateString() + + do_check_eq(dateStrXpcom, dateStrJs); + +} + +function run_test() +{ + // XXX test disabled due to bug 421790 + return; + test_full(); + test_kTimeFormatSeconds(); +} diff --git a/intl/locale/tests/unit/test_collation_mac_icu.js b/intl/locale/tests/unit/test_collation_mac_icu.js new file mode 100644 index 000000000..32ebc60eb --- /dev/null +++ b/intl/locale/tests/unit/test_collation_mac_icu.js @@ -0,0 +1,83 @@ +var {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; + +Cu.import("resource://gre/modules/Services.jsm"); + +function run_test() +{ + var input = [ + "Argentina", + "Oerlikon", + "Offenbach", + "Sverige", + "Vaticano", + "Zimbabwe", + "la France", + "¡viva España!", + "Österreich", + "中国", + "日本", + "한국", + ]; + + function test(locale, expected) { + var localeSvc = Cc["@mozilla.org/intl/nslocaleservice;1"]. + getService(Ci.nsILocaleService); + var collator = Cc["@mozilla.org/intl/collation-factory;1"]. + createInstance(Ci.nsICollationFactory). + CreateCollation(localeSvc.newLocale(locale)); + var strength = Ci.nsICollation.kCollationStrengthDefault; + var actual = input.sort((x, y) => collator.compareString(strength, x,y)); + deepEqual(actual, expected, locale); + } + + // Locale en-US; default options. + test("en-US", [ + "¡viva España!", + "Argentina", + "la France", + "Oerlikon", + "Offenbach", + "Österreich", + "Sverige", + "Vaticano", + "Zimbabwe", + "한국", + "中国", + "日本", + ]); + + // Locale sv-SE; default options. + // Swedish treats "Ö" as a separate character, which sorts after "Z". + test("sv-SE", [ + "¡viva España!", + "Argentina", + "la France", + "Oerlikon", + "Offenbach", + "Sverige", + "Vaticano", + "Zimbabwe", + "Österreich", + "한국", + "中国", + "日本", + ]); + + // Locale de-DE; default options. + // In German standard sorting, umlauted characters are treated as variants + // of their base characters: ä ≅ a, ö ≅ o, ü ≅ u. + test("de-DE", [ + "¡viva España!", + "Argentina", + "la France", + "Oerlikon", + "Offenbach", + "Österreich", + "Sverige", + "Vaticano", + "Zimbabwe", + "한국", + "中国", + "日本", + ]); +} diff --git a/intl/locale/tests/unit/test_intl_on_workers.js b/intl/locale/tests/unit/test_intl_on_workers.js new file mode 100644 index 000000000..899e39d38 --- /dev/null +++ b/intl/locale/tests/unit/test_intl_on_workers.js @@ -0,0 +1,23 @@ +function run_test() { + do_load_manifest("data/chrome.manifest"); + + if (typeof Intl !== "object") { + dump("Intl not enabled, skipping test\n"); + equal(true, true); + return; + } + + let mainThreadLocale = Intl.NumberFormat().resolvedOptions().locale; + let testWorker = new Worker("chrome://locale/content/intl_on_workers_worker.js"); + testWorker.onmessage = function (e) { + try { + let workerLocale = e.data; + equal(mainThreadLocale, workerLocale, "Worker should inherit Intl locale from main thread."); + } finally { + do_test_finished(); + } + }; + + do_test_pending(); + testWorker.postMessage("go!"); +} diff --git a/intl/locale/tests/unit/test_pluralForm.js b/intl/locale/tests/unit/test_pluralForm.js new file mode 100644 index 000000000..834605b1f --- /dev/null +++ b/intl/locale/tests/unit/test_pluralForm.js @@ -0,0 +1,615 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Make sure each of the plural forms have the correct number of forms and + * match up in functionality. + */ + +Components.utils.import("resource://gre/modules/PluralForm.jsm"); + +function run_test() +{ + let allExpect = [[ + // 0: Chinese 0-9, 10-19, ..., 90-99 + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + // 100-109, 110-119, ..., 190-199 + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + // 200-209, 210-219, ..., 290-299 + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1, + ], [ + // 1: English 0-9, 10-19, ..., 90-99 + 2,1,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + // 100-109, 110-119, ..., 190-199 + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + // 200-209, 210-219, ..., 290-299 + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + ], [ + // 2: French 0-9, 10-19, ..., 90-99 + 1,1,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + // 100-109, 110-119, ..., 190-199 + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + // 200-209, 210-219, ..., 290-299 + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + ], [ + // 3: Latvian 0-9, 10-19, ..., 90-99 + 1,2,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + // 100-109, 110-119, ..., 190-199 + 3,2,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + // 200-209, 210-219, ..., 290-299 + 3,2,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + 3,2,3,3,3,3,3,3,3,3, + ], [ + // 4: Scottish Gaelic 0-9, 10-19, ..., 90-99 + 4,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + // 100-109, 110-119, ..., 190-199 + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + // 200-209, 210-219, ..., 290-299 + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + ], [ + // 5: Romanian 0-9, 10-19, ..., 90-99 + 2,1,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + // 100-109, 110-119, ..., 190-199 + 3,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + // 200-209, 210-219, ..., 290-299 + 3,2,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + ], [ + // 6: Lithuanian 0-9, 10-19, ..., 90-99 + 2,1,3,3,3,3,3,3,3,3, + 2,2,2,2,2,2,2,2,2,2, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + // 100-109, 110-119, ..., 190-199 + 2,1,3,3,3,3,3,3,3,3, + 2,2,2,2,2,2,2,2,2,2, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + // 200-209, 210-219, ..., 290-299 + 2,1,3,3,3,3,3,3,3,3, + 2,2,2,2,2,2,2,2,2,2, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + 2,1,3,3,3,3,3,3,3,3, + ], [ + // 7: Russian 0-9, 10-19, ..., 90-99 + 3,1,2,2,2,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + // 100-109, 110-119, ..., 190-199 + 3,1,2,2,2,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + // 200-209, 210-219, ..., 290-299 + 3,1,2,2,2,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + 3,1,2,2,2,3,3,3,3,3, + ], [ + // 8: Slovak 0-9, 10-19, ..., 90-99 + 3,1,2,2,2,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + // 100-109, 110-119, ..., 190-199 + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + // 200-209, 210-219, ..., 290-299 + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + ], [ + // 9: Polish 0-9, 10-19, ..., 90-99 + 3,1,2,2,2,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + // 100-109, 110-119, ..., 190-199 + 3,3,2,2,2,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + // 200-209, 210-219, ..., 290-299 + 3,3,2,2,2,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + 3,3,2,2,2,3,3,3,3,3, + ], [ + // 10: Slovenian 0-9, 10-19, ..., 90-99 + 4,1,2,3,3,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + // 100-109, 110-119, ..., 190-199 + 4,1,2,3,3,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + // 200-209, 210-219, ..., 290-299 + 4,1,2,3,3,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + ], [ + // 11: Irish Gaeilge 0-9, 10-19, ..., 90-99 + 5,1,2,3,3,3,3,4,4,4, + 4,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + // 100-109, 110-119, ..., 190-199 + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + // 200-209, 210-219, ..., 290-299 + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5, + ], [ + // 12: Arabic 0-9, 10-19, ..., 90-99 + 6,1,2,3,3,3,3,3,3,3, + 3,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + // 100-109, 110-119, ..., 190-199 + 5,5,5,3,3,3,3,3,3,3, + 3,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + // 200-209, 210-219, ..., 290-299 + 5,5,5,3,3,3,3,3,3,3, + 3,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + ], [ + // 13: Maltese 0-9, 10-19, ..., 90-99 + 2,1,2,2,2,2,2,2,2,2, + 2,3,3,3,3,3,3,3,3,3, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + // 100-109, 110-119, ..., 190-199 + 4,2,2,2,2,2,2,2,2,2, + 2,3,3,3,3,3,3,3,3,3, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + // 200-209, 210-219, ..., 290-299 + 4,2,2,2,2,2,2,2,2,2, + 2,3,3,3,3,3,3,3,3,3, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + 4,4,4,4,4,4,4,4,4,4, + ], [ + // 14: Macedonian 0-9, 10-19, ..., 90-99 + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + // 100-109, 110-119, ..., 190-199 + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + // 200-209, 210-219, ..., 290-299 + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + 3,1,2,3,3,3,3,3,3,3, + ], [ + // 15: Icelandic 0-9, 10-19, ..., 90-99 + 2,1,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + // 100-109, 110-119, ..., 190-199 + 2,1,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + // 200-209, 210-219, ..., 290-299 + 2,1,2,2,2,2,2,2,2,2, + 2,2,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + 2,1,2,2,2,2,2,2,2,2, + ], [ + // 16: Breton 0-9, 10-19, ..., 90-99 + 5,1,2,3,3,5,5,5,5,3, + 5,5,5,5,5,5,5,5,5,5, + 5,1,2,3,3,5,5,5,5,3, + 5,1,2,3,3,5,5,5,5,3, + 5,1,2,3,3,5,5,5,5,3, + 5,1,2,3,3,5,5,5,5,3, + 5,1,2,3,3,5,5,5,5,3, + 5,5,5,5,5,5,5,5,5,5, + 5,1,2,3,3,5,5,5,5,3, + 5,5,5,5,5,5,5,5,5,5, + // 100-109, 110-119, ..., 190-199 + 5,1,2,3,3,5,5,5,5,3, + 5,5,5,5,5,5,5,5,5,5, + 5,1,2,3,3,5,5,5,5,3, + 5,1,2,3,3,5,5,5,5,3, + 5,1,2,3,3,5,5,5,5,3, + 5,1,2,3,3,5,5,5,5,3, + 5,1,2,3,3,5,5,5,5,3, + 5,5,5,5,5,5,5,5,5,5, + 5,1,2,3,3,5,5,5,5,3, + 5,5,5,5,5,5,5,5,5,5, + // 200-209, 210-219, ..., 290-299 + 5,1,2,3,3,5,5,5,5,3, + 5,5,5,5,5,5,5,5,5,5, + 5,1,2,3,3,5,5,5,5,3, + 5,1,2,3,3,5,5,5,5,3, + 5,1,2,3,3,5,5,5,5,3, + 5,1,2,3,3,5,5,5,5,3, + 5,1,2,3,3,5,5,5,5,3, + 5,5,5,5,5,5,5,5,5,5, + 5,1,2,3,3,5,5,5,5,3, + 5,5,5,5,5,5,5,5,5,5, + ]]; + + for (let [rule, expect] in Iterator(allExpect)) { + print("\nTesting rule #" + rule); + + let [get, numForms] = PluralForm.makeGetter(rule); + + // Make sure the largest value expected matches the number of plural forms + let maxExpect = Math.max.apply(this, expect); + do_check_eq(maxExpect, numForms()); + + // Make a string of numbers, e.g., 1;2;3;4;5 + let words = []; + for (let i = 1; i <= maxExpect; i++) + words.push(i); + words = words.join(";"); + + // Make sure we get the expected number + for (let [index, number] in Iterator(expect)) { + print(["Plural form of ", index, " should be ", number, " (", words, ")"].join("")); + do_check_eq(get(index, words), number); + } + } +} diff --git a/intl/locale/tests/unit/test_pluralForm_english.js b/intl/locale/tests/unit/test_pluralForm_english.js new file mode 100644 index 000000000..bdd7d2749 --- /dev/null +++ b/intl/locale/tests/unit/test_pluralForm_english.js @@ -0,0 +1,26 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * This unit test makes sure the plural form for the default language (by + * development), English, is working for the PluralForm javascript module. + */ + +Components.utils.import("resource://gre/modules/PluralForm.jsm"); + +function run_test() +{ + // English has 2 plural forms + do_check_eq(2, PluralForm.numForms()); + + // Make sure for good inputs, things work as expected + for (var num = 0; num <= 200; num++) + do_check_eq(num == 1 ? "word" : "words", PluralForm.get(num, "word;words")); + + // Not having enough plural forms defaults to the first form + do_check_eq("word", PluralForm.get(2, "word")); + + // Empty forms defaults to the first form + do_check_eq("word", PluralForm.get(2, "word;")); +} diff --git a/intl/locale/tests/unit/test_pluralForm_makeGetter.js b/intl/locale/tests/unit/test_pluralForm_makeGetter.js new file mode 100644 index 000000000..4d0928ae4 --- /dev/null +++ b/intl/locale/tests/unit/test_pluralForm_makeGetter.js @@ -0,0 +1,36 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * This unit test makes sure the plural form for Irish Gaeilge is working by + * using the makeGetter method instead of using the default language (by + * development), English. + */ + +Components.utils.import("resource://gre/modules/PluralForm.jsm"); + +function run_test() +{ + // Irish is plural rule #11 + let [get, numForms] = PluralForm.makeGetter(11); + + // Irish has 5 plural forms + do_check_eq(5, numForms()); + + // I don't really know Irish, so I'll stick in some dummy text + let words = "is 1;is 2;is 3-6;is 7-10;everything else"; + + let test = function(text, low, high) { + for (let num = low; num <= high; num++) + do_check_eq(text, get(num, words)); + }; + + // Make sure for good inputs, things work as expected + test("everything else", 0, 0); + test("is 1", 1, 1); + test("is 2", 2, 2); + test("is 3-6", 3, 6); + test("is 7-10", 7, 10); + test("everything else", 11, 200); +} diff --git a/intl/locale/tests/unit/xpcshell.ini b/intl/locale/tests/unit/xpcshell.ini new file mode 100644 index 000000000..f794fd9f4 --- /dev/null +++ b/intl/locale/tests/unit/xpcshell.ini @@ -0,0 +1,22 @@ +[DEFAULT] +head = +tail = +support-files = + data/intl_on_workers_worker.js + data/chrome.manifest + +[test_bug22310.js] +skip-if = toolkit != "windows" && toolkit != "cocoa" + +[test_bug371611.js] +[test_bug374040.js] +skip-if = toolkit == "windows" || toolkit == "cocoa" + +[test_collation_mac_icu.js] +skip-if = toolkit != "cocoa" + +[test_bug1086527.js] +[test_intl_on_workers.js] +[test_pluralForm.js] +[test_pluralForm_english.js] +[test_pluralForm_makeGetter.js] |