@difizen/mana-syringe
Version:
91 lines (78 loc) • 2.7 kB
text/typescript
import assert from 'assert';
import { GlobalContainer } from '../container';
import { inject, singleton } from '../decorator';
import type { ToAutoFactory } from './auto-factory';
import { autoFactory, AutoFactoryOption, toAutoFactory } from './auto-factory';
describe('auto factory', () => {
it('#decorator', async () => {
()
class DataModel {
data: number;
constructor((AutoFactoryOption) option: { data: number }) {
this.data = option.data;
}
}
GlobalContainer.register(DataModel);
const factoryToken = toAutoFactory(DataModel);
const factory = GlobalContainer.get(factoryToken);
const model = factory({ data: 1 });
assert(model.data === 1);
});
it('#decorator extend', async () => {
()
class DataModelBase {
data: number;
constructor((AutoFactoryOption) option: { data: number }) {
this.data = option.data;
}
}
()
class DataModel extends DataModelBase {
count: number;
constructor((AutoFactoryOption) option: { data: number; count: number }) {
super(option);
this.count = option.count;
}
}
GlobalContainer.register(DataModelBase);
const factoryTokenBase = toAutoFactory(DataModelBase);
const factoryBase = GlobalContainer.get(factoryTokenBase);
const modelBase = factoryBase({ data: 1 });
assert(modelBase instanceof DataModelBase);
assert(modelBase.data === 1);
GlobalContainer.register(DataModel);
const factoryToken = toAutoFactory(DataModel);
const factory = GlobalContainer.get(factoryToken);
const model = factory({ data: 1, count: 2 });
assert(model instanceof DataModel);
assert(model instanceof DataModelBase);
assert(model.data === 1);
assert(model.count === 2);
});
it('#use factory', async () => {
()
class DataModel {
data: number;
constructor((AutoFactoryOption) option: { data: number }) {
this.data = option.data;
}
}
toAutoFactory<typeof DataModel>(DataModel);
()
class DataModelManager {
(toAutoFactory(DataModel))
dataModelFactory: ToAutoFactory<typeof DataModel>;
// Factory<DataModel>
create(option: { data: number }) {
const data = this.dataModelFactory(option);
return data;
}
}
GlobalContainer.register(DataModel);
GlobalContainer.register(DataModelManager);
const dataManager = GlobalContainer.get(DataModelManager);
const data = dataManager.create({ data: 1 });
assert(data instanceof DataModel);
assert(data.data === 1);
});
});