import 'reflect-metadata'; import { assert } from 'chai'; import { ServiceIdentifiers } from '../../../../src/container/ServiceIdentifiers'; import { IIdentifierNamesGenerator } from '../../../../src/interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator'; import { IInversifyContainerFacade } from '../../../../src/interfaces/container/IInversifyContainerFacade'; import { IdentifierNamesGenerator } from '../../../../src/enums/generators/identifier-names-generators/IdentifierNamesGenerator'; import { InversifyContainerFacade } from '../../../../src/container/InversifyContainerFacade'; describe('DictionaryIdentifierNamesGenerator', () => { describe('generate', () => { let identifierNamesGenerator: IIdentifierNamesGenerator, dictionaryIdentifierName: string; describe('Base behaviour', () => { before(() => { const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade(); inversifyContainerFacade.load('', '', { identifiersDictionary: ['a', 'b'] }); identifierNamesGenerator = inversifyContainerFacade.getNamed( ServiceIdentifiers.IIdentifierNamesGenerator, IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator ); }); describe('Variant #1: first dictionary iteration', () => { const expectedDictionaryIdentifierNameRegExp: RegExp = /[a|b]/; beforeEach(() => { dictionaryIdentifierName = identifierNamesGenerator.generate(); }); it('Match #1: should return first identifier name', () => { assert.match(dictionaryIdentifierName, expectedDictionaryIdentifierNameRegExp); }); it('Match #2: should return second identifier name', () => { assert.match(dictionaryIdentifierName, expectedDictionaryIdentifierNameRegExp); }); }); describe('Variant #2: second dictionary iteration', () => { const expectedDictionaryIdentifierNameRegExp: RegExp = /[A|B]/; beforeEach(() => { dictionaryIdentifierName = identifierNamesGenerator.generate(); }); it('Match #1: should return third identifier name', () => { assert.match(dictionaryIdentifierName, expectedDictionaryIdentifierNameRegExp); }); it('Match #2: should return fourth identifier name', () => { assert.match(dictionaryIdentifierName, expectedDictionaryIdentifierNameRegExp); }); }); }); describe('Empty string as dictionary value', () => { before(() => { const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade(); inversifyContainerFacade.load('', '', { identifiersDictionary: ['', 'a'] }); identifierNamesGenerator = inversifyContainerFacade.getNamed( ServiceIdentifiers.IIdentifierNamesGenerator, IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator ); }); describe('Variant #1: Should ignore empty strings from dictionary', () => { const expectedDictionaryIdentifierNameRegExp: RegExp = /[a|A]/; beforeEach(() => { dictionaryIdentifierName = identifierNamesGenerator.generate(); }); it('Match #1: should return first identifier name', () => { assert.match(dictionaryIdentifierName, expectedDictionaryIdentifierNameRegExp); }); it('Match #2: should return second identifier name', () => { assert.match(dictionaryIdentifierName, expectedDictionaryIdentifierNameRegExp); }); }); }); describe('Multi-character string as dictionary value', () => { before(() => { const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade(); inversifyContainerFacade.load('', '', { identifiersDictionary: ['aa'] }); identifierNamesGenerator = inversifyContainerFacade.getNamed( ServiceIdentifiers.IIdentifierNamesGenerator, IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator ); }); describe('Variant #1: Should generate identifier names based on all variants of word from dictionary', () => { const expectedFirstIterationIdentifierName: string = 'aa'; const expectedSecondIterationIdentifierName: string = 'Aa'; const expectedThirdIterationIdentifierName: string = 'aA'; const expectedFourthIterationIdentifierName: string = 'AA'; beforeEach(() => { dictionaryIdentifierName = identifierNamesGenerator.generate(); }); it('Match #1: should return first identifier name', () => { assert.equal(dictionaryIdentifierName, expectedFirstIterationIdentifierName); }); it('Match #2: should return second identifier name', () => { assert.equal(dictionaryIdentifierName, expectedSecondIterationIdentifierName); }); it('Match #3: should return third identifier name', () => { assert.equal(dictionaryIdentifierName, expectedThirdIterationIdentifierName); }); it('Match #4: should return fourth identifier name', () => { assert.equal(dictionaryIdentifierName, expectedFourthIterationIdentifierName); }); }); }); describe('Generate with prefix', () => { before(() => { const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade(); inversifyContainerFacade.load('', '', { identifiersDictionary: ['a'], identifiersPrefix: 'foo' }); identifierNamesGenerator = inversifyContainerFacade.getNamed( ServiceIdentifiers.IIdentifierNamesGenerator, IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator ); }); describe('Variant #1: Should generate identifier names with prefix', () => { const expectedDictionaryIdentifierNameRegExp: RegExp = /foo_[a|A]/; beforeEach(() => { dictionaryIdentifierName = identifierNamesGenerator.generateWithPrefix(); }); it('Match #1: should return first identifier name', () => { assert.match(dictionaryIdentifierName, expectedDictionaryIdentifierNameRegExp); }); it('Match #2: should return second identifier name', () => { assert.match(dictionaryIdentifierName, expectedDictionaryIdentifierNameRegExp); }); }); }); describe('Errors', () => { let inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade(); beforeEach(() => { inversifyContainerFacade = new InversifyContainerFacade(); }); describe('Variant #1: No more identifier variants for generation', () => { const expectedDictionaryIdentifierNameRegExp: RegExp = /[a|A]/; let testFunc: () => string; before(() => { inversifyContainerFacade.load('', '', { identifiersDictionary: ['a'] }); identifierNamesGenerator = inversifyContainerFacade.getNamed( ServiceIdentifiers.IIdentifierNamesGenerator, IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator ); testFunc = () => identifierNamesGenerator.generate(); }); it('Match #1: should return first identifier name', () => { dictionaryIdentifierName = testFunc(); assert.match(dictionaryIdentifierName, expectedDictionaryIdentifierNameRegExp); }); it('Match #2: should return second identifier name', () => { dictionaryIdentifierName = testFunc(); assert.match(dictionaryIdentifierName, expectedDictionaryIdentifierNameRegExp); }); it('Should throw an error when all identifier variants are used', () => { assert.throws(testFunc, Error); }); }); describe('Variant #2: Empty identifiers dictionary', () => { let testFunc: () => string; before(() => { inversifyContainerFacade.load('', '', { identifiersDictionary: [] }); identifierNamesGenerator = inversifyContainerFacade.getNamed( ServiceIdentifiers.IIdentifierNamesGenerator, IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator ); testFunc = () => identifierNamesGenerator.generate(); }); it('Should throw an error when identifiers dictionary is empty', () => { assert.throws(testFunc, Error); }); }); }); }); });