diff --git a/tests/ImageLoader.test.svelte b/tests/ImageLoader.test.svelte
deleted file mode 100644
index 1a3f8e1a..00000000
--- a/tests/ImageLoader.test.svelte
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
- {
- console.log(e.detail); // null
- }}
- on:error={(e) => {
- console.log(e.detail); // null
- }}
-/>
diff --git a/tests/ImageLoader/ImageLoader.test.svelte b/tests/ImageLoader/ImageLoader.test.svelte
new file mode 100644
index 00000000..1a805651
--- /dev/null
+++ b/tests/ImageLoader/ImageLoader.test.svelte
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ An error occurred.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Failed to load image
+
+
+
diff --git a/tests/ImageLoader/ImageLoader.test.ts b/tests/ImageLoader/ImageLoader.test.ts
new file mode 100644
index 00000000..86640905
--- /dev/null
+++ b/tests/ImageLoader/ImageLoader.test.ts
@@ -0,0 +1,129 @@
+import { render, screen } from "@testing-library/svelte";
+import ImageLoader from "./ImageLoader.test.svelte";
+
+describe("ImageLoader", () => {
+ beforeEach(() => {
+ vi.useFakeTimers();
+ });
+
+ afterEach(() => {
+ vi.useRealTimers();
+ vi.restoreAllMocks();
+ });
+
+ it("renders with default props", () => {
+ render(ImageLoader);
+ const wrapper = screen.getByTestId("default-loader");
+ const img = wrapper.querySelector("img");
+ expect(img).toBeDefined();
+ });
+
+ it("shows loading state and transitions to loaded state", async () => {
+ render(ImageLoader);
+
+ const loadingIndicator = screen.getByTestId("loading-state");
+ expect(loadingIndicator).toBeInTheDocument();
+
+ const wrapper = screen.getByTestId("loader-with-slots");
+ const img = wrapper.querySelector("img");
+ expect(img).toBeDefined();
+ if (img) {
+ const loadEvent = new Event("load");
+ img.dispatchEvent(loadEvent);
+
+ expect(screen.queryByTestId("loading-state")).not.toBeInTheDocument();
+ expect(img).toBeVisible();
+ }
+ });
+
+ it("handles error state correctly", async () => {
+ render(ImageLoader);
+
+ const wrapper = screen.getByTestId("error-loader");
+ const img = wrapper.querySelector("img");
+ expect(img).toBeDefined();
+
+ if (img) {
+ const errorEvent = new Event("error");
+ img.dispatchEvent(errorEvent);
+
+ const errorMessage = screen.getByTestId("error-message");
+ expect(errorMessage).toBeInTheDocument();
+ expect(errorMessage).toHaveTextContent("Failed to load image");
+ }
+ });
+
+ it("supports aspect ratio", () => {
+ render(ImageLoader);
+
+ const wrapper = screen.getByTestId("loader-with-ratio");
+ const aspectRatioWrapper = wrapper.querySelector(
+ "[class*='bx--aspect-ratio']",
+ );
+
+ expect(aspectRatioWrapper).toHaveClass("bx--aspect-ratio--16x9");
+ });
+
+ it("supports fade in animation", async () => {
+ render(ImageLoader);
+
+ const wrapper = screen.getByTestId("loader-with-fade");
+ const img = wrapper.querySelector("img");
+ expect(img).toBeDefined();
+
+ if (img) {
+ const loadEvent = new Event("load");
+ img.dispatchEvent(loadEvent);
+
+ expect(img).toHaveStyle({
+ transition: expect.stringContaining("opacity"),
+ });
+ }
+ });
+
+ it("supports programmatic image loading", async () => {
+ const { component } = render(ImageLoader);
+
+ const wrapper = screen.getByTestId("programmatic-loader");
+ const img = wrapper.querySelector("img");
+ expect(img).toBeDefined();
+
+ const imageLoaderComponent = component.imageLoader;
+ expect(imageLoaderComponent).toBeDefined();
+
+ const newSrc = "https://example.com/new-image.jpg";
+
+ imageLoaderComponent.loadImage(newSrc);
+ if (img) {
+ expect(img.getAttribute("src")).toBe(newSrc);
+ }
+ });
+
+ it("dispatches load and error events", async () => {
+ const { component } = render(ImageLoader);
+
+ const load = vi.fn();
+ const error = vi.fn();
+
+ component.$on("load", load);
+ component.$on("error", error);
+
+ const defaultWrapper = screen.getByTestId("default-loader");
+ const defaultImg = defaultWrapper.querySelector("img");
+ expect(defaultImg).toBeDefined();
+
+ if (defaultImg) {
+ defaultImg.dispatchEvent(new Event("load"));
+ expect(load).toHaveBeenCalled();
+ }
+
+ const errorWrapper = screen.getByTestId("error-loader");
+ const errorImg = errorWrapper.querySelector("img");
+ expect(errorImg).toBeDefined();
+
+ if (errorImg) {
+ errorImg.dispatchEvent(new Event("error"));
+ expect(error).toHaveBeenCalled();
+ }
+ });
+});