Newer
Older
client_dwatch / lib / format / __tests__ / raw-label.test.ts
/**
 * `formatRawLabel()` の期待値表(指示書O 段階2)。
 *
 * ★期待値表を先に確定させ、実装より先にこのテストを書いている(CLAUDE.md §9.4)★
 *
 * | # | 入力                        | 期待値                          | 意図                                   |
 * |---|-----------------------------|----------------------------------|----------------------------------------|
 * | 1 | "EmergencyStop"             | "EmergencyStop"(そのまま)      | 値が入っていれば生値のまま(D-077)    |
 * | 2 | ""                          | EMPTY_VALUE_LABEL                | 空文字は代替文言                       |
 * | 3 | "   "                       | EMPTY_VALUE_LABEL                | 空白のみも代替文言                     |
 * | 4 | null                        | EMPTY_VALUE_LABEL                | nullも代替文言                         |
 * | 5 | undefined                   | EMPTY_VALUE_LABEL                | undefinedも代替文言                    |
 * | 6 | "  EmergencyStop  "         | "EmergencyStop"(トリムして返す)| 前後空白はトリムする決定を固定する     |
 *
 * ★ケース6の決定: トリムして返す★(`lib/format/robot-model.ts` が比較前にトリムしている
 * 前例を踏襲。指示書O 禁止事項2「トリム以外の変換をしない」=トリムは許容される変換)。
 */
import { describe, expect, it } from "vitest";
import { EMPTY_VALUE_LABEL, formatRawLabel } from "@/lib/format/raw-label";

describe("formatRawLabel", () => {
  it("1. 値が入っていれば生値のまま返す(加工しない。D-077)", () => {
    expect(formatRawLabel("EmergencyStop")).toBe("EmergencyStop");
  });

  it("2. 空文字は代替文言になる", () => {
    expect(formatRawLabel("")).toBe(EMPTY_VALUE_LABEL);
  });

  it("3. 空白のみの文字列は代替文言になる", () => {
    expect(formatRawLabel("   ")).toBe(EMPTY_VALUE_LABEL);
  });

  it("4. null は代替文言になる", () => {
    expect(formatRawLabel(null)).toBe(EMPTY_VALUE_LABEL);
  });

  it("5. undefined は代替文言になる", () => {
    expect(formatRawLabel(undefined)).toBe(EMPTY_VALUE_LABEL);
  });

  it("6. 前後に空白がある値はトリムして返す(決定を固定する)", () => {
    expect(formatRawLabel("  EmergencyStop  ")).toBe("EmergencyStop");
  });

  it("代替文言そのものが空でないこと(実装が壊れて空文字を返す事故を検知する)", () => {
    expect(EMPTY_VALUE_LABEL.length).toBeGreaterThan(0);
  });
});