121 lines
3.2 KiB
TypeScript
121 lines
3.2 KiB
TypeScript
import {
|
|
decodePageURI,
|
|
encodePageURI,
|
|
encodeRef,
|
|
parseRef,
|
|
validatePageName,
|
|
} from "./page_ref.ts";
|
|
import { assertEquals, AssertionError, assertThrows } from "@std/assert";
|
|
|
|
Deno.test("Page utility functions", () => {
|
|
// Base cases
|
|
assertEquals(parseRef("foo"), { kind: "page", page: "foo" });
|
|
assertEquals(parseRef("[[foo]]"), { kind: "page", page: "foo" });
|
|
assertEquals(parseRef("foo@1"), {
|
|
kind: "page",
|
|
page: "foo",
|
|
pos: 1,
|
|
});
|
|
assertEquals(parseRef("foo@L1"), {
|
|
kind: "page",
|
|
page: "foo",
|
|
pos: { line: 1, column: 1 },
|
|
});
|
|
assertEquals(parseRef("foo@L2C3"), {
|
|
kind: "page",
|
|
page: "foo",
|
|
pos: { line: 2, column: 3 },
|
|
});
|
|
assertEquals(parseRef("foo@l2c3"), {
|
|
kind: "page",
|
|
page: "foo",
|
|
pos: { line: 2, column: 3 },
|
|
});
|
|
assertEquals(parseRef("foo#My header"), {
|
|
kind: "page",
|
|
page: "foo",
|
|
header: "My header",
|
|
});
|
|
assertEquals(parseRef("foo.pdf"), {
|
|
kind: "document",
|
|
page: "foo.pdf",
|
|
});
|
|
|
|
// Meta page
|
|
assertEquals(parseRef("^foo"), {
|
|
kind: "page",
|
|
page: "foo",
|
|
meta: true,
|
|
});
|
|
|
|
// Documents
|
|
assertEquals(parseRef("foo.txt"), {
|
|
kind: "document",
|
|
page: "foo.txt",
|
|
});
|
|
assertEquals(parseRef("hello/foo.txt"), {
|
|
kind: "document",
|
|
page: "hello/foo.txt",
|
|
});
|
|
|
|
// Edge cases
|
|
assertEquals(parseRef(""), { kind: "page", page: "" });
|
|
|
|
// Encoding
|
|
assertEquals(encodeRef({ kind: "page", page: "foo" }), "foo");
|
|
assertEquals(encodeRef({ kind: "page", page: "foo", pos: 10 }), "foo@10");
|
|
assertEquals(
|
|
encodeRef({ kind: "page", page: "foo", pos: { line: 10, column: 1 } }),
|
|
"foo@L10",
|
|
);
|
|
assertEquals(
|
|
encodeRef({ kind: "page", page: "foo", pos: { line: 10, column: 5 } }),
|
|
"foo@L10C5",
|
|
);
|
|
assertEquals(
|
|
encodeRef({ kind: "page", page: "foo", header: "bar" }),
|
|
"foo#bar",
|
|
);
|
|
|
|
// Page name validation
|
|
|
|
try {
|
|
validatePageName("perfectly fine page name");
|
|
validatePageName("this is special case of a.conflicted.1234");
|
|
} catch (error) {
|
|
throw new AssertionError(
|
|
`Something is very wrong with the validatePageName function: ${error}`,
|
|
);
|
|
}
|
|
|
|
assertThrows(() => validatePageName(""), Error);
|
|
assertThrows(() => validatePageName(".hidden"), Error);
|
|
assertThrows(() => validatePageName(".."), Error);
|
|
|
|
for (const extension of ["md", "txt", "exe", "cc", "ts"]) {
|
|
assertThrows(
|
|
() => validatePageName(`extensions-are-not-welcome.${extension}`),
|
|
Error,
|
|
);
|
|
}
|
|
|
|
for (const extension of ["db2", "woff2", "sqlite3", "42", "0"]) {
|
|
assertThrows(
|
|
() => validatePageName(`extensions-can-contain-numbers-too.${extension}`),
|
|
Error,
|
|
);
|
|
}
|
|
});
|
|
|
|
Deno.test("Page URI encoding", () => {
|
|
assertEquals(encodePageURI("foo"), "foo");
|
|
assertEquals(encodePageURI("folder/foo"), "folder/foo");
|
|
assertEquals(encodePageURI("hello there"), "hello%20there");
|
|
assertEquals(encodePageURI("hello?there"), "hello%3Fthere");
|
|
// Now ensure all these cases are reversible
|
|
assertEquals(decodePageURI("foo"), "foo");
|
|
assertEquals(decodePageURI("folder/foo"), "folder/foo");
|
|
assertEquals(decodePageURI("hello%20there"), "hello there");
|
|
assertEquals(decodePageURI("hello%3Fthere"), "hello?there");
|
|
});
|