{
- events = [...events, { event: "on:save" }];
- }}
- on:update={({ detail }) => {
- events = [...events, { event: "on:update", detail }];
- }}
-/>
diff --git a/tests/LocalStorage/LocalStorage.test.svelte b/tests/LocalStorage/LocalStorage.test.svelte
new file mode 100644
index 00000000..432f136f
--- /dev/null
+++ b/tests/LocalStorage/LocalStorage.test.svelte
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/LocalStorage/LocalStorage.test.ts b/tests/LocalStorage/LocalStorage.test.ts
new file mode 100644
index 00000000..679b1142
--- /dev/null
+++ b/tests/LocalStorage/LocalStorage.test.ts
@@ -0,0 +1,103 @@
+import { render } from "@testing-library/svelte";
+import LocalStorage from "./LocalStorage.test.svelte";
+
+describe("LocalStorage", () => {
+ let localStorageMock: { [key: string]: string };
+ let originalLocalStorage: Storage;
+
+ beforeEach(() => {
+ originalLocalStorage = global.localStorage;
+ localStorageMock = {};
+ global.localStorage = {
+ getItem: vi.fn((key) => localStorageMock[key] || null),
+ setItem: vi.fn((key, value) => {
+ localStorageMock[key] = value;
+ }),
+ removeItem: vi.fn((key) => {
+ delete localStorageMock[key];
+ }),
+ clear: vi.fn(() => {
+ localStorageMock = {};
+ }),
+ length: 0,
+ key: vi.fn(),
+ };
+ });
+
+ afterEach(() => {
+ global.localStorage = originalLocalStorage;
+ localStorage.clear();
+ vi.restoreAllMocks();
+ localStorageMock = {};
+ });
+
+ it("saves primitive value to localStorage on mount", () => {
+ render(LocalStorage);
+
+ expect(localStorage.setItem).toHaveBeenCalledWith(
+ "local-storage-key",
+ "test-value",
+ );
+ });
+
+ it("saves object value as JSON string", () => {
+ render(LocalStorage);
+
+ expect(localStorage.setItem).toHaveBeenCalledWith(
+ "theme-settings",
+ JSON.stringify({ theme: "dark", fontSize: 16 }),
+ );
+ });
+
+ it("loads existing primitive value from localStorage", () => {
+ localStorageMock["local-storage-key"] = "existing-value";
+
+ render(LocalStorage);
+ expect(localStorage.getItem).toHaveBeenCalledWith("local-storage-key");
+ });
+
+ it("loads existing object value from localStorage", () => {
+ // Set up existing value
+ const existingSettings = { theme: "light", fontSize: 14 };
+ localStorageMock["theme-settings"] = JSON.stringify(existingSettings);
+
+ render(LocalStorage);
+ expect(localStorage.getItem).toHaveBeenCalledWith("theme-settings");
+ });
+
+ it("clears specific item from localStorage", () => {
+ const { component } = render(LocalStorage);
+ const storage = component.storage;
+
+ if (storage) {
+ storage.clearItem();
+ expect(localStorage.removeItem).toHaveBeenCalledWith("programmatic-key");
+ }
+ });
+
+ it("clears all items from localStorage", () => {
+ const { component } = render(LocalStorage);
+ const storage = component.storage;
+
+ if (storage) {
+ storage.clearAll();
+ expect(localStorage.clear).toHaveBeenCalled();
+ }
+ });
+
+ it("handles JSON parse errors gracefully", () => {
+ // Set up invalid JSON
+ localStorageMock["local-storage-key"] = "{invalid-json}";
+
+ render(LocalStorage);
+ expect(localStorage.getItem).toHaveBeenCalledWith("local-storage-key");
+ });
+
+ it("uses default key if none provided", () => {
+ render(LocalStorage);
+
+ expect(localStorage.getItem).toHaveBeenCalledWith(
+ expect.stringContaining("local-storage-key"),
+ );
+ });
+});
diff --git a/tests/LocalStorage/LocalStorageObject.test.svelte b/tests/LocalStorage/LocalStorageObject.test.svelte
new file mode 100644
index 00000000..23a78c17
--- /dev/null
+++ b/tests/LocalStorage/LocalStorageObject.test.svelte
@@ -0,0 +1,15 @@
+
+
+
+ {
+ console.log("update event", detail);
+ }}
+ />
+
diff --git a/tests/LocalStorage/LocalStorageObject.test.ts b/tests/LocalStorage/LocalStorageObject.test.ts
new file mode 100644
index 00000000..d7228aac
--- /dev/null
+++ b/tests/LocalStorage/LocalStorageObject.test.ts
@@ -0,0 +1,58 @@
+import { render } from "@testing-library/svelte";
+import LocalStorageObject from "./LocalStorageObject.test.svelte";
+
+describe("LocalStorage - Object Values", () => {
+ let localStorageMock: { [key: string]: string };
+ let originalLocalStorage: Storage;
+
+ beforeEach(() => {
+ originalLocalStorage = global.localStorage;
+ localStorageMock = {};
+
+ global.localStorage = {
+ getItem: vi.fn((key) => localStorageMock[key] || null),
+ setItem: vi.fn((key, value) => {
+ localStorageMock[key] = value;
+ }),
+ removeItem: vi.fn((key) => {
+ delete localStorageMock[key];
+ }),
+ clear: vi.fn(() => {
+ localStorageMock = {};
+ }),
+ length: 0,
+ key: vi.fn(),
+ };
+ });
+
+ afterEach(() => {
+ global.localStorage = originalLocalStorage;
+ localStorage.clear();
+ vi.restoreAllMocks();
+ localStorageMock = {};
+ });
+
+ it("saves object value as JSON string", () => {
+ render(LocalStorageObject);
+
+ expect(localStorage.setItem).toHaveBeenCalledWith(
+ "theme-settings",
+ JSON.stringify({ theme: "dark", fontSize: 16 }),
+ );
+ });
+
+ it("loads existing object value from localStorage", () => {
+ const existingSettings = { theme: "light", fontSize: 14 };
+ localStorageMock["theme-settings"] = JSON.stringify(existingSettings);
+
+ render(LocalStorageObject);
+ expect(localStorage.getItem).toHaveBeenCalledWith("theme-settings");
+ });
+
+ it("handles malformed JSON gracefully", () => {
+ localStorageMock["theme-settings"] = "{malformed-json}";
+
+ render(LocalStorageObject);
+ expect(localStorage.getItem).toHaveBeenCalledWith("theme-settings");
+ });
+});
diff --git a/tests/LocalStorage/LocalStoragePrimitive.test.svelte b/tests/LocalStorage/LocalStoragePrimitive.test.svelte
new file mode 100644
index 00000000..60d6a598
--- /dev/null
+++ b/tests/LocalStorage/LocalStoragePrimitive.test.svelte
@@ -0,0 +1,18 @@
+
+
+
+ {
+ console.log("save event");
+ }}
+ on:update={({ detail }) => {
+ console.log("update event", detail);
+ }}
+ />
+
diff --git a/tests/LocalStorage/LocalStoragePrimitive.test.ts b/tests/LocalStorage/LocalStoragePrimitive.test.ts
new file mode 100644
index 00000000..6a80e626
--- /dev/null
+++ b/tests/LocalStorage/LocalStoragePrimitive.test.ts
@@ -0,0 +1,61 @@
+import { render } from "@testing-library/svelte";
+import LocalStoragePrimitive from "./LocalStoragePrimitive.test.svelte";
+
+describe("LocalStorage - Primitive Values", () => {
+ let localStorageMock: { [key: string]: string };
+ let originalLocalStorage: Storage;
+ let consoleSpy: any;
+
+ beforeEach(() => {
+ originalLocalStorage = global.localStorage;
+ localStorageMock = {};
+ consoleSpy = vi.spyOn(console, "log");
+
+ global.localStorage = {
+ getItem: vi.fn((key) => localStorageMock[key] || null),
+ setItem: vi.fn((key, value) => {
+ localStorageMock[key] = value;
+ }),
+ removeItem: vi.fn((key) => {
+ delete localStorageMock[key];
+ }),
+ clear: vi.fn(() => {
+ localStorageMock = {};
+ }),
+ length: 0,
+ key: vi.fn(),
+ };
+ });
+
+ afterEach(() => {
+ global.localStorage = originalLocalStorage;
+ localStorage.clear();
+ vi.restoreAllMocks();
+ localStorageMock = {};
+ });
+
+ it("saves primitive value to localStorage on mount", () => {
+ render(LocalStoragePrimitive);
+
+ expect(localStorage.setItem).toHaveBeenCalledWith("test-key", "test-value");
+ });
+
+ it("loads existing primitive value from localStorage", () => {
+ localStorageMock["test-key"] = "existing-value";
+
+ render(LocalStoragePrimitive);
+ expect(localStorage.getItem).toHaveBeenCalledWith("test-key");
+ });
+
+ it("dispatches save event when setting initial value", () => {
+ render(LocalStoragePrimitive);
+ expect(consoleSpy).toHaveBeenCalledWith("save event");
+ });
+
+ it("handles invalid values gracefully", () => {
+ localStorageMock["test-key"] = "{invalid-value}";
+
+ render(LocalStoragePrimitive);
+ expect(localStorage.getItem).toHaveBeenCalledWith("test-key");
+ });
+});