import { assertEquals, assertThrows, } from 'https://deno.land/std@0.224.0/assert/mod.ts'; import { Identifier, Manager, Provider } from './dependency-manager.ts'; Deno.test('provide: should throw error when an identifier is reused', () => { const value = 'test'; const identifier = Symbol() as Identifier; const manager = new Manager(); manager.register(identifier, () => value); assertThrows( () => manager.register(identifier, () => value), Error, ); }); Deno.test('provide: should throw error when resolving a non-registered dependency', () => { const identifier = Symbol(); const manager = new Manager(); assertThrows( () => manager.inject(identifier), Error, ); }); Deno.test('inject: should return the provided value (stand-alone injectable)', () => { const value = 'foo'; const identifier = Symbol() as Identifier; const manager = new Manager(); manager.register(identifier, () => value); const resolved = manager.inject(identifier); assertEquals(resolved, 'foo'); }); Deno.test('inject: should return the expected value (injectable with dependencies)', () => { const providerA = () => 'a'; const identifierA = Symbol() as Identifier>; const providerB = (m: Manager) => { const a = manager.inject(identifierA); return `-${a}-`; }; const identifierB = Symbol() as Identifier>; const manager = new Manager(); manager.register(identifierA, providerA); manager.register(identifierB, providerB); const b = manager.inject(identifierB); assertEquals(b, '-a-'); }); Deno.test('inject: should throw error when detecting a circular dependency', () => { const identifierA = Symbol(); const identifierB = Symbol(); const providerA = (manager: Manager) => manager.inject(identifierB); const providerB = (manager: Manager) => manager.inject(identifierA); const manager = new Manager(); manager.register(identifierA, providerA); manager.register(identifierB, providerB); assertThrows( () => manager.inject(identifierA), Error, ); });