Created
May 8, 2012 18:18
-
-
Save dvberkel/2638183 to your computer and use it in GitHub Desktop.
Enigma Code Kata
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package nl.tdd.enigma; | |
import java.util.HashMap; | |
import java.util.Map; | |
public class Reflector { | |
private final Map<String, String> reflections = new HashMap<String, String>(); | |
{ | |
reflections.put("a", "y"); | |
reflections.put("b", "r"); | |
reflections.put("c", "u"); | |
reflections.put("a", "y"); | |
reflections.put("b", "r"); | |
reflections.put("c", "u"); | |
reflections.put("d", "h"); | |
reflections.put("e", "q"); | |
reflections.put("f", "s"); | |
reflections.put("g", "l"); | |
reflections.put("h", "d"); | |
reflections.put("i", "p"); | |
reflections.put("j", "x"); | |
reflections.put("k", "n"); | |
reflections.put("l", "g"); | |
reflections.put("m", "o"); | |
reflections.put("n", "k"); | |
reflections.put("o", "m"); | |
reflections.put("p", "i"); | |
reflections.put("q", "e"); | |
reflections.put("r", "b"); | |
reflections.put("s", "f"); | |
reflections.put("t", "z"); | |
reflections.put("u", "c"); | |
reflections.put("v", "w"); | |
reflections.put("w", "v"); | |
reflections.put("x", "j"); | |
reflections.put("y", "a"); | |
reflections.put("z", "t"); | |
} | |
public Object reflect(String character) { | |
return reflections.get(character); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package nl.tdd.enigma; | |
import static org.junit.Assert.*; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
import java.util.List; | |
import org.junit.Test; | |
import org.junit.runner.RunWith; | |
import org.junit.runners.Parameterized; | |
import org.junit.runners.Parameterized.Parameters; | |
@RunWith(Parameterized.class) | |
public class ReflectorTest { | |
private final String inputCharacter; | |
private final String expectedCharacter; | |
public ReflectorTest(String inputCharacter, String expectedCharacter) { | |
this.inputCharacter = inputCharacter; | |
this.expectedCharacter = expectedCharacter; | |
} | |
@Test | |
public void createReflector() { | |
Reflector reflector = new Reflector(); | |
assertEquals(expectedCharacter, reflector.reflect(inputCharacter)); | |
} | |
@Parameters | |
public static Collection<Object[]> data() { | |
List<Object[]> data = new ArrayList<Object[]>(); | |
data.add(new Object[]{"a", "y"}); | |
data.add(new Object[]{"b", "r"}); | |
data.add(new Object[]{"c", "u"}); | |
data.add(new Object[]{"d", "h"}); | |
data.add(new Object[]{"e", "q"}); | |
data.add(new Object[]{"f", "s"}); | |
data.add(new Object[]{"g", "l"}); | |
data.add(new Object[]{"h", "d"}); | |
data.add(new Object[]{"i", "p"}); | |
data.add(new Object[]{"j", "x"}); | |
data.add(new Object[]{"k", "n"}); | |
data.add(new Object[]{"l", "g"}); | |
data.add(new Object[]{"m", "o"}); | |
data.add(new Object[]{"n", "k"}); | |
data.add(new Object[]{"o", "m"}); | |
data.add(new Object[]{"p", "i"}); | |
data.add(new Object[]{"q", "e"}); | |
data.add(new Object[]{"r", "b"}); | |
data.add(new Object[]{"s", "f"}); | |
data.add(new Object[]{"t", "z"}); | |
data.add(new Object[]{"u", "c"}); | |
data.add(new Object[]{"v", "w"}); | |
data.add(new Object[]{"w", "v"}); | |
data.add(new Object[]{"x", "j"}); | |
data.add(new Object[]{"y", "a"}); | |
data.add(new Object[]{"z", "t"}); | |
return data; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package nl.tdd.enigma; | |
import java.util.HashMap; | |
import java.util.Map; | |
public class Rotor { | |
private static final int BACKWARDS = -1; | |
private static final int FORWARD = 1; | |
private static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz"; | |
private final Map<String, String> encodings = new HashMap<String, String>(); | |
private final String setting; | |
{ | |
encodings.put("a", "e"); | |
encodings.put("b", "k"); | |
encodings.put("c", "m"); | |
encodings.put("d", "f"); | |
encodings.put("e", "l"); | |
encodings.put("f", "g"); | |
encodings.put("g", "d"); | |
encodings.put("h", "q"); | |
encodings.put("i", "v"); | |
encodings.put("j", "z"); | |
encodings.put("k", "n"); | |
encodings.put("l", "t"); | |
encodings.put("m", "o"); | |
encodings.put("n", "w"); | |
encodings.put("o", "y"); | |
encodings.put("p", "h"); | |
encodings.put("q", "x"); | |
encodings.put("r", "u"); | |
encodings.put("s", "s"); | |
encodings.put("t", "p"); | |
encodings.put("u", "a"); | |
encodings.put("v", "i"); | |
encodings.put("w", "b"); | |
encodings.put("x", "r"); | |
encodings.put("y", "c"); | |
encodings.put("z", "j"); | |
} | |
public Rotor(String string) { | |
this.setting = string; | |
} | |
public Object encode(String character) { | |
return unshift(encodings.get(shift(character))); | |
} | |
public Object shift(String character) { | |
return rotate(character, FORWARD); | |
} | |
private Object rotate(String character, int sign) { | |
int settingOffset = ALPHABET.indexOf(setting); | |
int characterOffset = ALPHABET.indexOf(character); | |
return String.valueOf(ALPHABET.charAt(mod(characterOffset + sign * settingOffset, ALPHABET.length()))); | |
} | |
public Object unshift(String character) { | |
return rotate(character, BACKWARDS); | |
} | |
private int mod(int number, int modulus) { | |
int result = number % modulus; | |
while (result < 0) { | |
result += modulus; | |
} | |
return result; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package nl.tdd.enigma; | |
import static org.junit.Assert.*; | |
import org.junit.Ignore; | |
import org.junit.Test; | |
public class Rotor1SettingTest { | |
@Test | |
public void shiftForSettingA() { | |
Rotor rotor = new Rotor("a"); | |
assertEquals("a", rotor.shift("a")); | |
assertEquals("b", rotor.shift("b")); | |
assertEquals("c", rotor.shift("c")); | |
} | |
@Test | |
public void shiftForSettingB() { | |
Rotor rotor = new Rotor("b"); | |
assertEquals("b", rotor.shift("a")); | |
assertEquals("c", rotor.shift("b")); | |
assertEquals("d", rotor.shift("c")); | |
} | |
@Test | |
public void shiftForSettingZ() { | |
Rotor rotor = new Rotor("z"); | |
assertEquals("z", rotor.shift("a")); | |
assertEquals("a", rotor.shift("b")); | |
} | |
@Test | |
public void unshiftForSettingA() { | |
Rotor rotor = new Rotor("a"); | |
assertEquals("a", rotor.unshift("a")); | |
assertEquals("b", rotor.unshift("b")); | |
} | |
@Test | |
public void unshiftForSettingB() { | |
Rotor rotor = new Rotor("b"); | |
assertEquals("z", rotor.unshift("a")); | |
assertEquals("a", rotor.unshift("b")); | |
} | |
@Test | |
public void unshiftForSettingZ() { | |
Rotor rotor = new Rotor("z"); | |
assertEquals("b", rotor.unshift("a")); | |
assertEquals("c", rotor.unshift("b")); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package nl.tdd.enigma; | |
import static org.junit.Assert.*; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
import java.util.List; | |
import org.junit.Ignore; | |
import org.junit.Test; | |
import org.junit.runner.RunWith; | |
import org.junit.runners.Parameterized; | |
import org.junit.runners.Parameterized.Parameters; | |
@RunWith(Parameterized.class) | |
public class Rotor1Test { | |
private final String inputCharacter; | |
private final String expectedCharacter; | |
private final String setting; | |
public Rotor1Test(String setting, String inputCharacter, String expectedCharacter) { | |
this.inputCharacter = inputCharacter; | |
this.expectedCharacter = expectedCharacter; | |
this.setting = setting; | |
} | |
@Test | |
public void createReflector() { | |
Rotor rotor = new Rotor(setting); | |
assertEquals(expectedCharacter, rotor.encode(inputCharacter)); | |
} | |
@Parameters | |
public static Collection<Object[]> data() { | |
List<Object[]> data = new ArrayList<Object[]>(); | |
data.add(new Object[]{"a","a", "e"}); | |
data.add(new Object[]{"a","b", "k"}); | |
data.add(new Object[]{"a","c", "m"}); | |
data.add(new Object[]{"a","d", "f"}); | |
data.add(new Object[]{"a","e", "l"}); | |
data.add(new Object[]{"a","f", "g"}); | |
data.add(new Object[]{"a","g", "d"}); | |
data.add(new Object[]{"a","h", "q"}); | |
data.add(new Object[]{"a","i", "v"}); | |
data.add(new Object[]{"a","j", "z"}); | |
data.add(new Object[]{"a","k", "n"}); | |
data.add(new Object[]{"a","l", "t"}); | |
data.add(new Object[]{"a","m", "o"}); | |
data.add(new Object[]{"a","n", "w"}); | |
data.add(new Object[]{"a","o", "y"}); | |
data.add(new Object[]{"a","p", "h"}); | |
data.add(new Object[]{"a","q", "x"}); | |
data.add(new Object[]{"a","r", "u"}); | |
data.add(new Object[]{"a","s", "s"}); | |
data.add(new Object[]{"a","t", "p"}); | |
data.add(new Object[]{"a","u", "a"}); | |
data.add(new Object[]{"a","v", "i"}); | |
data.add(new Object[]{"a","w", "b"}); | |
data.add(new Object[]{"a","x", "r"}); | |
data.add(new Object[]{"a","y", "c"}); | |
data.add(new Object[]{"a","z", "j"}); | |
data.add(new Object[]{"b","a", "j"}); | |
data.add(new Object[]{"b","b", "l"}); | |
data.add(new Object[]{"b","c", "e"}); | |
data.add(new Object[]{"b","d", "k"}); | |
data.add(new Object[]{"b","e", "f"}); | |
data.add(new Object[]{"b","f", "c"}); | |
data.add(new Object[]{"b","g", "p"}); | |
data.add(new Object[]{"b","h", "u"}); | |
data.add(new Object[]{"b","i", "y"}); | |
data.add(new Object[]{"b","j", "m"}); | |
data.add(new Object[]{"b","k", "s"}); | |
data.add(new Object[]{"b","l", "n"}); | |
data.add(new Object[]{"b","m", "v"}); | |
data.add(new Object[]{"b","n", "x"}); | |
data.add(new Object[]{"b","o", "g"}); | |
data.add(new Object[]{"b","p", "w"}); | |
data.add(new Object[]{"b","q", "t"}); | |
data.add(new Object[]{"b","r", "r"}); | |
data.add(new Object[]{"b","s", "o"}); | |
data.add(new Object[]{"b","t", "z"}); | |
data.add(new Object[]{"b","u", "h"}); | |
data.add(new Object[]{"b","v", "a"}); | |
data.add(new Object[]{"b","w", "q"}); | |
data.add(new Object[]{"b","x", "b"}); | |
data.add(new Object[]{"b","y", "i"}); | |
data.add(new Object[]{"b","z", "d"}); | |
return data; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment