68 lines
2.0 KiB
TypeScript
68 lines
2.0 KiB
TypeScript
import { test } from "node:test";
|
|
import assert from "node:assert";
|
|
import { mkdtempSync, writeFileSync } from "node:fs";
|
|
import { tmpdir } from "node:os";
|
|
import { join } from "node:path";
|
|
import { detectKeyboardLayout, detectLang } from "../src/locale.js";
|
|
|
|
function withFakeLocalectl(output: string, fn: () => void) {
|
|
const dir = mkdtempSync(join(tmpdir(), "fake-localectl-"));
|
|
writeFileSync(join(dir, "localectl"), `#!/bin/sh\ncat <<'EOF'\n${output}\nEOF\n`, { mode: 0o755 });
|
|
const originalPath = process.env.PATH;
|
|
process.env.PATH = `${dir}:${originalPath}`;
|
|
try {
|
|
fn();
|
|
} finally {
|
|
process.env.PATH = originalPath;
|
|
}
|
|
}
|
|
|
|
test("detectKeyboardLayout reads the X11 Layout line", () => {
|
|
withFakeLocalectl(
|
|
` System Locale: LANG=de_DE.UTF-8
|
|
VC Keymap: de-latin1
|
|
X11 Layout: de
|
|
X11 Model: pc105`,
|
|
() => {
|
|
assert.strictEqual(detectKeyboardLayout(), "de");
|
|
},
|
|
);
|
|
});
|
|
|
|
test("detectKeyboardLayout falls back to 'us' when localectl has no X11 Layout line", () => {
|
|
withFakeLocalectl(` System Locale: LANG=en_US.UTF-8\n VC Keymap: us`, () => {
|
|
assert.strictEqual(detectKeyboardLayout(), "us");
|
|
});
|
|
});
|
|
|
|
test("detectKeyboardLayout falls back to 'us' when localectl is missing entirely", () => {
|
|
const originalPath = process.env.PATH;
|
|
process.env.PATH = "/nonexistent";
|
|
try {
|
|
assert.strictEqual(detectKeyboardLayout(), "us");
|
|
} finally {
|
|
process.env.PATH = originalPath;
|
|
}
|
|
});
|
|
|
|
test("detectLang reads $LANG", () => {
|
|
const original = process.env.LANG;
|
|
process.env.LANG = "de_DE.UTF-8";
|
|
try {
|
|
assert.strictEqual(detectLang(), "de_DE.UTF-8");
|
|
} finally {
|
|
if (original === undefined) delete process.env.LANG;
|
|
else process.env.LANG = original;
|
|
}
|
|
});
|
|
|
|
test("detectLang returns null when $LANG is unset", () => {
|
|
const original = process.env.LANG;
|
|
delete process.env.LANG;
|
|
try {
|
|
assert.strictEqual(detectLang(), null);
|
|
} finally {
|
|
if (original !== undefined) process.env.LANG = original;
|
|
}
|
|
});
|