From 9a7353e973344c64868a3755f7c69d55d8103518 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sun, 19 Jul 2015 00:00:59 -0700 Subject: [PATCH] Expand Reflector to valid reflection series --- Enigma/Components.swift | 31 ++++++++++++++++++++++++++++++- EnigmaTests/EnigmaTests.swift | 20 ++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/Enigma/Components.swift b/Enigma/Components.swift index 436fbed..0e4425c 100644 --- a/Enigma/Components.swift +++ b/Enigma/Components.swift @@ -80,7 +80,36 @@ class Rotor: FixedRotor { } -class Reflector: FixedRotor { } +class Reflector: FixedRotor { + enum Wiring: String { + case EnigmaA = "EJMZALYXVBWFCRQUONTSPIKHGD" + case EnigmaB = "YRUHQSLDPXNGOKMIEBFZCWVJAT" + case EnigmaC = "FVPJIAOYEDRZXWGCTKUQSBNMHL" + case EnigmaM4R1BThin = "ENKQAUYWJICOPBLMDXZVFTHRGS" + case EnigmaM4R1CThin = "RDOBJNTKVEHMLFCWZAXGYIPSUQ" + } + + enum Error: ErrorType { + case InvalidReflection + } + + override init(series: [Character]) throws { + try super.init(series: series) + try validateReflector(series) + } + + func validateReflector(series: [Character]) throws { + for (offset, c) in series.enumerate() { + if let alphabetOffset = Reflector.alphabet.indexOf(c) { + if series[alphabetOffset] != Reflector.alphabet[offset] { + throw Error.InvalidReflection + } + } else { + throw EncoderError.InvalidCharacter(ch: c) + } + } + } +} /** A Plugboard is a Cryptor that substitutes one character for another based on a set of pairs. A pair of characters is mutually exclusive of other pairs; that is, a character can only belong to one pair. Furthermore, the Plugboard always trades one character for the same character and vice versa. */ diff --git a/EnigmaTests/EnigmaTests.swift b/EnigmaTests/EnigmaTests.swift index 359d0d0..afe536c 100644 --- a/EnigmaTests/EnigmaTests.swift +++ b/EnigmaTests/EnigmaTests.swift @@ -41,6 +41,26 @@ class RotorTests: XCTestCase { } +class ReflectorTests: XCTestCase { + func testThatReflectorReflects() { + var reflector: Reflector! = nil + do { + reflector = try Reflector(series: Reflector.Wiring.EnigmaA.rawValue) + } catch let error { + XCTFail("Error creating reflector: \(error)") + } + do { + let encodeA = try reflector.encode("A") + let encodeE = try reflector.encode("E") + XCTAssertEqual(encodeA, "E") + XCTAssertEqual(encodeE, "A") + } catch { + XCTFail("Reflector encoding failed") + } + } +} + + class PlugboardTests: XCTestCase { func testThatEmptyPlugboardPassesThroughAllCharacters() { let plugboard = Plugboard()