




















@@ -210,25 +210,49 @@ function compactText(node: Element | null): string | undefined {
210210return node?.textContent?.trim().replace(/\s+/g, " ");
211211}
212212213+function textItems(container: Element, selector: string): Array<string | undefined> {
214+return [...container.querySelectorAll(selector)].map((node) => node.textContent?.trim());
215+}
216+213217describe("dreaming view", () => {
214218it("renders the active dream scene chrome and status", () => {
215219const container = renderInto(buildProps({ dreamingOf: "reindexing old chats\u2026" }));
216220217221expectElement(container, ".dreams__lobster svg");
218222219-const zs = container.querySelectorAll(".dreams__z");
220-expect(zs.length).toBe(3);
221-222-const stars = container.querySelectorAll(".dreams__star");
223-expect(stars.length).toBe(12);
223+expect(textItems(container, ".dreams__z")).toEqual(["z", "z", "Z"]);
224+225+const stars = [...container.querySelectorAll<HTMLElement>(".dreams__star")].map((star) => ({
226+top: star.style.top,
227+left: star.style.left,
228+size: star.style.width,
229+}));
230+expect(stars).toEqual([
231+{ top: "8%", left: "15%", size: "3px" },
232+{ top: "12%", left: "72%", size: "2px" },
233+{ top: "22%", left: "35%", size: "3px" },
234+{ top: "18%", left: "88%", size: "2px" },
235+{ top: "35%", left: "8%", size: "2px" },
236+{ top: "45%", left: "92%", size: "2px" },
237+{ top: "55%", left: "25%", size: "3px" },
238+{ top: "65%", left: "78%", size: "2px" },
239+{ top: "75%", left: "45%", size: "2px" },
240+{ top: "82%", left: "60%", size: "3px" },
241+{ top: "30%", left: "55%", size: "2px" },
242+{ top: "88%", left: "18%", size: "2px" },
243+]);
224244225245expectElement(container, ".dreams__moon");
226246227-const phases = [...container.querySelectorAll(".dreams__phase-name")].map((node) =>
228-node.textContent?.trim(),
229-);
230-expect(phases).toEqual(["Light", "Deep", "Rem"]);
231-expect(container.querySelectorAll(".dreams__phase").length).toBe(3);
247+const phases = [...container.querySelectorAll(".dreams__phase")].map((phase) => ({
248+name: phase.querySelector(".dreams__phase-name")?.textContent?.trim(),
249+off: phase.classList.contains("dreams__phase--off"),
250+}));
251+expect(phases).toEqual([
252+{ name: "Light", off: false },
253+{ name: "Deep", off: false },
254+{ name: "Rem", off: true },
255+]);
232256expect(container.querySelector(".dreams__phase--off .dreams__phase-next")?.textContent).toBe(
233257"off",
234258);
@@ -257,11 +281,15 @@ describe("dreaming view", () => {
257281expectElement(idleContainer, ".dreams--idle");
258282259283const unknownPhaseContainer = renderInto(buildProps({ phases: undefined }));
260-const statuses = [...unknownPhaseContainer.querySelectorAll(".dreams__phase-next")].map(
261-(node) => node.textContent?.trim(),
262-);
263-expect(statuses).toEqual(["—", "—", "—"]);
264-expect(unknownPhaseContainer.querySelectorAll(".dreams__phase--off").length).toBe(0);
284+const statuses = [...unknownPhaseContainer.querySelectorAll(".dreams__phase")].map((phase) => ({
285+status: phase.querySelector(".dreams__phase-next")?.textContent?.trim(),
286+off: phase.classList.contains("dreams__phase--off"),
287+}));
288+expect(statuses).toEqual([
289+{ status: "—", off: false },
290+{ status: "—", off: false },
291+{ status: "—", off: false },
292+]);
265293266294const errorContainer = renderInto(buildProps({ statusError: "patch failed" }));
267295expect(errorContainer.querySelector(".dreams__controls-error")?.textContent?.trim()).toBe(
@@ -273,7 +301,15 @@ describe("dreaming view", () => {
273301setDreamSubTab("diary");
274302setDreamDiarySubTab("insights");
275303const container = renderInto(buildProps());
276-expect(container.querySelectorAll(".dreams-diary__subtab").length).toBe(3);
304+const subtabs = [...container.querySelectorAll(".dreams-diary__subtab")].map((tab) => ({
305+label: tab.textContent?.trim(),
306+active: tab.classList.contains("dreams-diary__subtab--active"),
307+}));
308+expect(subtabs).toEqual([
309+{ label: "Dreams", active: false },
310+{ label: "Imported Insights", active: true },
311+{ label: "Memory Palace", active: false },
312+]);
277313expect(compactText(container.querySelector(".dreams-diary__date"))).toBe(
278314"Travel · 1 chats · 1 signals",
279315);
@@ -524,17 +560,16 @@ describe("dreaming view", () => {
524560].join("\n"),
525561}),
526562);
527-expect(container.querySelectorAll(".dreams-diary__day-chip").length).toBe(2);
563+const dayChips = [...container.querySelectorAll(".dreams-diary__day-chip")].map((node) => ({
564+label: node.textContent?.replace(/\s+/g, "").trim(),
565+active: node.classList.contains("dreams-diary__day-chip--active"),
566+}));
567+expect(dayChips).toEqual([
568+{ label: "1/2", active: true },
569+{ label: "1/1", active: false },
570+]);
528571expect(container.querySelector(".dreams-diary__heatmap-cell")).toBeNull();
529572expect(container.querySelector(".dreams-diary__timeline-month")).toBeNull();
530-const labels = [...container.querySelectorAll(".dreams-diary__day-chip")].map((node) =>
531-node.textContent?.replace(/\s+/g, "").trim(),
532-);
533-expect(
534-labels
535-.filter((label): label is string => Boolean(label))
536-.some((label) => /^\d+\/\d+$/.test(label)),
537-).toBe(true);
538573setDreamSubTab("scene");
539574});
540575此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。