import { describe, expect, it } from "vitest"; import { type SeasonTable, suggestRule } from "../src/index.ts"; // 建议规则:发布时间对播出日期配对,试 EP±n / EP*2 / EP*2-1 function weekly(first: string, count: number) { const t0 = Date.parse(`${first}T00:00:00Z`); return Array.from({ length: count }, (_, i) => ({ episode: i + 1, airDate: new Date(t0 + i * 7 * 86_400_000).toISOString().slice(0, 10), })); } // S1 2025-10 起 12 集,S2 2026-01-08 起 12 集 const t: SeasonTable = { seasons: [ { season: 1, total: 12, episodes: weekly("2025-10-02", 12) }, { season: 2, total: 12, episodes: weekly("2026-01-08", 12) }, ], latestSeason: 2, ended: false, }; const ep = (n: number) => ({ start: n, end: n }); describe("suggestRule", () => { it("连续编号 13、14、16 都对上 S2 播出 → EP-12 目标季 2", () => { const r = suggestRule( [ { episodes: ep(13), publishedAt: "2026-01-08T15:00:00Z" }, { episodes: ep(14), publishedAt: "2026-01-16T01:00:00Z" }, { episodes: ep(16), publishedAt: "2026-01-29T15:00:00Z" }, ], t, ); expect(r).toMatchObject({ expression: "EP-12", targetSeason: 2 }); expect(r?.samples.map((s) => s.target)).toEqual([ { season: 2, episode: 1 }, { season: 2, episode: 2 }, { season: 2, episode: 4 }, ]); }); it("双集合并发布:1、2 对上 S2E1、S2E3 → EP*2-1", () => { const r = suggestRule( [ { episodes: ep(1), publishedAt: "2026-01-08T15:00:00Z" }, { episodes: ep(2), publishedAt: "2026-01-22T15:00:00Z" }, ], t, ); expect(r).toMatchObject({ expression: "EP*2-1", targetSeason: 2 }); }); it("样本不足(1 个)→ null", () => { expect(suggestRule([{ episodes: ep(13), publishedAt: "2026-01-08T15:00:00Z" }], t)).toBeNull(); }); it("样本冲突(第二个发布时间对不上同一偏移)→ null", () => { expect( suggestRule( [ { episodes: ep(13), publishedAt: "2026-01-08T15:00:00Z" }, { episodes: ep(14), publishedAt: "2026-03-01T15:00:00Z" }, ], t, ), ).toBeNull(); }); });