/**
* アラート種別ラベルの期待値表(指示書S 2-2 / 完了条件7 / D-105)
*
* ★fixtures の実データを通す★ — 「`precheck_minutes: 20` の行が『20分前異常』と
* 表示されること」は本指示書の完了条件(指示書S 完了条件7)。
* 目視だけで済ませないため、ここで固定する(`CLAUDE.md` §6-2)。
* ★JA / EN の両方を見る★ — 従来 `lib/i18n.ts` にキーが無く EN でも日本語のまま出ていた
* (D-093 項2-3 の指摘)。対訳を入れたことを固定する。
* ★アラートは事前チェック異常だけ★(ユーザー判断 2026-10-29)— 旧「出発失敗」「事前チェック異常」(分数 null の退避)の
* ラベルは消した。
*/
import { describe, expect, it } from "vitest";
import { PRECHECK_MINUTES_BEFORE } from "@/lib/config";
import { prechecks } from "@/lib/fixtures/prechecks";
import { translate, type Lang } from "@/lib/i18n";
import { precheckSeverityLabel } from "@/lib/prechecks/label";
const ja = (text: string) => translate("ja", text);
const en = (text: string) => translate("en", text);
function labelsFor(lang: Lang): string[] {
const t = lang === "ja" ? ja : en;
return prechecks.map((item) => precheckSeverityLabel(t, item));
}
describe("precheckSeverityLabel", () => {
it("設定値の分数(60 / 30)は「◯分前異常」になる", () => {
const [first, second] = PRECHECK_MINUTES_BEFORE;
expect(precheckSeverityLabel(ja, { precheck_minutes: first })).toBe(`${first}分前異常`);
expect(precheckSeverityLabel(ja, { precheck_minutes: second })).toBe(`${second}分前異常`);
});
it("★設定値以外の任意の分数でも組み立てられる(D-093 項2「20だったら20分前」)★", () => {
expect(precheckSeverityLabel(ja, { precheck_minutes: 20 })).toBe("20分前異常");
expect(precheckSeverityLabel(ja, { precheck_minutes: 45 })).toBe("45分前異常");
});
it("EN では対訳が効く(従来はキーが無く日本語のまま出ていた)", () => {
expect(precheckSeverityLabel(en, { precheck_minutes: 20 })).toBe("Error 20 min before");
});
it("★fixtures の全件が JA で「60分前異常 / 30分前異常 / 20分前異常」になる(出発失敗は無い)★", () => {
const labels = new Set(labelsFor("ja"));
const [first, second] = PRECHECK_MINUTES_BEFORE;
expect(labels).toEqual(new Set([`${first}分前異常`, `${second}分前異常`, "20分前異常"]));
});
it("fixtures の全件が EN でも日本語を含まない", () => {
for (const label of labelsFor("en")) {
expect(label).not.toMatch(/[-ヿ一-鿿]/);
}
});
});