/**
* `lib/format/precheck-status.ts` の期待値表(D-171 / D-178)
*
* 清掃詳細ログ(`CleanLogTable`)の「事前チェック1回目 / 2回目」のセルの中身を決める。
* ★null = その回の事前チェックの予定が無い★(ユーザー指示 2026-10-07「事前チェックがないものは-にしてください」)。
*
* | # | 入力 | 期待 | 何を固定するか |
* |----|-------------------|-----------------------------------|----------------|
* | S1 | null | { kind: "none", text: "-" } | Pill を出さず「-」(N2 の行は2列とも「-」) |
* | S2 | "Standby." | { kind: "pill", text: "Standby." }| 予定があって異常なし(N1)は今までどおり Pill |
* | S3 | "EmergencyStop" | { kind: "pill", ... } | 生値のまま(D-077。変換しない) |
* | S4 | ""(空文字) | { kind: "pill", text: "" } | ★「-」にするのは null だけ★(空文字は値として運ぶ) |
* | S5 | "-" | { kind: "pill", text: "-" } | ★DB の値が "-" でも予定ありとして Pill★(見た目で区別がつく) |
*
* `precheckMinutesLabel(lang, minutes)` — Pill の横に出す「何分前か」(D-178)
*
* | # | lang | minutes | 期待 | 何を固定するか |
* |----|------|---------|-----------|----------------|
* | M1 | ja | 60 | "60分前" | JP の書き方 |
* | M2 | en | 60 | "60 min" | EN は短く(辞書の "{n} min before" ではない) |
* | M3 | ja | 10 | "10分前" | ★30 以外の分数も出る★(設定を 60/10 にした場合。D-178 の発端) |
* | M4 | ja | 1 | "1分前" | ★生値のまま★(旧コード値 1 / 2 を 60 / 30 に読み替えない) |
* | M5 | ja/en| 0 | "0分前" / "0 min" | 0 は null ではない(falsy で落とさない) |
* | M6 | ja/en| null | null | 分数が無ければ文字を出さない(Pill だけ) |
*/
import { describe, expect, it } from "vitest";
import {
PRECHECK_STATUS_NONE,
precheckMinutesLabel,
precheckStatusCell,
} from "@/lib/format/precheck-status";
describe("precheckStatusCell", () => {
it("S1: null(事前チェックの予定が無い)は Pill を出さず「-」", () => {
expect(precheckStatusCell(null)).toEqual({ kind: "none", text: "-" });
expect(PRECHECK_STATUS_NONE).toBe("-");
});
it("S2: Standby.(予定があり異常なし)は Pill", () => {
expect(precheckStatusCell("Standby.")).toEqual({ kind: "pill", text: "Standby." });
});
it("S3: エラーの生値はそのまま Pill(変換しない。D-077)", () => {
expect(precheckStatusCell("EmergencyStop")).toEqual({
kind: "pill",
text: "EmergencyStop",
});
});
it("S4: 空文字は null ではないので Pill のまま(「-」にするのは null だけ)", () => {
expect(precheckStatusCell("")).toEqual({ kind: "pill", text: "" });
});
it("S5: 値そのものが \"-\" でも予定ありとして Pill", () => {
expect(precheckStatusCell("-")).toEqual({ kind: "pill", text: "-" });
});
});
describe("precheckMinutesLabel", () => {
it("M1: JP は「60分前」", () => {
expect(precheckMinutesLabel("ja", 60)).toBe("60分前");
});
it("M2: EN は「60 min」", () => {
expect(precheckMinutesLabel("en", 60)).toBe("60 min");
});
it("M3: 30 以外の分数も出る(60/10 の設定)", () => {
expect(precheckMinutesLabel("ja", 10)).toBe("10分前");
expect(precheckMinutesLabel("en", 10)).toBe("10 min");
});
it("M4: 分数は生値のまま(旧コード値 1 を読み替えない)", () => {
expect(precheckMinutesLabel("ja", 1)).toBe("1分前");
});
it("M5: 0 は null ではないので文字を出す", () => {
expect(precheckMinutesLabel("ja", 0)).toBe("0分前");
expect(precheckMinutesLabel("en", 0)).toBe("0 min");
});
it("M6: null なら null(Pill だけを出す)", () => {
expect(precheckMinutesLabel("ja", null)).toBeNull();
expect(precheckMinutesLabel("en", null)).toBeNull();
});
});