import { assertEquals, assertThrows, } from 'https://deno.land/std@0.224.0/assert/mod.ts'; import { DependencyManager, Provider } from './dependency-manager.ts'; Deno.test('should register and resolve a simple dependency', () => { const manager = new DependencyManager(); const dependency = () => 'test'; manager.register(dependency); const resolved = manager.resolve(dependency); assertEquals(resolved, 'test'); }); Deno.test('should register and resolve a module with multiple dependencies', () => { const manager = new DependencyManager(); const module = { a: () => 'test1', b: () => 42, }; manager.register(module); const a = manager.resolve(module.a); const b = manager.resolve(module.b); assertEquals(a, 'test1'); assertEquals(b, 42); }); Deno.test('should throw error when registering the same dependency twice', () => { const manager = new DependencyManager(); const dependency = () => 'test'; manager.register(dependency); assertThrows( () => manager.register(dependency), Error, 'This dependency or module has already been registered', ); }); Deno.test('should throw error when resolving a non-registered dependency', () => { const manager = new DependencyManager(); const dependency = () => 'test'; assertThrows( () => manager.resolve(dependency), Error, 'This key has not (yet ?) been used to register something', ); }); Deno.test('should resolve dependency recursively (when not circular)', () => { const manager = new DependencyManager(); const dependencyA = () => 'A'; const dependencyB = (manager: DependencyManager) => manager.resolve(dependencyA); manager.register(dependencyA); manager.register(dependencyB); const b = manager.resolve(dependencyB); assertEquals(b, 'A'); }); Deno.test('should throw error when detecting a circular dependency', () => { const manager = new DependencyManager(); const dependencyA: Provider = (manager) => manager.resolve(dependencyB); const dependencyB: Provider = (manager) => manager.resolve(dependencyA); manager.register(dependencyA); manager.register(dependencyB); assertThrows( () => manager.resolve(dependencyA), Error, 'Circular dependency detected', ); });