import test from "node:test"; import assert from "node:assert/strict"; import { BreadcrumbTrail } from "../static/js/wiki/breadcrumb-trail.js"; class MemoryStorage { constructor() { this.values = new Map(); } getItem(key) { return this.values.has(key) ? this.values.get(key) : null; } setItem(key, value) { this.values.set(key, String(value)); } } test("stored breadcrumbs are limited to current readable pages", () => { const storage = new MemoryStorage(); storage.setItem("racket-wiki-breadcrumb-trail", JSON.stringify([ "first", "removed", 42, "second" ])); const trail = new BreadcrumbTrail(storage); assert.deepEqual(trail.load(["first", "second"]), ["first", "second"]); assert.equal( storage.getItem("racket-wiki-breadcrumb-trail"), JSON.stringify(["first", "second"])); }); test("invalid stored JSON starts with an empty trail", () => { const storage = new MemoryStorage(); storage.setItem("racket-wiki-breadcrumb-trail", "not JSON"); const trail = new BreadcrumbTrail(storage); assert.deepEqual(trail.load(["first"]), []); }); test("page visits append, truncate revisits and clear at home", () => { const storage = new MemoryStorage(); const trail = new BreadcrumbTrail(storage); trail.load(["home", "first", "second", "third"]); trail.record("first", "home"); trail.record("second", "home"); trail.record("third", "home"); assert.deepEqual(trail.slugs, ["first", "second", "third"]); assert.deepEqual(trail.record("second", "home"), ["first", "second"]); const returnedSlugs = trail.slugs; returnedSlugs.push("outside-change"); assert.deepEqual(trail.slugs, ["first", "second"]); assert.deepEqual(trail.record("home", "home"), []); }); test("the trail retains at most eight non-home pages", () => { const storage = new MemoryStorage(); const trail = new BreadcrumbTrail(storage); const pages = Array.from({ length: 10 }, (_value, index) => `page-${index}`); trail.load(["home", ...pages]); for (const page of pages) trail.record(page, "home"); assert.deepEqual(trail.slugs, pages.slice(-8)); }); test("selecting a breadcrumb discards only its successors", () => { const storage = new MemoryStorage(); const trail = new BreadcrumbTrail(storage); trail.load(["home", "first", "second", "third"]); trail.record("first", "home"); trail.record("second", "home"); trail.record("third", "home"); assert.deepEqual(trail.truncate("first", "home"), ["first"]); assert.deepEqual(trail.truncate("missing", "home"), ["first"]); });