Expand Reflector to valid reflection series
This commit is contained in:
parent
6a2e4fd44e
commit
9a7353e973
2 changed files with 50 additions and 1 deletions
|
@ -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. */
|
/** 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. */
|
||||||
|
|
|
@ -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 {
|
class PlugboardTests: XCTestCase {
|
||||||
func testThatEmptyPlugboardPassesThroughAllCharacters() {
|
func testThatEmptyPlugboardPassesThroughAllCharacters() {
|
||||||
let plugboard = Plugboard()
|
let plugboard = Plugboard()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue