From 2e1abbbd3dd06a1c73518b55078998267019d62b Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Fri, 7 Sep 2018 13:01:14 +0200 Subject: [PATCH 1/3] Add spec for NativeLibraryWrapperService --- .../native-library-wrapper.service.spec.ts | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/app/native-library-wrapper.service.spec.ts b/src/app/native-library-wrapper.service.spec.ts index 35f2936..4f50438 100644 --- a/src/app/native-library-wrapper.service.spec.ts +++ b/src/app/native-library-wrapper.service.spec.ts @@ -1,6 +1,6 @@ -import { TestBed, inject } from '@angular/core/testing'; +import {inject, TestBed} from '@angular/core/testing'; -import { NativeLibraryWrapperService } from './native-library-wrapper.service'; +import {NativeLibraryWrapperService} from './native-library-wrapper.service'; describe('NativeLibraryWrapperService', () => { beforeEach(() => { @@ -12,4 +12,22 @@ describe('NativeLibraryWrapperService', () => { it('should be created', inject([NativeLibraryWrapperService], (service: NativeLibraryWrapperService) => { expect(service).toBeTruthy(); })); + + it('should convert punycode', inject([NativeLibraryWrapperService], (service: NativeLibraryWrapperService) => { + expect(service.punycode).toBeTruthy(); + expect(service.punycode.encode('bärneruhr')).toEqual('brneruhr-0za'); + expect(service.punycode.decode('brneruhr-0za')).toEqual('bärneruhr'); + })); + + it('should convert utf8', inject([NativeLibraryWrapperService], (service: NativeLibraryWrapperService) => { + expect(service.utf8).toBeTruthy(); + expect(service.utf8.encode('bärneruhr')).toEqual('bärneruhr'); + expect(service.utf8.decode('bärneruhr')).toEqual('bärneruhr'); + })); + + it('should convert quoted printable', inject([NativeLibraryWrapperService], (service: NativeLibraryWrapperService) => { + expect(service.quotedPrintable).toBeTruthy(); + expect(service.quotedPrintable.encode('bärneruhr')).toEqual('b=E4rneruhr'); + expect(service.quotedPrintable.decode('b=E4rneruhr')).toEqual('bärneruhr'); + })); }); From 56ae9f2acdec4dedeb3e8f6f889c3436be471ccc Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Fri, 7 Sep 2018 14:01:58 +0200 Subject: [PATCH 2/3] Add specs for InputComponentManagerService --- .../input-component-manager.service.spec.ts | 60 ++++++++++++++++++- src/app/input-component-manager.service.ts | 3 + 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/app/input-component-manager.service.spec.ts b/src/app/input-component-manager.service.spec.ts index b15c3bc..59d3f25 100644 --- a/src/app/input-component-manager.service.spec.ts +++ b/src/app/input-component-manager.service.spec.ts @@ -1,6 +1,7 @@ -import { TestBed, inject } from '@angular/core/testing'; +import {inject, TestBed} from '@angular/core/testing'; -import { InputComponentManagerService } from './input-component-manager.service'; +import {InputComponentManagerService} from './input-component-manager.service'; +import {Step} from './step'; describe('InputComponentManagerService', () => { beforeEach(() => { @@ -12,4 +13,59 @@ describe('InputComponentManagerService', () => { it('should be created', inject([InputComponentManagerService], (service: InputComponentManagerService) => { expect(service).toBeTruthy(); })); + + it('should create a component if requesting the first one', + inject([InputComponentManagerService], (service: InputComponentManagerService) => { + const firstStep: Step = service.getFirst(); + expect(firstStep).toBeTruthy(); + expect(service.getFirst()).toBe(firstStep); + expect(service.getAllComponents().length).toEqual(1); + }) + ); + + it('must not add a null Step', inject([InputComponentManagerService], (service: InputComponentManagerService) => { + expect(() => service.register(null)).toThrowError(); + expect(service.getAllComponents().length).toEqual(0); + })); + + it('must not add an undefined Step', inject([InputComponentManagerService], (service: InputComponentManagerService) => { + expect(() => service.register(undefined)).toThrowError(); + expect(service.getAllComponents().length).toEqual(0); + })); + + it('should register new Steps', inject([InputComponentManagerService], (service: InputComponentManagerService) => { + service.register(new Step(99)); + expect(service.getAllComponents().length).toEqual(1); + service.register(new Step(100)); + expect(service.getAllComponents().length).toEqual(2); + })); + + it('should return a new step if the next step doesn\'t exist', + inject([InputComponentManagerService], (service: InputComponentManagerService) => { + // arrange + const firstStep: Step = new Step(0); + service.register(firstStep); + + // act + const nextStep: Step = service.getNext(firstStep); + + // assert + expect(service.getAllComponents().length).toEqual(2); + expect(nextStep.index).toEqual(1); + }) + ); + + it('should return the next step if requested', inject([InputComponentManagerService], (service: InputComponentManagerService) => { + // arrange + const firstStep: Step = new Step(0); + const nextStep: Step = new Step(1); + service.register(firstStep); + service.register(nextStep); + + // act + const requestedStep: Step = service.getNext(firstStep); + // assert + expect(service.getAllComponents().length).toEqual(2); + expect(requestedStep).toEqual(nextStep); + })); }); diff --git a/src/app/input-component-manager.service.ts b/src/app/input-component-manager.service.ts index 45e8d02..5e6cc14 100644 --- a/src/app/input-component-manager.service.ts +++ b/src/app/input-component-manager.service.ts @@ -11,6 +11,9 @@ export class InputComponentManagerService { } public register(component: Step): void { + if (!component) { + throw new Error('component to add must not be empty or undefined'); + } this.components.push(component); } From 2b08ab1b582eeb34331ad5873129863c73a489cd Mon Sep 17 00:00:00 2001 From: Manuel Friedli Date: Fri, 7 Sep 2018 18:42:59 +0200 Subject: [PATCH 3/3] Implement spec for ConverterRegistryService --- src/app/converter-registry.service.spec.ts | 31 +++++++++++++++++++--- src/app/native-library-wrapper.service.ts | 6 ++--- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/app/converter-registry.service.spec.ts b/src/app/converter-registry.service.spec.ts index 2b97a17..e0cfa46 100644 --- a/src/app/converter-registry.service.spec.ts +++ b/src/app/converter-registry.service.spec.ts @@ -1,15 +1,40 @@ -import { TestBed, inject } from '@angular/core/testing'; +import {inject, TestBed} from '@angular/core/testing'; -import { ConverterRegistryService } from './converter-registry.service'; +import {ConverterRegistryService} from './converter-registry.service'; +import {NativeLibraryWrapperService} from './native-library-wrapper.service'; +import {Converter} from './converter/converter'; +import {Base64Decoder} from './converter/base64-decoder'; +import createSpyObj = jasmine.createSpyObj; describe('ConverterRegistryService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [ConverterRegistryService] + providers: [ + ConverterRegistryService, + {provide: NativeLibraryWrapperService, useValue: createSpyObj(['punycode', 'quotedPrintable', 'utf8'])} + ] }); }); it('should be created', inject([ConverterRegistryService], (service: ConverterRegistryService) => { expect(service).toBeTruthy(); })); + + it('should register converters upon creation', inject([ConverterRegistryService], (service: ConverterRegistryService) => { + expect(service.getAllConverters()).toBeTruthy(); + expect(service.getAllConverters().length).toBeGreaterThan(0); + })); + + it('must not allow the same converter ID to be regisgered more than once', + inject([ConverterRegistryService], (service: ConverterRegistryService) => { + // arrange + const duplicateConverter: Converter = new Base64Decoder(); + const duplicateConverterId = duplicateConverter.getId(); + expect(() => { + // act + (service as any).registerConverter(duplicateConverter); + }) + // assert + .toThrowError(`Converter-ID ${duplicateConverterId} is already registered!`); + })); }); diff --git a/src/app/native-library-wrapper.service.ts b/src/app/native-library-wrapper.service.ts index 308a14f..eb661b1 100644 --- a/src/app/native-library-wrapper.service.ts +++ b/src/app/native-library-wrapper.service.ts @@ -7,9 +7,9 @@ import * as NativeUtf8 from 'utf8'; providedIn: 'root' }) export class NativeLibraryWrapperService { - public utf8: Utf8; - public quotedPrintable: QuotedPrintable; - public punycode: Punycode; + public readonly utf8: Utf8; + public readonly quotedPrintable: QuotedPrintable; + public readonly punycode: Punycode; constructor() { this.utf8 = NativeUtf8;