Expand Reflector to valid reflection series

This commit is contained in:
Eryn Wells 2015-07-19 00:00:59 -07:00
parent 6a2e4fd44e
commit 9a7353e973
2 changed files with 50 additions and 1 deletions

View file

@ -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. */

View file

@ -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()