char-slop/berry

multipurpose self-modifiable agentic harness

git clone https://git.t4t.associates/char-slop/berry

Charlotte Sombetter code line breakingbc405c3

main
3.6 KiB91 linesraw
1import { assertEquals } from "@std/assert";
2import { withDom } from "@berry/util/dom.ts";
3import { code } from "./code.tsx";
4import type { HighlightRequest } from "./highlight-worker.ts";
5
6Deno.test("code highlights once on entering view and releases unmounted blocks", async (t) => {
7  const observed = new Set<Element>();
8  const requests: HighlightRequest[] = [];
9  let workers = 0;
10  let intersect: (target: Element, isIntersecting: boolean) => void;
11  class Visibility {
12    constructor(callback: IntersectionObserverCallback) {
13      intersect = (target, isIntersecting) => {
14        callback(
15          [{ target, isIntersecting } as IntersectionObserverEntry],
16          this as unknown as IntersectionObserver,
17        );
18      };
19    }
20    observe(target: Element) {
21      observed.add(target);
22    }
23    unobserve(target: Element) {
24      observed.delete(target);
25    }
26  }
27  class Highlighter {
28    onmessage?: (event: { data: { id: number; html: string } }) => void;
29    constructor() {
30      workers++;
31    }
32    postMessage(request: HighlightRequest) {
33      requests.push(request);
34      queueMicrotask(() =>
35        this.onmessage?.({
36          data: { id: request.id, html: reply(request) },
37        })
38      );
39    }
40  }
41  let reply = (_: HighlightRequest) => "<a-k>const</a-k> x = 1;";
42  const globals = { IntersectionObserver: Visibility, Worker: Highlighter };
43  await withDom(async (window) => {
44    const block = code("const x = 1;\n", { language: "ts" });
45    const container = document.createElement("div");
46    container.append(block);
47    await t.step("detached and offscreen blocks stay plain without starting a worker", async () => {
48      assertEquals(observed.size, 0);
49      assertEquals(workers, 0);
50      document.body.append(container);
51      await window.happyDOM.waitUntilComplete();
52      assertEquals(observed.has(block), true);
53      intersect(block, false);
54      assertEquals(workers, 0);
55      assertEquals(block.querySelector(".code-text")?.textContent, "const x = 1;");
56    });
57    await t.step("entering view highlights once, preserving the source and gutter", async () => {
58      intersect(block, true);
59      await window.happyDOM.waitUntilComplete();
60      assertEquals(workers, 1);
61      assertEquals(requests.map(({ language, source }) => ({ language, source })), [
62        { language: "typescript", source: "const x = 1;" },
63      ]);
64      assertEquals(block.querySelector("a-k")?.textContent, "const");
65      assertEquals(block.querySelector(".code-text")?.textContent, "const x = 1;");
66      assertEquals(observed.has(block), false);
67      intersect(block, true);
68      container.remove();
69      document.body.append(container);
70      await window.happyDOM.waitUntilComplete();
71      assertEquals(requests.length, 1);
72      assertEquals(observed.has(block), false);
73    });
74    await t.step("blocks without a grammar do not request highlighting", async () => {
75      container.replaceChildren(code("plain text"));
76      await window.happyDOM.waitUntilComplete();
77      assertEquals(observed.size, 0);
78      assertEquals(requests.length, 1);
79    });
80    await t.step("highlighted lines keep the newlines that copying reads", async () => {
81      reply = (request) => request.source;
82      const multiline = code("const x = 1;\nconst y = 2;", { language: "ts" });
83      container.replaceChildren(multiline);
84      await window.happyDOM.waitUntilComplete();
85      intersect(multiline, true);
86      await window.happyDOM.waitUntilComplete();
87      const copied = [...multiline.querySelectorAll(".code-text")].map((line) => line.textContent);
88      assertEquals(copied.join(""), "const x = 1;\nconst y = 2;");
89    });
90  }, { globals });
91});