linkedListCycle.test.ts (1392B)
1 import { test } from "node:test"; 2 import assert from "node:assert/strict"; 3 4 import { buildList, solution3, type ListNode } from "./linkedListCycle.ts"; 5 6 interface CycleCase { 7 name: string; 8 values: number[]; 9 pos: number; // index the tail links back to, or -1 for no cycle 10 expected: boolean; 11 } 12 13 function fullCases(): CycleCase[] { 14 return [ 15 { name: "case_1", values: [3, 2, 0, -4], pos: 1, expected: true }, 16 { name: "case_2", values: [1, 2], pos: 0, expected: true }, 17 { name: "case_3", values: [1], pos: -1, expected: false }, 18 { name: "case_4", values: [], pos: -1, expected: false }, 19 { name: "case_5", values: [1, 2], pos: -1, expected: false }, 20 { 21 name: "case_6", 22 values: [ 23 -21, 10, 17, 8, 4, 26, 5, 35, 33, -7, -16, 27, -12, 6, 29, -12, 5, 9, 24 20, 14, 14, 2, 13, -24, 21, 23, -21, 5, 25 ], 26 pos: -1, 27 expected: false, 28 }, 29 { name: "case_7", values: [1, 1, 1, 1], pos: -1, expected: false }, 30 ]; 31 } 32 33 function runSolverCases( 34 solverName: string, 35 solver: (head: ListNode | null) => boolean, 36 cases: CycleCase[], 37 ): void { 38 for (const c of cases) { 39 test(`${solverName}_${c.name}`, () => { 40 const head = buildList(c.values, c.pos); 41 assert.equal(solver(head), c.expected); 42 }); 43 } 44 } 45 46 // runSolverCases("solution1", solution1, fullCases()); 47 runSolverCases("solution3", solution3, fullCases());