Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
e3382db
feat: decrypt ! from a
vbetsch Jun 30, 2026
e570399
test: should_returnEndParenthesis_whenDecryptLetterB
vbetsch Jun 30, 2026
f6e2cd4
feat: create translations
vbetsch Jun 30, 2026
189af18
test: should_returnExclamationPointAndEndParenthesis_whenDecryptStringAB
vbetsch Jun 30, 2026
370d3d5
fix: typing
vbetsch Jun 30, 2026
88a3cc7
feat: create decryptString
vbetsch Jun 30, 2026
08c39b5
refactor: rename decryptString to decryptWord
vbetsch Jun 30, 2026
52c2dae
refactor: rename should_returnExclamationPointAndEndParenthesis_whenD…
vbetsch Jun 30, 2026
1054fd5
refactor: rename decrypt to decryptLetter
vbetsch Jun 30, 2026
7cb9f4e
refactor: add final statement
vbetsch Jun 30, 2026
dbfe412
refactor: add private statement
vbetsch Jun 30, 2026
cb45435
refactor: add static statement
vbetsch Jun 30, 2026
e583895
refactor: remove static statement
vbetsch Jun 30, 2026
0e1376c
test: should_returnCorrectString_whenDecryptWordHello
vbetsch Jun 30, 2026
29d2f68
feat: complete translations
vbetsch Jun 30, 2026
6af1ec1
test: should_returnCorrectString_whenDecryptWordWorld
vbetsch Jun 30, 2026
91d66c3
test: should_returnLetterA_whenEncryptCharExclamationPoint
vbetsch Jun 30, 2026
d38201d
feat: create encryptChar with invertMap
vbetsch Jun 30, 2026
9a97276
refactor: rename translations to dictionary
vbetsch Jun 30, 2026
21df9be
refactor: create Cypher class
vbetsch Jun 30, 2026
f4b4475
refactor: remove unused imports
vbetsch Jun 30, 2026
25181dd
refactor: create TranslationDictionary
vbetsch Jun 30, 2026
4ab419a
refactor: move decryptWord logic in Cypher
vbetsch Jun 30, 2026
0f0a25e
refactor: remove Cypher
vbetsch Jun 30, 2026
ffc99e4
test: should_returnLetterB_whenEncryptCharEndParenthesis
vbetsch Jun 30, 2026
df6a206
test: should_returnWordAB_whenEncryptExclamationPointAndEndParenthesis
vbetsch Jun 30, 2026
9e0b286
feat: create encryptString
vbetsch Jun 30, 2026
4094e5d
fix: direction
vbetsch Jun 30, 2026
a1ece7e
fix: semantic
vbetsch Jun 30, 2026
469060d
fix: semantic
vbetsch Jun 30, 2026
ebed675
test: add should_encryptWordHello and should_encryptWordWorld
vbetsch Jun 30, 2026
d98af3d
fix: semantic
vbetsch Jun 30, 2026
7907b5d
feat: app code
vbetsch Jun 30, 2026
2849837
refactor: fix names
vbetsch Jun 30, 2026
8a2ea32
test: should_handleUpperCaseInEncrypt
vbetsch Jun 30, 2026
85419ad
feat: handle upper case
vbetsch Jun 30, 2026
8b870f6
test: should_handleUnknownCharacters
vbetsch Jun 30, 2026
e6d2c4c
feat: handle unknown characters
vbetsch Jun 30, 2026
882a33a
refactor: create lowerCaseChar var
vbetsch Jun 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions src/main/java/io/github/vbetsch/codecracker/CodeCracker.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
14 changes: 3 additions & 11 deletions src/main/java/io/github/vbetsch/codecracker/Main.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,9 @@
package io.github.vbetsch.codecracker;

//TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
static void main() {
//TIP Press <shortcut actionId="ShowIntentionActions"/> 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 <shortcut actionId="Debug"/> to start debugging your code. We have set one <icon src="AllIcons.Debugger.Db_set_breakpoint"/> breakpoint
// for you, but you can always add more by pressing <shortcut actionId="ToggleLineBreakpoint"/>.
IO.println("i = " + i);
}
CodeCracker codeCracker = new CodeCracker();
IO.println(String.format("Hello world!"));
System.out.println("Encrypted : " + codeCracker.encryptString("Hello world!"));
}
}
Original file line number Diff line number Diff line change
@@ -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<Character, Character> 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<Character, Character> encryptions = invert(decryptions);

private static Map<Character, Character> invert(Map<Character, Character> map) {
Map<Character, Character> inverted = new HashMap<>();
for (Map.Entry<Character, Character> entry : map.entrySet()) {
inverted.put(entry.getValue(), entry.getKey());
}
return inverted;
}

public Map<Character, Character> getDecryptions() {
return decryptions;
}

public Map<Character, Character> getEncryptions() {
return encryptions;
}

public boolean containsDecryptionValue(char letter) {
return decryptions.containsValue(letter);
}
}
138 changes: 137 additions & 1 deletion src/test/java/io/github/vbetsch/codecracker/CodeCrackerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}