diff --git a/dependency-manager.test.ts b/dependency-manager.test.ts new file mode 100644 index 0000000..d628584 --- /dev/null +++ b/dependency-manager.test.ts @@ -0,0 +1,77 @@ +import { + assertEquals, + assertRejects, + assertThrows, +} from "https://deno.land/std@0.224.0/assert/mod.ts"; +import { DependencyManager } from "./dependency-manager.ts"; + +// Test case for registering a module +Deno.test("DependencyManager: register a module", () => { + const manager = new DependencyManager(); + const provider = () => "dependency"; + manager.register("identifier", provider); + assertEquals( + manager.resolve("identifier"), + Promise.resolve("dependency"), + ); +}); + +// Test case for resolving a module +Deno.test("DependencyManager: resolve a module", async () => { + const manager = new DependencyManager(); + const provider = () => "dependency"; + manager.register("identifier", provider); + const result = await manager.resolve("identifier"); + assertEquals(result, "dependency"); +}); + +// Test case for resolving an async module +Deno.test("DependencyManager: resolve an async module", async () => { + const manager = new DependencyManager(); + const provider = () => { + return new Promise((resolve) => + setTimeout(() => resolve("dependency"), 100) + ); + }; + manager.register("identifier", provider); + const result = await manager.resolve("identifier"); + assertEquals(result, "dependency"); +}); + +// Test case for handling circular dependencies +Deno.test("DependencyManager: circular dependency detection", async () => { + const manager = new DependencyManager(); + const providerA = async () => await manager.resolve("B"); + const providerB = async () => await manager.resolve("A"); + + manager.register("A", providerA); + manager.register("B", providerB); + + await assertRejects( + () => manager.resolve("A"), + Error, + "Circular dependency detected for module A.", + ); +}); + +// Test case for handling duplicate module registration +Deno.test("DependencyManager: duplicate module registration", () => { + const manager = new DependencyManager(); + const provider = () => "dependency"; + manager.register("identifier", provider); + assertThrows( + () => manager.register("identifier", provider), + Error, + "Module identifier is already registered.", + ); +}); + +// Test case for handling unresolved modules +Deno.test("DependencyManager: resolve an unregistered module", async () => { + const manager = new DependencyManager(); + await assertRejects( + () => manager.resolve("unregistered-identifier"), + Error, + "Module unregistered-identifier is not registered.", + ); +});