summaryrefslogtreecommitdiff
path: root/src/utils/lang.test.ts
diff options
context:
space:
mode:
authorJoão Augusto Costa Branco Marado Torres <torres.dev@disroot.org>2025-06-24 12:08:41 -0300
committerJoão Augusto Costa Branco Marado Torres <torres.dev@disroot.org>2025-06-24 12:50:43 -0300
commitf9a77c5c27aede4e5978eb55d9b7af781b680a1d (patch)
treed545e325ba1ae756fc2eac66fac1001b6753c40d /src/utils/lang.test.ts
feat!: initial commit
Signed-off-by: João Augusto Costa Branco Marado Torres <torres.dev@disroot.org>
Diffstat (limited to 'src/utils/lang.test.ts')
-rw-r--r--src/utils/lang.test.ts97
1 files changed, 97 insertions, 0 deletions
diff --git a/src/utils/lang.test.ts b/src/utils/lang.test.ts
new file mode 100644
index 0000000..eac5948
--- /dev/null
+++ b/src/utils/lang.test.ts
@@ -0,0 +1,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"));
+ });
+});