Skip to content

Commit

Permalink
feat: added factory method for cipher instantiation from JSON, and ad…
Browse files Browse the repository at this point in the history
…ded more exports
  • Loading branch information
marlonbarcarol committed May 16, 2021
1 parent 0567f9a commit 633e494
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 9 deletions.
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ ci:
node --version
npm --version
npm ls
npm ci
npm ci --ignore-scripts
$(MAKE) compile

compile:
Expand Down
20 changes: 20 additions & 0 deletions src/Cipher.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,26 @@ import { Cipher, InvalidEnigmaAlphabetError } from './main';

describe('Cipher.ts', () => {
describe('Can instantiate', () => {
test('from JSON', () => {
const cipher = Cipher.fromJSON({
alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
plugboard: { wiring: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' },
entry: { wiring: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' },
rotors: [
{ wiring: 'BDFHJLCPRTXVZNYEIWGAKMUSQO', notches: ['V'] },
{ wiring: 'AJDKSIRUXBLHWTMCQGZNPYFVOE', notches: ['E'] },
{ wiring: 'EKMFLGDQVZNTOWYHXUSPAIBRCJ', notches: ['Q'] },
],
reflector: { wiring: 'YRUHQSLDPXNGOKMIEBFZCWVJAT' },
chargroup: 5,
});

expect(cipher).toBeInstanceOf(Cipher);

const text = cipher.encrypt('Lorem ipsum dolor sit amet, consectetur adipiscing elit.');
expect(text).toEqual('ILFDF ARUBD ONVIS RUKOZ QMNDI YCOUH RLAWB RMPYL AZNYN GR');
});

test('with common configuration', () => {
const alphabet = Alphabet.createEnglish();

Expand Down
62 changes: 61 additions & 1 deletion src/Cipher.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,68 @@
import { EnigmaConfiguration, InvalidEnigmaAlphabetError } from './main';
import { Rotor } from './Configuration/Rotor/Rotor';
import {
Alphabet,
EnigmaConfiguration,
InvalidEnigmaAlphabetError,
Plugboard,
Reflector,
RotorWiring,
Wheel,
Wiring,
} from './main';
import { Nullable } from './types/type';

export interface CipherJSON {
alphabet: string;
plugboard?: { wiring: string };
entry?: { wiring: string };
rotors: Array<{
wiring: string;
position?: string;
notches?: string[];
lock?: boolean;
}>;
reflector?: { wiring: string };
chargroup?: Nullable<number>;
}

export class Cipher {
public readonly configuration: EnigmaConfiguration;

public static fromJSON(json: CipherJSON): Cipher {
const alphabet = new Alphabet(json.alphabet);
const plugboard = json.plugboard
? new Plugboard(new Wiring(alphabet, Alphabet.create(json.plugboard.wiring)))
: null;

const entry = json.entry
? new Wheel(new Wiring(alphabet, Alphabet.create(json.entry.wiring)))
: null;

const rotors = json.rotors.map((configuration) => {
return new Rotor({
wiring: new RotorWiring(alphabet, Alphabet.create(configuration.wiring)),
notches: configuration.notches,
position: configuration.position,
lock: configuration.lock,
});
});

const reflector = json.reflector
? new Reflector(new Wiring(alphabet, Alphabet.create(json.reflector.wiring)))
: null;

const chargroup = json.chargroup;

return new Cipher({
alphabet,
plugboard,
entry,
rotors,
reflector,
chargroup,
});
}

public constructor(configuration: EnigmaConfiguration) {
const characters = configuration.alphabet.order();

Expand Down
25 changes: 18 additions & 7 deletions src/main.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,36 @@
import { Cipher } from './Cipher';
import { Cipher, CipherJSON } from './Cipher';
import { Alphabet } from './Configuration/Alphabet/Alphabet';
import { UniqueAlphabetCharacterError } from './Configuration/Alphabet/Error/UniqueAlphabetCharacterError';
import { EnigmaConfiguration } from './Configuration/EnigmaConfiguration';
import { Plugboard } from './Configuration/Plugboard/Plugboard';
import { Reflector } from './Configuration/Reflector/Reflector';
import { Rotor } from './Configuration/Rotor/Rotor';
import { Rotor, RotorConfiguration } from './Configuration/Rotor/Rotor';
import { RotorRing } from './Configuration/Rotor/RotorRing';
import { RotorWiring } from './Configuration/Rotor/RotorWiring';
import { RotorWiring, RotorWiringDirectionEnum } from './Configuration/Rotor/RotorWiring';
import { Wheel } from './Configuration/Wheel/Wheel';
import { AbstractWiringProcessor } from './Configuration/Wiring/AbstractWiringProcessor';
import { InvalidWiringAssociationError } from './Configuration/Wiring/Error/InvalidWiringAssociationError';
import { InvalidWiringLengthError } from './Configuration/Wiring/Error/InvalidWiringLengthError';
import { Wiring } from './Configuration/Wiring/Wiring';
import { InvalidEnigmaAlphabetError } from './Error/InvalidEnigmaAlphabetError';

export {
Cipher,
Alphabet,
CipherJSON,
EnigmaConfiguration,
Alphabet,
Wiring,
AbstractWiringProcessor,
Plugboard,
Reflector,
Wheel,
Rotor,
RotorRing,
RotorWiring,
Wheel,
Wiring,
RotorWiringDirectionEnum,
RotorConfiguration,
Reflector,
InvalidEnigmaAlphabetError,
UniqueAlphabetCharacterError,
InvalidWiringAssociationError,
InvalidWiringLengthError,
};

0 comments on commit 633e494

Please sign in to comment.