SupportedLocalesOf.js 4.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
  6. const ctors = [Intl.Collator, Intl.NumberFormat, Intl.DateTimeFormat];
  7. function assertEachIsOneOf(expectedList, actualList, msg) {
  8. if (!actualList || actualList.length === 0) {
  9. assert.fail(`actualList was empty: ${msg}`);
  10. }
  11. for (a of actualList) {
  12. assert.isTrue(expectedList.includes(a), msg);
  13. }
  14. }
  15. const tests = [
  16. {
  17. name: "supportedLocalesOf throws correct errors",
  18. body: function () {
  19. const rangeErrorMessage = "Option value 'incorrect' for 'localeMatcher' is outside of valid range. Expected: ['best fit', 'lookup']";
  20. const fakeLocales = { get length() { throw new Error("User-provided locale object throws"); } };
  21. function test(ctor) {
  22. if (WScript.Platform.INTL_LIBRARY === "icu") {
  23. assert.throws(() => new ctor.supportedLocalesOf(), TypeError, "", "Function is not a constructor");
  24. assert.throws(() => Reflect.construct(function() {}, [], ctor.supportedLocalesOf), TypeError, "", "'newTarget' is not a constructor");
  25. } else {
  26. assert.throws(() => new ctor.supportedLocalesOf(), TypeError, "", `Function 'Intl.${ctor.name}.supportedLocalesOf' is not a constructor`);
  27. }
  28. assert.throws(() => ctor.supportedLocalesOf(["en-US"], { localeMatcher: "incorrect" }), RangeError, "", rangeErrorMessage);
  29. assert.throws(() => ctor.supportedLocalesOf(null), TypeError, "", "Object expected");
  30. assert.throws(() => ctor.supportedLocalesOf(fakeLocales), Error, "", "User-provided locale object throws");
  31. }
  32. ctors.forEach(test);
  33. }
  34. },
  35. {
  36. name: "supportedLocalesOf basic tests",
  37. body: function () {
  38. function test(ctor) {
  39. assertEachIsOneOf(["en", "en-US"], ctor.supportedLocalesOf(["en"]));
  40. assertEachIsOneOf(["en", "en-US"], ctor.supportedLocalesOf(["en"], { localeMatcher: "lookup" }));
  41. assertEachIsOneOf(["en", "en-US"], ctor.supportedLocalesOf(["en"], { localeMatcher: "best fit" }));
  42. assertEachIsOneOf(['de', 'de-DE'], ctor.supportedLocalesOf(['de-de']));
  43. assertEachIsOneOf(['ja', 'ja-JP'], ctor.supportedLocalesOf(['ja-JP']));
  44. assertEachIsOneOf(['zh', 'zh-CN', 'zh-Hans-CN'], ctor.supportedLocalesOf(['zh-cn']));
  45. assertEachIsOneOf(
  46. [
  47. 'en', 'en-US',
  48. 'de', 'de-DE',
  49. 'ja', 'ja-JP',
  50. 'zh', 'zh-CN', 'zh-Hans-CN',
  51. ],
  52. ctor.supportedLocalesOf(['en-us', 'de-de', 'ja-JP', 'zh-cn'])
  53. );
  54. }
  55. ctors.forEach(test);
  56. }
  57. },
  58. {
  59. name: "Modifying `this` should not break supportedLocalesOf",
  60. body: function () {
  61. function test(ctor) {
  62. assertEachIsOneOf(["en", "en-US"], ctor.supportedLocalesOf.call({}, ["en"]));
  63. assertEachIsOneOf(["en", "en-US"], ctor.supportedLocalesOf.call({}, ["en"], { localeMatcher: "lookup" }));
  64. assertEachIsOneOf(["en", "en-US"], ctor.supportedLocalesOf.call({}, ["en"], { localeMatcher: "best fit" }));
  65. assertEachIsOneOf(["en", "en-US"], ctor.supportedLocalesOf.bind({})(["en"]));
  66. assertEachIsOneOf(["en", "en-US"], ctor.supportedLocalesOf.bind({})(["en"], { localeMatcher: "lookup" }));
  67. assertEachIsOneOf(["en", "en-US"], ctor.supportedLocalesOf.bind({})(["en"], { localeMatcher: "best fit" }));
  68. }
  69. ctors.forEach(test);
  70. }
  71. },
  72. {
  73. name: "supportedLocalesOf an empty array or undefined should produce an empty array",
  74. body: function () {
  75. function test(ctor) {
  76. assert.areEqual(0, ctor.supportedLocalesOf(undefined).length);
  77. assert.areEqual(0, ctor.supportedLocalesOf(undefined, { localeMatcher: "lookup" }).length);
  78. assert.areEqual(0, ctor.supportedLocalesOf(undefined, { localeMatcher: "best fit" }).length);
  79. }
  80. }
  81. }
  82. ];
  83. testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });