78 lines
2.0 KiB
TypeScript
78 lines
2.0 KiB
TypeScript
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<typeof value>;
|
|
|
|
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<typeof value>;
|
|
|
|
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<ReturnType<typeof providerA>>;
|
|
|
|
const providerB = (m: Manager) => {
|
|
const a = manager.inject(identifierA);
|
|
|
|
return `-${a}-`;
|
|
};
|
|
const identifierB = Symbol() as Identifier<ReturnType<typeof providerB>>;
|
|
|
|
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,
|
|
);
|
|
});
|