refactoring

This commit is contained in:
2026-09-02 08:38:03 +02:00
parent 649ff0d7c5
commit 38f255c1a4
48 changed files with 6998 additions and 5577 deletions
+79
View File
@@ -0,0 +1,79 @@
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"]);
});