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]);
});
});