diff --git a/tests/Breakpoint.test.svelte b/tests/Breakpoint.test.svelte
deleted file mode 100644
index f881cb4f..00000000
--- a/tests/Breakpoint.test.svelte
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-{smaller}
-{larger}
-{breakpoints.md}
-
- {
- console.log(e.detail);
- }}
->
- {currentSize}
-
diff --git a/tests/Breakpoint/Breakpoint.test.svelte b/tests/Breakpoint/Breakpoint.test.svelte
new file mode 100644
index 00000000..1c587c32
--- /dev/null
+++ b/tests/Breakpoint/Breakpoint.test.svelte
@@ -0,0 +1,28 @@
+
+
+
+ {currentSize}
+ {currentSizes.sm}
+ {currentSizes.md}
+ {currentSizes.lg}
+ {currentSizes.xlg}
+ {currentSizes.max}
+
diff --git a/tests/Breakpoint/Breakpoint.test.ts b/tests/Breakpoint/Breakpoint.test.ts
new file mode 100644
index 00000000..c76983b6
--- /dev/null
+++ b/tests/Breakpoint/Breakpoint.test.ts
@@ -0,0 +1,116 @@
+import { render, screen } from "@testing-library/svelte";
+import Breakpoint from "./Breakpoint.test.svelte";
+import BreakpointObserver from "./BreakpointObserver.test.svelte";
+import Breakpoints from "./Breakpoints.test.svelte";
+
+describe("Breakpoint", () => {
+ beforeEach(() => {
+ vi.useFakeTimers();
+ });
+
+ afterEach(() => {
+ vi.unstubAllGlobals();
+ vi.useRealTimers();
+ });
+
+ it("renders and detects breakpoint size", () => {
+ vi.stubGlobal("matchMedia", (query: string) => ({
+ matches: query.includes("(min-width: 1056px) and (max-width: 1312px)"),
+ media: query,
+ addEventListener: vi.fn(),
+ removeEventListener: vi.fn(),
+ }));
+
+ render(Breakpoint);
+
+ expect(screen.getByTestId("current-size").textContent).toBe("lg");
+ expect(screen.getByTestId("is-sm").textContent).toBe("false");
+ expect(screen.getByTestId("is-md").textContent).toBe("false");
+ expect(screen.getByTestId("is-lg").textContent).toBe("true");
+ expect(screen.getByTestId("is-xlg").textContent).toBe("false");
+ expect(screen.getByTestId("is-max").textContent).toBe("false");
+ });
+
+ it("updates when window size changes", async () => {
+ const mockChangeHandler = vi.fn();
+ const mediaQueryListeners = new Map();
+
+ vi.stubGlobal("matchMedia", (query: string) => {
+ const isLgQuery = query.includes(
+ "(min-width: 1056px) and (max-width: 1312px)",
+ );
+
+ return {
+ matches: isLgQuery,
+ media: query,
+ addEventListener: (event: string, listener: MediaQueryList) => {
+ if (!mediaQueryListeners.has(query)) {
+ mediaQueryListeners.set(query, []);
+ }
+ mediaQueryListeners.get(query).push({ event, listener });
+ },
+ removeEventListener: vi.fn(),
+ };
+ });
+
+ const { component } = render(Breakpoint);
+ component.$on("change", mockChangeHandler);
+
+ expect(screen.getByTestId("current-size").textContent).toBe("lg");
+ mockChangeHandler.mockClear();
+
+ for (const [query, listeners] of mediaQueryListeners.entries()) {
+ const isXlgQuery = query.includes(
+ "(min-width: 1312px) and (max-width: 1584px)",
+ );
+
+ for (const { event, listener } of listeners) {
+ if (event === "change") {
+ listener({ matches: isXlgQuery, media: query });
+ }
+ }
+ }
+
+ await vi.runOnlyPendingTimersAsync();
+
+ expect(mockChangeHandler).toHaveBeenCalled();
+
+ component.$set({
+ size: "xlg",
+ sizes: {
+ sm: false,
+ md: false,
+ lg: false,
+ xlg: true,
+ max: false,
+ },
+ });
+
+ expect(screen.getByTestId("current-size").textContent).toBe("xlg");
+ expect(screen.getByTestId("is-xlg").textContent).toBe("true");
+ });
+
+ it("provides breakpointObserver utilities", () => {
+ vi.stubGlobal("matchMedia", (query: string) => ({
+ matches: query.includes("(min-width: 1056px) and (max-width: 1312px)"),
+ media: query,
+ addEventListener: vi.fn(),
+ removeEventListener: vi.fn(),
+ }));
+
+ render(BreakpointObserver);
+
+ expect(screen.getByTestId("smaller-than-md").textContent).toBe("false");
+ expect(screen.getByTestId("larger-than-md").textContent).toBe("true");
+ });
+
+ it("exposes breakpoint values", () => {
+ render(Breakpoints);
+
+ expect(screen.getByTestId("sm").textContent).toBe("320");
+ expect(screen.getByTestId("md").textContent).toBe("672");
+ expect(screen.getByTestId("lg").textContent).toBe("1056");
+ expect(screen.getByTestId("xlg").textContent).toBe("1312");
+ expect(screen.getByTestId("max").textContent).toBe("1584");
+ });
+});
diff --git a/tests/Breakpoint/BreakpointObserver.test.svelte b/tests/Breakpoint/BreakpointObserver.test.svelte
new file mode 100644
index 00000000..0a4591b8
--- /dev/null
+++ b/tests/Breakpoint/BreakpointObserver.test.svelte
@@ -0,0 +1,21 @@
+
+
+
{smallerThanMd}
+{largerThanMd}
diff --git a/tests/Breakpoint/Breakpoints.test.svelte b/tests/Breakpoint/Breakpoints.test.svelte
new file mode 100644
index 00000000..f50a7402
--- /dev/null
+++ b/tests/Breakpoint/Breakpoints.test.svelte
@@ -0,0 +1,9 @@
+
+
+{breakpoints.sm}
+{breakpoints.md}
+{breakpoints.lg}
+{breakpoints.xlg}
+{breakpoints.max}