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. */
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue