92 lines
2.2 KiB
TypeScript
92 lines
2.2 KiB
TypeScript
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<string> = (manager) =>
|
|
manager.resolve(dependencyB);
|
|
const dependencyB: Provider<string> = (manager) =>
|
|
manager.resolve(dependencyA);
|
|
|
|
manager.register(dependencyA);
|
|
manager.register(dependencyB);
|
|
|
|
assertThrows(
|
|
() => manager.resolve(dependencyA),
|
|
Error,
|
|
'Circular dependency detected',
|
|
);
|
|
});
|