refactoring
This commit is contained in:
@@ -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"]);
|
||||
});
|
||||
Reference in New Issue
Block a user