A test that the machine is advancing rotors property
This commit is contained in:
parent
b6b96ed770
commit
07073b9dc1
2 changed files with 38 additions and 2 deletions
|
@ -43,7 +43,7 @@ class Machine {
|
||||||
return output
|
return output
|
||||||
}
|
}
|
||||||
|
|
||||||
private func advanceRotors() {
|
func advanceRotors() {
|
||||||
var shouldAdvance = true // Always advance the first rotor
|
var shouldAdvance = true // Always advance the first rotor
|
||||||
for rotor in rotors.reverse() {
|
for rotor in rotors.reverse() {
|
||||||
if shouldAdvance {
|
if shouldAdvance {
|
||||||
|
|
|
@ -13,10 +13,46 @@ let alphaSeries = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
|
||||||
|
|
||||||
class MachineTests: XCTestCase {
|
class MachineTests: XCTestCase {
|
||||||
|
func makeMachine() -> Machine! {
|
||||||
|
do {
|
||||||
|
let rotors = [try Rotor(.EnigmaI), try Rotor(.EnigmaII), try Rotor(.EnigmaIII)]
|
||||||
|
rotors[0].notch = 17
|
||||||
|
rotors[1].notch = 5
|
||||||
|
rotors[2].notch = 22
|
||||||
|
return Machine(rotors: rotors, reflector: try Reflector(.EnigmaB), plugboard: Plugboard())
|
||||||
|
} catch let error {
|
||||||
|
XCTFail("Error while creating machine: \(error)")
|
||||||
|
}
|
||||||
|
// Never reached
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func testThatItTurnsOn() {
|
func testThatItTurnsOn() {
|
||||||
let machine = try! Machine(rotors: [Rotor(.EnigmaI), Rotor(.EnigmaII), Rotor(.EnigmaIII)], reflector: Reflector(.EnigmaB), plugboard: Plugboard())
|
let machine = makeMachine()
|
||||||
print(try! machine.encode("A"))
|
print(try! machine.encode("A"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testThatRotorsAdvanceAtNotchPositions() {
|
||||||
|
let machine = makeMachine()
|
||||||
|
let rotors = machine.rotors
|
||||||
|
let rotorPermutations = Int(pow(Double(Cryptor.alphabet.count), 3.0))
|
||||||
|
for _ in 0..<rotorPermutations {
|
||||||
|
let rotorIPosition = rotors[0].position
|
||||||
|
let rotorIIPosition = rotors[1].position
|
||||||
|
let rotorIIIPosition = rotors[2].position
|
||||||
|
machine.advanceRotors()
|
||||||
|
// Right-most rotor always advances.
|
||||||
|
XCTAssertEqual(rotors[2].position, (rotorIIIPosition + 1) % rotors[2].series.count)
|
||||||
|
// Middle rotor advances if right-most rotor is at notch position.
|
||||||
|
if rotors[2].position == rotors[2].notch! {
|
||||||
|
XCTAssertEqual(rotors[1].position, (rotorIIPosition + 1) % rotors[1].series.count)
|
||||||
|
}
|
||||||
|
// Left-most rotor advances if middle rotor is at notch position.
|
||||||
|
if rotors[1].position == rotors[1].notch! {
|
||||||
|
XCTAssertEqual(rotors[0].position, (rotorIPosition + 1) % rotors[0].series.count)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue