|
|
@@ -3,23 +3,16 @@ import { describe, expect, it } from "vitest";
|
|
|
|
|
|
|
|
|
|
|
|
describe("texts.svelte", () => {
|
|
|
|
describe("texts.svelte", () => {
|
|
|
|
describe("initial state", () => {
|
|
|
|
describe("initial state", () => {
|
|
|
|
it("should have default texts", () => {
|
|
|
|
it("should have default texts with unique IDs", () => {
|
|
|
|
expect(textsState.texts).toBeDefined();
|
|
|
|
|
|
|
|
expect(Array.isArray(textsState.texts)).toBe(true);
|
|
|
|
|
|
|
|
expect(textsState.texts.length).toBeGreaterThan(0);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it("should have correct default texts", () => {
|
|
|
|
|
|
|
|
const defaultTexts = ["About me", "Links", "Projects"];
|
|
|
|
const defaultTexts = ["About me", "Links", "Projects"];
|
|
|
|
expect(textsState.texts).toHaveLength(defaultTexts.length);
|
|
|
|
expect(textsState.texts).toHaveLength(defaultTexts.length);
|
|
|
|
|
|
|
|
expect(Array.isArray(textsState.texts)).toBe(true);
|
|
|
|
|
|
|
|
|
|
|
|
textsState.texts.forEach((textItem, index) => {
|
|
|
|
textsState.texts.forEach((textItem, index) => {
|
|
|
|
expect(textItem.text).toBe(defaultTexts[index]);
|
|
|
|
expect(textItem.text).toBe(defaultTexts[index]);
|
|
|
|
expect(textItem.id).toBe(index);
|
|
|
|
expect(textItem.id).toBe(index);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it("should have unique IDs for all texts", () => {
|
|
|
|
|
|
|
|
const ids = textsState.texts.map((item) => item.id);
|
|
|
|
const ids = textsState.texts.map((item) => item.id);
|
|
|
|
const uniqueIds = new Set(ids);
|
|
|
|
const uniqueIds = new Set(ids);
|
|
|
|
expect(ids.length).toBe(uniqueIds.size);
|
|
|
|
expect(ids.length).toBe(uniqueIds.size);
|
|
|
@@ -27,39 +20,18 @@ describe("texts.svelte", () => {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
describe("addText", () => {
|
|
|
|
describe("addText", () => {
|
|
|
|
it("should add new text", () => {
|
|
|
|
it("should add new text with unique ID and increment counter", () => {
|
|
|
|
const initialLength = textsState.texts.length;
|
|
|
|
const initialLength = textsState.texts.length;
|
|
|
|
|
|
|
|
const initialIds = textsState.texts.map((item) => item.id);
|
|
|
|
|
|
|
|
const maxId = Math.max(...initialIds);
|
|
|
|
const newText = "Test text";
|
|
|
|
const newText = "Test text";
|
|
|
|
|
|
|
|
|
|
|
|
textsState.addText(newText);
|
|
|
|
textsState.addText(newText);
|
|
|
|
|
|
|
|
|
|
|
|
expect(textsState.texts).toHaveLength(initialLength + 1);
|
|
|
|
expect(textsState.texts).toHaveLength(initialLength + 1);
|
|
|
|
expect(textsState.texts[initialLength].text).toBe(newText);
|
|
|
|
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 assign unique ID to new text", () => {
|
|
|
|
|
|
|
|
const initialIds = textsState.texts.map((item) => item.id);
|
|
|
|
|
|
|
|
const maxId = Math.max(...initialIds);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
textsState.addText("New text");
|
|
|
|
|
|
|
|
const newText = textsState.texts[textsState.texts.length - 1];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(newText.id).toBe(maxId + 1);
|
|
|
|
|
|
|
|
expect(initialIds).not.toContain(newText.id);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it("should increment ID counter", () => {
|
|
|
|
|
|
|
|
const initialLength = textsState.texts.length;
|
|
|
|
|
|
|
|
const firstNewId = textsState.texts[initialLength - 1].id;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
textsState.addText("First");
|
|
|
|
|
|
|
|
textsState.addText("Second");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const firstNew = textsState.texts[initialLength];
|
|
|
|
|
|
|
|
const secondNew = textsState.texts[initialLength + 1];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(firstNew.id).toBe(firstNewId + 1);
|
|
|
|
|
|
|
|
expect(secondNew.id).toBe(firstNewId + 2);
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it("should preserve existing texts when adding new", () => {
|
|
|
|
it("should preserve existing texts when adding new", () => {
|
|
|
@@ -73,34 +45,26 @@ describe("texts.svelte", () => {
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it("should add text with empty string", () => {
|
|
|
|
it("should not add text with empty string", () => {
|
|
|
|
const initialLength = textsState.texts.length;
|
|
|
|
const initialLength = textsState.texts.length;
|
|
|
|
|
|
|
|
|
|
|
|
textsState.addText("");
|
|
|
|
textsState.addText("");
|
|
|
|
|
|
|
|
|
|
|
|
expect(textsState.texts).toHaveLength(initialLength + 1);
|
|
|
|
expect(textsState.texts).toHaveLength(initialLength);
|
|
|
|
expect(textsState.texts[initialLength].text).toBe("");
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it("should add text with special characters", () => {
|
|
|
|
|
|
|
|
const specialText = "Test @#$%^&*()_+-={}[]|\\:\";'<>?,./`~";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
textsState.addText(specialText);
|
|
|
|
|
|
|
|
const addedText = textsState.texts[textsState.texts.length - 1];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(addedText.text).toBe(specialText);
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
describe("removeText", () => {
|
|
|
|
describe("removeText", () => {
|
|
|
|
it("should remove text by ID", () => {
|
|
|
|
it("should remove text by ID and preserve other texts", () => {
|
|
|
|
const initialLength = textsState.texts.length;
|
|
|
|
const initialLength = textsState.texts.length;
|
|
|
|
const idToRemove = textsState.texts[0].id;
|
|
|
|
const idToRemove = textsState.texts[1].id;
|
|
|
|
|
|
|
|
const otherTexts = textsState.texts.filter((item) => item.id !== idToRemove);
|
|
|
|
|
|
|
|
|
|
|
|
textsState.removeText(idToRemove);
|
|
|
|
textsState.removeText(idToRemove);
|
|
|
|
|
|
|
|
|
|
|
|
expect(textsState.texts).toHaveLength(initialLength - 1);
|
|
|
|
expect(textsState.texts).toHaveLength(initialLength - 1);
|
|
|
|
expect(textsState.texts.find((item) => item.id === idToRemove)).toBeUndefined();
|
|
|
|
expect(textsState.texts.find((item) => item.id === idToRemove)).toBeUndefined();
|
|
|
|
|
|
|
|
expect(textsState.texts).toStrictEqual(otherTexts);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it("should not remove text with non-existent ID", () => {
|
|
|
|
it("should not remove text with non-existent ID", () => {
|
|
|
@@ -113,39 +77,10 @@ describe("texts.svelte", () => {
|
|
|
|
expect(textsState.texts).toHaveLength(initialLength);
|
|
|
|
expect(textsState.texts).toHaveLength(initialLength);
|
|
|
|
expect(textsState.texts).toStrictEqual(initialTexts);
|
|
|
|
expect(textsState.texts).toStrictEqual(initialTexts);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
it("should preserve other texts when removing one", () => {
|
|
|
|
|
|
|
|
const idToRemove = textsState.texts[1].id;
|
|
|
|
|
|
|
|
const otherTexts = textsState.texts.filter((item) => item.id !== idToRemove);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
textsState.removeText(idToRemove);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(textsState.texts).toStrictEqual(otherTexts);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it("should handle removing last text", () => {
|
|
|
|
|
|
|
|
const lastId = textsState.texts[textsState.texts.length - 1].id;
|
|
|
|
|
|
|
|
const initialLength = textsState.texts.length;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
textsState.removeText(lastId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(textsState.texts).toHaveLength(initialLength - 1);
|
|
|
|
|
|
|
|
expect(textsState.texts.find((item) => item.id === lastId)).toBeUndefined();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it("should handle removing first text", () => {
|
|
|
|
|
|
|
|
const firstId = textsState.texts[0].id;
|
|
|
|
|
|
|
|
const initialLength = textsState.texts.length;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
textsState.removeText(firstId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(textsState.texts).toHaveLength(initialLength - 1);
|
|
|
|
|
|
|
|
expect(textsState.texts.find((item) => item.id === firstId)).toBeUndefined();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
describe("texts getter", () => {
|
|
|
|
describe("texts getter", () => {
|
|
|
|
it("should return array of TextItem", () => {
|
|
|
|
it("should return array of TextItem with correct structure", () => {
|
|
|
|
expect(Array.isArray(textsState.texts)).toBe(true);
|
|
|
|
expect(Array.isArray(textsState.texts)).toBe(true);
|
|
|
|
textsState.texts.forEach((item) => {
|
|
|
|
textsState.texts.forEach((item) => {
|
|
|
|
expect(item).toHaveProperty("text");
|
|
|
|
expect(item).toHaveProperty("text");
|
|
|
@@ -183,7 +118,6 @@ describe("texts.svelte", () => {
|
|
|
|
const initialLength = textsState.texts.length;
|
|
|
|
const initialLength = textsState.texts.length;
|
|
|
|
const addedIds: number[] = [];
|
|
|
|
const addedIds: number[] = [];
|
|
|
|
|
|
|
|
|
|
|
|
// Add multiple texts
|
|
|
|
|
|
|
|
for (let i = 0; i < 5; i++) {
|
|
|
|
for (let i = 0; i < 5; i++) {
|
|
|
|
textsState.addText(`Text ${i}`);
|
|
|
|
textsState.addText(`Text ${i}`);
|
|
|
|
addedIds.push(textsState.texts[textsState.texts.length - 1].id);
|
|
|
|
addedIds.push(textsState.texts[textsState.texts.length - 1].id);
|
|
|
@@ -191,7 +125,6 @@ describe("texts.svelte", () => {
|
|
|
|
|
|
|
|
|
|
|
|
expect(textsState.texts).toHaveLength(initialLength + 5);
|
|
|
|
expect(textsState.texts).toHaveLength(initialLength + 5);
|
|
|
|
|
|
|
|
|
|
|
|
// Remove some of them
|
|
|
|
|
|
|
|
textsState.removeText(addedIds[0]);
|
|
|
|
textsState.removeText(addedIds[0]);
|
|
|
|
textsState.removeText(addedIds[2]);
|
|
|
|
textsState.removeText(addedIds[2]);
|
|
|
|
textsState.removeText(addedIds[4]);
|
|
|
|
textsState.removeText(addedIds[4]);
|
|
|
|