testReviewOrder
tcmts.share.testReviewOrder · #5zuhawfk · term
import { reviewOrder } from "#codebase/tcmts/share";
import type { ReviewItem } from "#codebase/tcmts/share";
export const testReviewOrder = () => {
const item = (
path: string,
change: ReviewItem["change"],
hash: string,
test = false,
): ReviewItem => ({ change, path, hash, lines: [], test });
const uses: Record<string, string[]> = {
push: ["MAINTAINER", "branchFor"],
testPush: ["push"],
contribute: ["push"],
};
const order = reviewOrder(
[
item("lib.testPush", "added", "testPush", true),
item("lib.push", "edited", "push"),
item("lib.contribute", "edited", "contribute"),
item("lib.MAINTAINER", "added", "MAINTAINER"),
item("lib.old", "removed", "old"),
],
(h) => uses[h] ?? [],
).map((i) => i.path);
// what's new before what uses it, tests after the code, removed last
if (order.join(" ") !== "lib.MAINTAINER lib.push lib.contribute lib.old lib.testPush")
throw new Error(`review order: ${order.join(" ")}`);
// a cycle doesn't stop it
const cyc = reviewOrder([item("a", "edited", "a"), item("b", "edited", "b")], (h) =>
h === "a" ? ["b"] : ["a"],
);
if (cyc.length !== 2) throw new Error("a cycle lost a change");
}
uses