import { CaseTransformerFactory } from '../factories/case-transformer.factory'; import { ICaseTransformer } from '../interfaces'; // Mock transformer for testing class MockTransformer implements ICaseTransformer { constructor(private caseStyle: string) {} transform(input: string): string { return input.toUpperCase(); } transformWithContext(input: string, context: any): string { return this.transform(input); } detect(input: string): boolean { return /^[A-Z]+$/.test(input); } getCaseStyle(): string { return this.caseStyle; } getDescription(): string { return `Mock transformer for ${this.caseStyle}`; } } describe('CaseTransformerFactory Comprehensive Coverage', () => { beforeEach(() => { CaseTransformerFactory.clear(); }); describe('getTransformer', () => { it('should create and cache transformer instances', () => { const transformer1 = CaseTransformerFactory.getTransformer('camelCase'); const transformer2 = CaseTransformerFactory.getTransformer('camelCase'); expect(transformer1).toBe(transformer2); // Same instance (singleton) expect(transformer1.getCaseStyle()).toBe('camelCase'); }); it('should handle custom transformers', () => { const customTransformer = new MockTransformer('custom'); CaseTransformerFactory.registerTransformer('custom', customTransformer); const retrieved = CaseTransformerFactory.getTransformer('custom'); expect(retrieved).toBe(customTransformer); }); it('should throw error for unsupported case style', () => { expect(() => { CaseTransformerFactory.getTransformer('unsupported'); }).toThrow('Unsupported case style: unsupported'); }); }); describe('registerTransformer', () => { it('should register custom transformers', () => { const customTransformer = new MockTransformer('custom'); CaseTransformerFactory.registerTransformer('custom', customTransformer); expect(CaseTransformerFactory.isSupported('custom')).toBe(true); expect(CaseTransformerFactory.getTransformer('custom')).toBe(customTransformer); }); it('should override existing transformers', () => { const originalTransformer = CaseTransformerFactory.getTransformer('camelCase'); const customTransformer = new MockTransformer('camelCase'); CaseTransformerFactory.registerTransformer('camelCase', customTransformer); expect(CaseTransformerFactory.getTransformer('camelCase')).toBe(customTransformer); expect(CaseTransformerFactory.getTransformer('camelCase')).not.toBe(originalTransformer); }); }); describe('getAllTransformers', () => { it('should return all transformers including custom ones', () => { const customTransformer = new MockTransformer('custom'); CaseTransformerFactory.registerTransformer('custom', customTransformer); // Get all built-in transformers to ensure they're created CaseTransformerFactory.getTransformer('camelCase'); CaseTransformerFactory.getTransformer('snake_case'); CaseTransformerFactory.getTransformer('PascalCase'); CaseTransformerFactory.getTransformer('kebab-case'); const allTransformers = CaseTransformerFactory.getAllTransformers(); expect(allTransformers.has('custom')).toBe(true); expect(allTransformers.has('camelCase')).toBe(true); expect(allTransformers.has('snake_case')).toBe(true); expect(allTransformers.has('PascalCase')).toBe(true); expect(allTransformers.has('kebab-case')).toBe(true); }); it('should not duplicate transformers', () => { const allTransformers = CaseTransformerFactory.getAllTransformers(); const transformerSet = new Set(); for (const [key, transformer] of allTransformers) { expect(transformerSet.has(transformer)).toBe(false); transformerSet.add(transformer); } }); }); describe('detectCaseStyle', () => { it('should detect case style from string', () => { expect(CaseTransformerFactory.detectCaseStyle('firstName')).toBe('camelCase'); expect(CaseTransformerFactory.detectCaseStyle('first_name')).toBe('snake_case'); expect(CaseTransformerFactory.detectCaseStyle('FirstName')).toBe('PascalCase'); expect(CaseTransformerFactory.detectCaseStyle('first-name')).toBe('kebab-case'); }); it('should return null for unrecognized patterns', () => { expect(CaseTransformerFactory.detectCaseStyle('FIRSTNAME')).toBe('PascalCase'); // This actually matches PascalCase pattern expect(CaseTransformerFactory.detectCaseStyle('first name')).toBe(null); expect(CaseTransformerFactory.detectCaseStyle('')).toBe(null); }); it('should prioritize custom transformers', () => { const customTransformer = new MockTransformer('custom'); customTransformer.detect = jest.fn().mockReturnValue(true); CaseTransformerFactory.registerTransformer('custom', customTransformer); const result = CaseTransformerFactory.detectCaseStyle('test'); expect(result).toBe('custom'); expect(customTransformer.detect).toHaveBeenCalledWith('test'); }); }); describe('getTransformerInfo', () => { it('should return transformer info for supported case style', () => { const info = CaseTransformerFactory.getTransformerInfo('camelCase'); expect(info).toEqual({ name: 'camelCase', description: expect.any(String), }); }); it('should return null for unsupported case style', () => { const info = CaseTransformerFactory.getTransformerInfo('unsupported'); expect(info).toBeNull(); }); }); describe('getStats', () => { it('should return correct statistics', () => { const stats = CaseTransformerFactory.getStats(); expect(stats.totalAvailable).toBe(4); expect(stats.instancesCreated).toBe(0); expect(stats.customTransformers).toBe(0); }); it('should update statistics after creating instances', () => { CaseTransformerFactory.getTransformer('camelCase'); CaseTransformerFactory.getTransformer('snake_case'); const stats = CaseTransformerFactory.getStats(); expect(stats.instancesCreated).toBe(2); }); it('should update statistics after registering custom transformers', () => { const customTransformer = new MockTransformer('custom'); CaseTransformerFactory.registerTransformer('custom', customTransformer); const stats = CaseTransformerFactory.getStats(); expect(stats.customTransformers).toBe(1); }); }); describe('clear and reset', () => { it('should clear all instances and custom transformers', () => { CaseTransformerFactory.getTransformer('camelCase'); const customTransformer = new MockTransformer('custom'); CaseTransformerFactory.registerTransformer('custom', customTransformer); CaseTransformerFactory.clear(); const stats = CaseTransformerFactory.getStats(); expect(stats.instancesCreated).toBe(0); expect(stats.customTransformers).toBe(0); }); it('should reset to initial state', () => { CaseTransformerFactory.getTransformer('camelCase'); const customTransformer = new MockTransformer('custom'); CaseTransformerFactory.registerTransformer('custom', customTransformer); CaseTransformerFactory.reset(); const stats = CaseTransformerFactory.getStats(); expect(stats.instancesCreated).toBe(0); expect(stats.customTransformers).toBe(0); }); }); describe('Edge Cases', () => { it('should handle multiple calls to getTransformer', () => { const transformer1 = CaseTransformerFactory.getTransformer('camelCase'); const transformer2 = CaseTransformerFactory.getTransformer('camelCase'); const transformer3 = CaseTransformerFactory.getTransformer('camelCase'); expect(transformer1).toBe(transformer2); expect(transformer2).toBe(transformer3); }); it('should handle mixed custom and built-in transformers', () => { const customTransformer = new MockTransformer('custom'); CaseTransformerFactory.registerTransformer('custom', customTransformer); const builtIn = CaseTransformerFactory.getTransformer('camelCase'); const custom = CaseTransformerFactory.getTransformer('custom'); expect(builtIn.getCaseStyle()).toBe('camelCase'); expect(custom.getCaseStyle()).toBe('custom'); expect(builtIn).not.toBe(custom); }); }); });