Newer
Older
client_dwatch / lib / facilities / __tests__ / intersect-ids.test.ts
import { describe, expect, it } from "vitest";

import { intersectFacilityIds } from "@/lib/facilities/intersect-ids";

/**
 * 指示書AK 段階3 ★§6-2★ — 施設名の絞り込みと分類の絞り込みの★積集合(AND)★。
 *
 * ★★指示書の期待値表6行をそのまま固定してある★★。
 *   ★最後の2行(積集合が空 / 片方が0件ヒット)が要★ — ★`null` にしないこと★。
 *   `null` にすると条件ごと消えて ★0件が全件表示に化けます★(落とし穴2)。
 */
describe("intersectFacilityIds(指示書AK 段階3 §6-2 の期待値表)", () => {
  it("#1 `null` × `null` → ★`null`★(どちらも未指定=絞らない)", () => {
    expect(intersectFacilityIds(null, null)).toBeNull();
  });

  it("#2 `[1,2,3]` × `null` → `[1,2,3]`(片方だけ指定)", () => {
    expect(intersectFacilityIds([1, 2, 3], null)).toEqual([1, 2, 3]);
  });

  it("#3 `null` × `[2,3,4]` → `[2,3,4]`(片方だけ指定・逆向き)", () => {
    expect(intersectFacilityIds(null, [2, 3, 4])).toEqual([2, 3, 4]);
  });

  it("#4 `[1,2,3]` × `[2,3,4]` → ★`[2,3]`★(★和集合にしないこと★)", () => {
    expect(intersectFacilityIds([1, 2, 3], [2, 3, 4])).toEqual([2, 3]);
  });

  it("#5 ★`[1]` × `[2]` → `[]`★(★`null` にしないこと★。落とし穴2)", () => {
    const result = intersectFacilityIds([1], [2]);
    expect(result).toEqual([]);
    expect(result).not.toBeNull();
  });

  it("#6 ★`[]` × `[1,2]` → `[]`★(0件ヒットは0件のまま)", () => {
    const result = intersectFacilityIds([], [1, 2]);
    expect(result).toEqual([]);
    expect(result).not.toBeNull();
  });

  it("★`[]` × `null` は `[]`★(0件ヒットが「未指定」に化けないこと)", () => {
    expect(intersectFacilityIds([], null)).toEqual([]);
    expect(intersectFacilityIds(null, [])).toEqual([]);
  });

  it("★並び順は第1引数の順序を保つ★(理由なく並び替えない)", () => {
    expect(intersectFacilityIds([3, 1, 2], [2, 3])).toEqual([3, 2]);
  });

  it("★入力の配列を壊さない(純粋関数)★", () => {
    const a = [1, 2, 3];
    const b = [2, 3, 4];
    intersectFacilityIds(a, b);
    expect(a).toEqual([1, 2, 3]);
    expect(b).toEqual([2, 3, 4]);
  });
});