gpii-windows
Version:
Components of the GPII personalization infrastructure for use on Microsoft's "Windows" ™
371 lines (318 loc) • 13.9 kB
JavaScript
/*
* Tests for Windows Language
*
* Copyright 2018 Raising the Floor - International
*
* Licensed under the New BSD license. You may not use this file except in
* compliance with this License.
*
* The R&D leading to these results received funding from the
* Department of Education - Grant H421A150005 (GPII-APCP). However,
* these results do not necessarily represent the policy of the
* Department of Education, and you should not assume endorsement by the
* Federal Government.
*
* You may obtain a copy of the License at
* https://github.com/GPII/universal/blob/master/LICENSE.txt
*/
;
var fluid = require("gpii-universal");
var jqUnit = fluid.require("node-jqunit");
var gpii = fluid.registerNamespace("gpii");
require("../src/language.js");
fluid.registerNamespace("gpii.tests.windows.language");
jqUnit.module("Language tests");
// Tests for getLanguageNames();
// Language code casing tests (from https://tools.ietf.org/html/rfc5646#appendix-A)
// expected => [inputs]
gpii.tests.windows.language.codeCaseTests = fluid.freezeRecursive({
// Simple language subtag:
"de": ["de", "DE"],
// Language subtag plus Script subtag:
"zh-Hant": ["zh-Hant", "ZH-Hant"],
// Extended language subtags and their primary language subtag counterparts
"zh-cmn-Hans-CN": ["zh-cmn-Hans-cn", "ZH-cmn-Hans-CN"],
"cmn-Hans-CN": ["cmn-Hans-cn", "CMN-Hans-CN"],
"yue-HK": ["yue-hk", "YUE-HK"],
"yue": ["yue", "YUE"],
// Language-Script-Region:
"sr-Latn-RS": ["sr-Latn-rs", "SR-Latn-RS"],
// Language-Variant:
"sl-rozaj": ["sl-rozaj", "SL-rozaj"],
"sl-rozaj-biske": ["sl-rozaj-biske", "SL-rozaj-biske"],
// Language-Region-Variant:
"de-CH-1901": ["de-ch-1901", "DE-CH-1901"],
"sl-IT-nedis": ["sl-it-nedis", "SL-IT-nedis"],
// Language-Script-Region-Variant:
"hy-Latn-IT-arevela": ["hy-Latn-it-arevela", "HY-Latn-IT-arevela"],
// Language-Region:
"de-DE": ["de-de", "DE-DE"],
"en-US": ["en-us", "EN-US"],
"es-419": ["es-419", "ES-419"],
// Private use subtags:
"de-CH-x-phonebk": ["de-ch-x-phonebk", "de-ch-x-phonebk"],
"az-Arab-x-AZE-derbend": ["az-Arab-x-AZE-derbend", "AZ-Arab-x-AZE-derbend"],
// Private use registry values:
"x-whatever": ["x-whatever", "x-whatever"],
"qaa-Qaaa-QM-x-southern": ["qaa-Qaaa-qm-x-southern", "QAA-Qaaa-QM-x-southern"],
"de-Qaaa": ["de-Qaaa", "DE-Qaaa"],
"sr-Qaaa-RS": ["sr-Qaaa-rs", "SR-Qaaa-RS"],
// Tags that use extensions (examples ONLY -- extensions MUST be defined by revision or update to this document, or by RFC):
"en-US-u-islamcal": ["en-us-u-islamcal", "EN-US-u-islamcal"],
"zh-CN-a-myext-x-private": ["zh-cn-a-myext-x-private", "ZH-CN-a-myext-x-private"],
"en-a-myext-b-another": ["en-a-myext-b-another", "EN-a-myext-b-another"],
// Some Invalid Tags
"de-419-DE": ["de-419-de", "DE-419-DE"], // incorrect result
"a-DE": "a-DE",
"a-de": "a-de",
"ar-a-aaa-b-bbb-a-ccc": ["ar-a-aaa-b-bbb-a-ccc", "AR-a-aaa-b-bbb-a-ccc"], // incorrect result
"-": "-",
"-AB": "-AB",
"-ab": "-ab",
"-XYZ": "-XYZ",
"-xyz": "-xyz",
"": ["", null, 123, 0, {}, [], NaN, fluid.identity],
// Actual language packs for Windows
"az-Latn-AZ": [ "az-Latn-az", "AZ-Latn-AZ" ],
"bs-Latn-BA": [ "bs-Latn-ba", "BS-Latn-BA" ],
"ku-ARAB-IQ": [ "ku-ARAB-iq", "KU-ARAB-IQ" ],
"chr-CHER-US": [ "chr-CHER-us", "CHR-CHER-US" ],
"prs-AF": [ "prs-af", "PRS-AF" ],
"fil-PH": [ "fil-ph", "FIL-PH" ],
"ha-Latn-NG": [ "ha-Latn-ng", "HA-Latn-NG" ],
"iu-Latn-CA": [ "iu-Latn-ca", "IU-Latn-CA" ],
"quc-Latn-GT": [ "quc-Latn-gt", "QUC-Latn-GT" ],
"qut-GT": [ "qut-gt", "QUT-GT" ],
"kok-IN": [ "kok-in", "KOK-IN" ],
"pa-Arab-PK": [ "pa-Arab-pk", "PA-Arab-PK" ],
"quz-PE": [ "quz-pe", "QUZ-PE" ],
"sr-Cyrl-BA": [ "sr-Cyrl-ba", "SR-Cyrl-BA" ],
"sr-Cyrl-CS": [ "sr-Cyrl-cs", "SR-Cyrl-CS" ],
"sr-Cyrl-RS": [ "sr-Cyrl-rs", "SR-Cyrl-RS" ],
"nso-ZA": [ "nso-za", "NSO-ZA" ],
"sd-Arab-PK": [ "sd-Arab-pk", "SD-Arab-PK" ],
"tg-Cyrl-TJ": [ "tg-Cyrl-tj", "TG-Cyrl-TJ" ],
"uz-Latn-UZ": [ "uz-Latn-uz", "UZ-Latn-UZ" ],
"ca-ES-valencia": [ "ca-ES-valencia", "CA-ES-valencia" ]
});
// Tests for getLanguageNames();
gpii.tests.windows.language.nameTests = fluid.freezeRecursive([
{
input: "en",
expect: {
"en": {
"english": "English",
"local": "English",
"native": "English",
"code": "en"
}
}
},
// Perform the tests in a single chunk, to save starting so many processes.
{
input: ["en-US", "eN-Gb", "eN-Gb", "es-ES", "es-MX", "fr", "bg", "bg-BG", "bg-GB", "ta-LK", "zh-DE", "en-xyz"],
expect: {
"en-US": {
"english": "English (United States)",
"local": "English (United States)",
"native": "English (United States)",
"code": "en-US",
"current": true
},
"eN-Gb": {
"english": "English (United Kingdom)",
"local": "English (United Kingdom)",
"native": "English (United Kingdom)",
"code": "eN-Gb"
},
"es-ES": {
"english": "Spanish (Spain)",
"local": "Spanish (Spain)",
"native": "Español (España)",
"code": "es-ES"
},
"es-MX": {
"english": "Spanish (Mexico)",
"local": "Spanish (Mexico)",
"native": "Español (México)",
"code": "es-MX"
},
"fr": {
"english": "French",
"local": "French",
"native": "français",
"code": "fr"
},
"bg": {
"english": "Bulgarian",
"local": "Bulgarian",
"native": "български",
"code": "bg"
},
"bg-BG": {
"english": "Bulgarian",
"local": "Bulgarian",
"native": "български",
"code": "bg-BG"
},
"bg-GB": {
"english": "Bulgarian (bg-GB)",
"local": "Bulgarian (bg-GB)",
"native": "български (bg-GB)",
"code": "bg-GB"
},
"ta-LK": {
"english": "Tamil (Sri Lanka)",
"local": "Tamil (Sri Lanka)",
"native": "தமிழ் (இலங்கை)",
"code": "ta-LK"
},
"zh-DE": {
"english": "Chinese (zh-DE)",
"local": "",
"native": "",
"code": "zh-DE"
},
"en-xyz": {
"english": "English (en-xyz)",
"local": "English (en-xyz)",
"native": "English (en-xyz)",
"code": "en-xyz"
}
}
},
{
input: ["zz-DE", "zz-AA", "zz", "", 1, "-", "a"],
expect: {
// Valid, but unknown
"zz-DE": {"english": "", "local": "", "native": "", code: "zz-DE"},
"zz-AA": {"english": "", "local": "", "native": "", code: "zz-AA"},
"zz": {"english": "", "local": "", "native": "", code: "zz"},
// Invalid
"": {"english": null, "local": null, "native": null, code: ""},
1: {"english": null, "local": null, "native": null, code: "1"},
"-": {"english": null, "local": null, "native": null, code: "-"},
"a": {"english": null, "local": null, "native": null, code: "a"}
}
}
]);
// If the GPII_IGNORE_LANGTEST environment variable is set, then ignore the test results that would be affected by the
// current language (but still run the code).
gpii.tests.windows.language.ignoreResults = !!process.env.GPII_IGNORE_LANGTEST;
if (gpii.tests.windows.language.ignoreResults) {
fluid.log("SOFT-FAIL: GPII_IGNORE_LANGTEST is set - ignoring the results.");
}
jqUnit.test("Checking current language", function () {
jqUnit.expect(gpii.tests.windows.language.ignoreResults ? 0 : 1);
// Windows language identifier for en-US
var englishUS = 1033;
var lcid = gpii.windows.kernel32.GetThreadUILanguage();
if (!gpii.tests.windows.language.ignoreResults) {
// The tests expect the current language to be en-US. Fail in an obvious manner before attempting the tests.
// Those brave enough to run the tests on a non-vagrant box are free to ignore these tests.
jqUnit.assertEquals("The current language must be English (US) [en-US]. " +
"Set GPII_IGNORE_LANGTEST to ignore the language failures.", englishUS, lcid);
}
});
jqUnit.test("Test language code casing", function () {
var tests = gpii.tests.windows.language.codeCaseTests;
fluid.each(tests, function (inputs, langCode) {
inputs = fluid.makeArray(inputs);
inputs.push(langCode);
fluid.each(inputs, function (input) {
console.log(langCode, input);
var result = gpii.windows.language.fixCodeCase(input);
jqUnit.assertEquals("Language case should be correct", langCode, result);
});
});
});
jqUnit.test("Test getting current display language", function () {
jqUnit.expect(gpii.tests.windows.language.ignoreResults ? 1 : 2);
var origLangCode = gpii.windows.readRegistryKey(
"HKEY_CURRENT_USER", "Control Panel\\Desktop", "PreferredUILanguages", "REG_SZ").value;
try {
// Try it with a language in the registry
var langCode = "nl-BE";
gpii.windows.writeRegistryKey(
"HKEY_CURRENT_USER", "Control Panel\\Desktop", "PreferredUILanguages", langCode, "REG_SZ");
var result1 = gpii.windows.language.getDisplayLanguage();
jqUnit.assertEquals("getDisplayLanguage must return what the registry was set to", langCode, result1);
// Try without a language in the registry - it should be the thread's language.
gpii.windows.writeRegistryKey(
"HKEY_CURRENT_USER", "Control Panel\\Desktop", "PreferredUILanguages", undefined, "REG_SZ");
var result2 = gpii.windows.language.getDisplayLanguage();
if (!gpii.tests.windows.language.ignoreResults) {
jqUnit.assertEquals("getDisplayLanguage must return what the registry was set to", result2, "en-US");
}
} finally {
gpii.windows.writeRegistryKey(
"HKEY_CURRENT_USER", "Control Panel\\Desktop", "PreferredUILanguages", origLangCode, "REG_SZ");
}
});
jqUnit.asyncTest("Test getting language names", function () {
var tests = gpii.tests.windows.language.nameTests;
jqUnit.expect(Object.keys(tests).length * (gpii.tests.windows.language.ignoreResults ? 1 : 2));
var language = gpii.windows.language({
listeners: {
"onCreate.update": fluid.identity
}
});
var doTest = function (testIndex) {
var test = tests[testIndex];
if (test) {
var p = language.getLanguageNames(test.input);
jqUnit.assertTrue("getLanguageNames must return a promise", fluid.isPromise(p));
p.then(function (result) {
if (!gpii.tests.windows.language.ignoreResults) {
jqUnit.assertDeepEq("Language names for '" + test.input + "' should match the expected",
test.expect, result);
}
doTest(testIndex + 1);
}, fluid.fail);
} else {
language.destroy();
jqUnit.start();
}
};
doTest(0);
});
jqUnit.asyncTest("Test getting installed languages", function () {
jqUnit.expect(gpii.tests.windows.language.ignoreResults ? 6 : 7);
var currentLanguage = gpii.windows.language.getDisplayLanguage();
fluid.log("currentLanguage:" + currentLanguage);
jqUnit.assertNotNull("getDisplayLanguage should return something", currentLanguage);
// The expected value for the en-US field of the installed languages.
var expect = {
english: "English (United States)",
local: "English (United States)",
native: "English (United States)",
code: "en-US",
current: currentLanguage === "en-US"
};
var language = gpii.windows.language();
// Check the model update
language.applier.change("installedLanguages", {}, "DELETE");
language.applier.modelChanged.addListener("installedLanguages", function (newValue) {
if (gpii.tests.windows.language.ignoreResults) {
jqUnit.assert("installedLanguages changed");
} else {
jqUnit.assertDeepEq("Model ", expect, newValue["en-US"]);
}
});
var p = language.getInstalledLanguages();
jqUnit.assertTrue("getInstalledLanguages should return a promise", fluid.isPromise(p));
p.then(function (result) {
jqUnit.assertTrue("getInstalledLanguages should return an object", fluid.isPlainObject(result, true));
jqUnit.assertTrue("getInstalledLanguages result should have fields", Object.keys(result).length > 0);
if (!gpii.tests.windows.language.ignoreResults) {
var enUS = result["en-US"];
jqUnit.assertDeepEq("getInstalledLanguages should return en-US", expect, enUS);
}
// Calling the second time, the list should be the same and will therefore resolve with null
language.getInstalledLanguages().then(function (result2) {
jqUnit.assertNull("Second call to getInstalledLanguages should resolve with null", result2);
language.destroy();
jqUnit.start();
}, fluid.fail);
}, fluid.fail);
});