From ede31942d0e4ffffd1dab3c168de7572d72102ba Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Mon, 9 Feb 2026 09:34:01 +0500 Subject: [PATCH] feat: add clear for texts state, update tests --- src/states/texts.svelte.ts | 6 +- tests/unit/states/texts.test.ts | 132 ++++++++++++-------------------- 2 files changed, 56 insertions(+), 82 deletions(-) diff --git a/src/states/texts.svelte.ts b/src/states/texts.svelte.ts index d5d5dfb..04fbf68 100644 --- a/src/states/texts.svelte.ts +++ b/src/states/texts.svelte.ts @@ -5,7 +5,7 @@ export interface TextItem { const defaultTexts: Array = ["About me", "Links", "Projects"].map((text, idx) => ({ text, id: idx })); -function createState() { +export function createState() { let texts: Array = $state(defaultTexts); let nextId = $state(defaultTexts.length); @@ -21,6 +21,10 @@ function createState() { removeText(id: number) { texts = texts.filter((textItem) => textItem.id !== id); }, + clear() { + texts = []; + nextId = 0; + }, }; } diff --git a/tests/unit/states/texts.test.ts b/tests/unit/states/texts.test.ts index 5a95bd5..2fe7d05 100644 --- a/tests/unit/states/texts.test.ts +++ b/tests/unit/states/texts.test.ts @@ -1,135 +1,105 @@ -import { textsState } from "$states/texts.svelte"; +import { createState } from "$states/texts.svelte"; import { describe, expect, it } from "vitest"; describe("texts.svelte", () => { - describe("initial state", () => { - it("should have default texts with unique IDs", () => { - const defaultTexts = ["About me", "Links", "Projects"]; - expect(textsState.texts).toHaveLength(defaultTexts.length); - expect(Array.isArray(textsState.texts)).toBe(true); - - textsState.texts.forEach((textItem, index) => { - expect(textItem.text).toBe(defaultTexts[index]); - expect(textItem.id).toBe(index); - }); - - const ids = textsState.texts.map((item) => item.id); - const uniqueIds = new Set(ids); - expect(ids.length).toBe(uniqueIds.size); - }); - }); - describe("addText", () => { it("should add new text with unique ID and increment counter", () => { - const initialLength = textsState.texts.length; - const initialIds = textsState.texts.map((item) => item.id); + const state = createState(); + const initialLength = state.texts.length; + const initialIds = state.texts.map((item) => item.id); const maxId = Math.max(...initialIds); const newText = "Test text"; - textsState.addText(newText); + state.addText(newText); - expect(textsState.texts).toHaveLength(initialLength + 1); - expect(textsState.texts[initialLength].text).toBe(newText); - expect(textsState.texts[initialLength].id).toBe(maxId + 1); - expect(initialIds).not.toContain(textsState.texts[initialLength].id); - }); - - it("should preserve existing texts when adding new", () => { - const initialTexts = [...textsState.texts]; - const newText = "New text"; - - textsState.addText(newText); - - initialTexts.forEach((initialText, index) => { - expect(textsState.texts[index]).toStrictEqual(initialText); - }); + expect(state.texts).toHaveLength(initialLength + 1); + expect(state.texts[initialLength].text).toBe(newText); + expect(state.texts[initialLength].id).toBe(maxId + 1); + expect(initialIds).not.toContain(state.texts[initialLength].id); }); it("should not add text with empty string", () => { - const initialLength = textsState.texts.length; + const state = createState(); + const initialLength = state.texts.length; - textsState.addText(""); + state.addText(""); - expect(textsState.texts).toHaveLength(initialLength); + expect(state.texts).toHaveLength(initialLength); }); }); describe("removeText", () => { it("should remove text by ID and preserve other texts", () => { - const initialLength = textsState.texts.length; - const idToRemove = textsState.texts[1].id; - const otherTexts = textsState.texts.filter((item) => item.id !== idToRemove); + const state = createState(); + const initialLength = state.texts.length; + const idToRemove = state.texts[1].id; + const otherTexts = state.texts.filter((item) => item.id !== idToRemove); - textsState.removeText(idToRemove); + state.removeText(idToRemove); - expect(textsState.texts).toHaveLength(initialLength - 1); - expect(textsState.texts.find((item) => item.id === idToRemove)).toBeUndefined(); - expect(textsState.texts).toStrictEqual(otherTexts); + expect(state.texts).toHaveLength(initialLength - 1); + expect(state.texts.find((item) => item.id === idToRemove)).toBeUndefined(); + expect(state.texts).toStrictEqual(otherTexts); }); it("should not remove text with non-existent ID", () => { - const initialLength = textsState.texts.length; - const initialTexts = [...textsState.texts]; + const state = createState(); + const initialLength = state.texts.length; + const initialTexts = [...state.texts]; const nonExistentId = 999999; - textsState.removeText(nonExistentId); + state.removeText(nonExistentId); - expect(textsState.texts).toHaveLength(initialLength); - expect(textsState.texts).toStrictEqual(initialTexts); + expect(state.texts).toHaveLength(initialLength); + expect(state.texts).toStrictEqual(initialTexts); }); }); - describe("texts getter", () => { - it("should return array of TextItem with correct structure", () => { - expect(Array.isArray(textsState.texts)).toBe(true); - textsState.texts.forEach((item) => { - expect(item).toHaveProperty("text"); - expect(item).toHaveProperty("id"); - expect(typeof item.text).toBe("string"); - expect(typeof item.id).toBe("number"); - }); - }); + describe("clear", () => { + it("should clear all texts", () => { + const state = createState(); + state.addText("Test 1"); + state.addText("Test 2"); + expect(state.texts.length).toBeGreaterThanOrEqual(2); - it("should return reactive texts", () => { - const initialLength = textsState.texts.length; - - textsState.addText("Test"); - - expect(textsState.texts).toHaveLength(initialLength + 1); + state.clear(); + expect(state.texts).toHaveLength(0); }); }); describe("integration", () => { it("should maintain ID uniqueness after multiple operations", () => { - const initialIds = new Set(textsState.texts.map((item) => item.id)); + const state = createState(); + const initialIds = new Set(state.texts.map((item) => item.id)); - textsState.addText("First"); - textsState.addText("Second"); - textsState.removeText(textsState.texts[0].id); - textsState.addText("Third"); + state.addText("First"); + state.addText("Second"); + state.removeText(state.texts[0].id); + state.addText("Third"); - const finalIds = textsState.texts.map((item) => item.id); + const finalIds = state.texts.map((item) => item.id); const uniqueIds = new Set(finalIds); expect(finalIds.length).toBe(uniqueIds.size); }); it("should handle adding and removing multiple texts", () => { - const initialLength = textsState.texts.length; + const state = createState(); + const initialLength = state.texts.length; const addedIds: number[] = []; for (let i = 0; i < 5; i++) { - textsState.addText(`Text ${i}`); - addedIds.push(textsState.texts[textsState.texts.length - 1].id); + state.addText(`Text ${i}`); + addedIds.push(state.texts[state.texts.length - 1].id); } - expect(textsState.texts).toHaveLength(initialLength + 5); + expect(state.texts).toHaveLength(initialLength + 5); - textsState.removeText(addedIds[0]); - textsState.removeText(addedIds[2]); - textsState.removeText(addedIds[4]); + state.removeText(addedIds[0]); + state.removeText(addedIds[2]); + state.removeText(addedIds[4]); - expect(textsState.texts).toHaveLength(initialLength + 2); + expect(state.texts).toHaveLength(initialLength + 2); }); }); });