Files
UHD_Media_Tool/packages/domain/test/episode-resolution-suggest.test.ts
T

70 lines
2.1 KiB
TypeScript

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