summaryrefslogtreecommitdiff
path: root/src/utils/lang.test.ts
blob: eac59486a214653b7554bc5e4ef435baa8556281 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import { assert, assertEquals, assertFalse } from "@std/assert";
import { describe, it } from "@std/testing/bdd";
import {
  getFlagEmojiFromLocale,
  getLanguageNameFromLocale,
  isValidLocale,
  LANGUAGE_DEFAULTS,
} from "./lang.ts";

describe("getFlagEmojiFromLocale", () => {
  it("returns πŸ‡ΊπŸ‡Έ for 'en-US'", () => {
    assertEquals(getFlagEmojiFromLocale("en-US"), "πŸ‡ΊπŸ‡Έ");
  });

  it("returns πŸ‡§πŸ‡· for 'pt-BR'", () => {
    assertEquals(getFlagEmojiFromLocale("pt-BR"), "πŸ‡§πŸ‡·");
  });

  it("returns πŸ‡«πŸ‡· for 'fr-FR'", () => {
    assertEquals(getFlagEmojiFromLocale("fr-FR"), "πŸ‡«πŸ‡·");
  });

  it("uses fallback country from LANGUAGE_DEFAULTS when no region", () => {
    for (const i in LANGUAGE_DEFAULTS) {
      if (i in LANGUAGE_DEFAULTS) {
        assertEquals(
          getFlagEmojiFromLocale(i),
          getFlagEmojiFromLocale(
            `${i}-${LANGUAGE_DEFAULTS[i as keyof typeof LANGUAGE_DEFAULTS]}`,
          ),
        );
      }
    }
  });

  it("returns empty string for unsupported languages", () => {
    assertEquals(getFlagEmojiFromLocale("xx"), "");
    assertEquals(getFlagEmojiFromLocale("de"), "");
  });

  it("is case-insensitive", () => {
    assertEquals(getFlagEmojiFromLocale("EN-us"), "πŸ‡ΊπŸ‡Έ");
    assertEquals(getFlagEmojiFromLocale("Pt"), "πŸ‡΅πŸ‡Ή");
  });
});

describe("getLanguageNameFromLocale", () => {
  it("returns 'English' for 'en'", () => {
    const result = getLanguageNameFromLocale("en");
    assertEquals(typeof result, "string");
    assert(result.length > 0);
  });

  it("returns '' for invalid locale", () => {
    assertEquals(getLanguageNameFromLocale(new Date().toLocaleString()), "");
  });

  it("returns name in the correct locale", () => {
    const fr = getLanguageNameFromLocale("fr");
    const pt = getLanguageNameFromLocale("pt");

    assertEquals(typeof fr, "string");
    assertEquals(typeof pt, "string");
    assert(fr.length > 0);
    assert(pt.length > 0);
  });
});

describe("isValidLocale", () => {
  it("returns true for valid simple language tags", () => {
    assert(isValidLocale("en"));
    assert(isValidLocale("fr"));
    assert(isValidLocale("pt"));
  });

  it("returns true for valid language-region tags", () => {
    assert(isValidLocale("en-US"));
    assert(isValidLocale("pt-BR"));
    assert(isValidLocale("fr-FR"));
  });

  it("returns true for valid locale with script", () => {
    assert(isValidLocale("zh-Hant"));
    assert(isValidLocale("sr-Cyrl"));
  });

  it("returns false for invalid formats", () => {
    assertFalse(isValidLocale("EN_us"));
    assertFalse(isValidLocale("xx-YY-ZZ"));
    assertFalse(isValidLocale("123"));
    assertFalse(isValidLocale(""));
  });

  it("is case-insensitive and accepts well-formed mixed cases", () => {
    assert(isValidLocale("eN-uS"));
  });
});