diff --git a/src/main/java/io/github/vbetsch/codecracker/CodeCracker.java b/src/main/java/io/github/vbetsch/codecracker/CodeCracker.java
index cffbfd0..0fc4cf0 100644
--- a/src/main/java/io/github/vbetsch/codecracker/CodeCracker.java
+++ b/src/main/java/io/github/vbetsch/codecracker/CodeCracker.java
@@ -1,5 +1,31 @@
package io.github.vbetsch.codecracker;
public class CodeCracker {
+ private final TranslationDictionary dictionary = new TranslationDictionary();
+ public char decryptChar(char letter) {
+ return dictionary.getDecryptions().get(letter);
+ }
+
+ public char encryptLetter(char character) {
+ return dictionary.getEncryptions().get(character);
+ }
+
+ public String decryptString(String string) {
+ StringBuilder stringBuilder = new StringBuilder();
+ for (char character : string.toCharArray()) {
+ stringBuilder.append(decryptChar(character));
+ }
+ return stringBuilder.toString();
+ }
+
+ public String encryptString(String string) {
+ StringBuilder stringBuilder = new StringBuilder();
+ for (char character : string.toCharArray()) {
+ char lowerCaseChar = Character.toLowerCase(character);
+ if (!dictionary.containsDecryptionValue(lowerCaseChar)) continue;
+ stringBuilder.append(encryptLetter(lowerCaseChar));
+ }
+ return stringBuilder.toString();
+ }
}
\ No newline at end of file
diff --git a/src/main/java/io/github/vbetsch/codecracker/Main.java b/src/main/java/io/github/vbetsch/codecracker/Main.java
index 7a2707e..175fa21 100644
--- a/src/main/java/io/github/vbetsch/codecracker/Main.java
+++ b/src/main/java/io/github/vbetsch/codecracker/Main.java
@@ -1,17 +1,9 @@
package io.github.vbetsch.codecracker;
-//TIP To Run code, press or
-// click the icon in the gutter.
public class Main {
static void main() {
- //TIP Press with your caret at the highlighted text
- // to see how IntelliJ IDEA suggests fixing it.
- IO.println(String.format("Hello and welcome!"));
-
- for (int i = 1; i <= 5; i++) {
- //TIP Press to start debugging your code. We have set one breakpoint
- // for you, but you can always add more by pressing .
- IO.println("i = " + i);
- }
+ CodeCracker codeCracker = new CodeCracker();
+ IO.println(String.format("Hello world!"));
+ System.out.println("Encrypted : " + codeCracker.encryptString("Hello world!"));
}
}
diff --git a/src/main/java/io/github/vbetsch/codecracker/TranslationDictionary.java b/src/main/java/io/github/vbetsch/codecracker/TranslationDictionary.java
new file mode 100644
index 0000000..5a7b0eb
--- /dev/null
+++ b/src/main/java/io/github/vbetsch/codecracker/TranslationDictionary.java
@@ -0,0 +1,60 @@
+package io.github.vbetsch.codecracker;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static java.util.Map.entry;
+
+public class TranslationDictionary {
+
+ private final Map decryptions = Map.ofEntries(
+ entry('!', 'a'),
+ entry(')', 'b'),
+ entry('"', 'c'),
+ entry('(', 'd'),
+ entry('£', 'e'),
+ entry('*', 'f'),
+ entry('%', 'g'),
+ entry('&', 'h'),
+ entry('>', 'i'),
+ entry('<', 'j'),
+ entry('@', 'k'),
+ entry('a', 'l'),
+ entry('b', 'm'),
+ entry('c', 'n'),
+ entry('d', 'o'),
+ entry('e', 'p'),
+ entry('f', 'q'),
+ entry('g', 'r'),
+ entry('h', 's'),
+ entry('i', 't'),
+ entry('j', 'u'),
+ entry('k', 'v'),
+ entry('l', 'w'),
+ entry('m', 'x'),
+ entry('n', 'y'),
+ entry('o', 'z')
+ );
+
+ private final Map encryptions = invert(decryptions);
+
+ private static Map invert(Map map) {
+ Map inverted = new HashMap<>();
+ for (Map.Entry entry : map.entrySet()) {
+ inverted.put(entry.getValue(), entry.getKey());
+ }
+ return inverted;
+ }
+
+ public Map getDecryptions() {
+ return decryptions;
+ }
+
+ public Map getEncryptions() {
+ return encryptions;
+ }
+
+ public boolean containsDecryptionValue(char letter) {
+ return decryptions.containsValue(letter);
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/io/github/vbetsch/codecracker/CodeCrackerTest.java b/src/test/java/io/github/vbetsch/codecracker/CodeCrackerTest.java
index d815970..1cba55a 100644
--- a/src/test/java/io/github/vbetsch/codecracker/CodeCrackerTest.java
+++ b/src/test/java/io/github/vbetsch/codecracker/CodeCrackerTest.java
@@ -2,15 +2,151 @@
import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
class CodeCrackerTest {
@Test
- void should_doSomething_whenSomeCondition() {
+ void should_returnLetterA_whenDecryptExclamationPoint() {
+ // Arrange
+ CodeCracker codeCracker = new CodeCracker();
+
+ // Act
+ char decryptedExclamationPoint = codeCracker.decryptChar('!');
+
+ // Assert
+ assertEquals('a', decryptedExclamationPoint);
+ }
+
+ @Test
+ void should_returnLetterB_whenDecryptEndParenthesis() {
+ // Arrange
+ CodeCracker codeCracker = new CodeCracker();
+
+ // Act
+ char decryptedEndParenthesis = codeCracker.decryptChar(')');
+
+ // Assert
+ assertEquals('b', decryptedEndParenthesis);
+ }
+
+ @Test
+ void should_returnWordAB_whenDecryptExclamationPointAndEndParenthesis() {
+ // Arrange
+ CodeCracker codeCracker = new CodeCracker();
+
+ // Act
+ String decryptedString = codeCracker.decryptString("!)");
+
+ // Assert
+ assertEquals("ab", decryptedString);
+ }
+
+ @Test
+ void should_decryptWordHello() {
+ // Arrange
+ CodeCracker codeCracker = new CodeCracker();
+
+ // Act
+ String decryptedString = codeCracker.decryptString("&£aad");
+
+ // Assert
+ assertEquals("hello", decryptedString);
+ }
+
+ @Test
+ void should_decryptWordWorld() {
+ // Arrange
+ CodeCracker codeCracker = new CodeCracker();
+
+ // Act
+ String decryptedString = codeCracker.decryptString("ldga(");
+
+ // Assert
+ assertEquals("world", decryptedString);
+ }
+
+ @Test
+ void should_returnExclamationPoint_whenEncryptLetterA() {
+ // Arrange
+ CodeCracker codeCracker = new CodeCracker();
+
+ // Act
+ char encryptedLetterA = codeCracker.encryptLetter('a');
+
+ // Assert
+ assertEquals('!', encryptedLetterA);
+ }
+
+ @Test
+ void should_returnEndParenthesis_whenEncryptLetterB() {
+ // Arrange
+ CodeCracker codeCracker = new CodeCracker();
+
+ // Act
+ char encryptedLetterB = codeCracker.encryptLetter('b');
+
+ // Assert
+ assertEquals(')', encryptedLetterB);
+ }
+
+ @Test
+ void should_returnExclamationPointAndEndParenthesis_whenEncryptAB() {
+ // Arrange
+ CodeCracker codeCracker = new CodeCracker();
+
+ // Act
+ String encryptedAB = codeCracker.encryptString("ab");
+
+ // Assert
+ assertEquals("!)", encryptedAB);
+ }
+
+ @Test
+ void should_encryptWordHello() {
+ // Arrange
+ CodeCracker codeCracker = new CodeCracker();
+
+ // Act
+ String encryptedHello = codeCracker.encryptString("hello");
+
+ // Assert
+ assertEquals("&£aad", encryptedHello);
+ }
+
+ @Test
+ void should_encryptWordWorld() {
// Arrange
CodeCracker codeCracker = new CodeCracker();
// Act
+ String encryptedWorld = codeCracker.encryptString("world");
+
// Assert
+ assertEquals("ldga(", encryptedWorld);
}
+ @Test
+ void should_handleUpperCaseInEncrypt() {
+ // Arrange
+ CodeCracker codeCracker = new CodeCracker();
+
+ // Act
+ String encryptedHello = codeCracker.encryptString("Hello");
+
+ // Assert
+ assertEquals("&£aad", encryptedHello);
+ }
+
+ @Test
+ void should_handleUnknownCharacters() {
+ // Arrange
+ CodeCracker codeCracker = new CodeCracker();
+
+ // Act
+ String encryptedHello = codeCracker.encryptString("Hello !");
+
+ // Assert
+ assertEquals("&£aad", encryptedHello);
+ }
}