import assert from "node:assert/strict"; import { test } from "node:test"; import { groupSameChange, type SamePair } from "../src/flow/steps/round.ts"; // 判重合并怎么连组(任务书 14 第 2.4 节):判为相同的连成一组,组里有留池候选就并进它, // 新候选按组里编号最小的原提案编号。预期值按规则手写。 const pair = (a: string, b: string, yes: boolean): SamePair => ({ a, b, judgment: { question: "same_change", questionHash: "h", threshold: 0.5, probability: yes ? 0.9 : 0.1, yes, requestId: "req" }, }); test("A 与 B 相同、B 与 C 相同:A、B、C 连成一个候选,即使 A 与 C 判为不同;新候选按组里最小的原提案编号", () => { const ps = ["r1-researcher-1-1", "r1-researcher-1-2", "r1-researcher-2-1", "r1-researcher-3-1"]; const pairs = [ pair("r1-researcher-1-1", "r1-researcher-1-2", false), pair("r1-researcher-1-1", "r1-researcher-2-1", false), pair("r1-researcher-1-1", "r1-researcher-3-1", false), pair("r1-researcher-1-2", "r1-researcher-2-1", false), pair("r1-researcher-1-2", "r1-researcher-3-1", true), pair("r1-researcher-2-1", "r1-researcher-3-1", true), ]; assert.deepEqual(groupSameChange(1, ps, [], pairs), { fresh: [ { candidate: "r1-c1", proposals: ["r1-researcher-1-1"] }, { candidate: "r1-c2", proposals: ["r1-researcher-1-2", "r1-researcher-2-1", "r1-researcher-3-1"] }, ], carried: [], }); }); test("编号按数字大小比:researcher-10 排在 researcher-2 后面", () => { const ps = ["r1-researcher-10-1", "r1-researcher-2-1"]; assert.deepEqual(groupSameChange(1, ps, [], [pair(ps[0]!, ps[1]!, false)]).fresh, [ { candidate: "r1-c1", proposals: ["r1-researcher-2-1"] }, { candidate: "r1-c2", proposals: ["r1-researcher-10-1"] }, ]); }); test("和留池候选相同的提案并进它,连带和这条提案相同的别的提案;没并进提案的留池候选列空数组", () => { const ps = ["r2-researcher-1-1", "r2-researcher-2-1", "r2-researcher-3-1"]; const pairs = [ pair("r2-researcher-1-1", "r2-researcher-2-1", true), pair("r2-researcher-1-1", "r2-researcher-3-1", false), pair("r2-researcher-2-1", "r2-researcher-3-1", false), pair("r2-researcher-1-1", "r1-c1", false), pair("r2-researcher-1-1", "r1-c3", false), pair("r2-researcher-2-1", "r1-c1", false), pair("r2-researcher-2-1", "r1-c3", true), pair("r2-researcher-3-1", "r1-c1", false), pair("r2-researcher-3-1", "r1-c3", false), ]; assert.deepEqual(groupSameChange(2, ps, ["r1-c3", "r1-c1"], pairs), { fresh: [{ candidate: "r2-c1", proposals: ["r2-researcher-3-1"] }], carried: [ { candidate: "r1-c1", proposals: [] }, { candidate: "r1-c3", proposals: ["r2-researcher-1-1", "r2-researcher-2-1"] }, ], }); }); test("一组连到两个留池候选:按内部错误停下", () => { const pairs = [pair("r2-researcher-1-1", "r1-c1", true), pair("r2-researcher-1-1", "r1-c2", true)]; assert.throws(() => groupSameChange(2, ["r2-researcher-1-1"], ["r1-c1", "r1-c2"], pairs), /留池候选 r1-c1、r1-c2 连成了一组/); });