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