Skip to content

Commit bad3db3

Browse files
committed
Remove the RxJava dependency, unused instructions file & Update tests
1 parent b38f266 commit bad3db3

5 files changed

Lines changed: 91 additions & 128 deletions

File tree

exercises/practice/hangman/.docs/instructions.append.md

Lines changed: 0 additions & 21 deletions
This file was deleted.

exercises/practice/hangman/.meta/src/reference/java/Hangman.java

Lines changed: 31 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,29 @@
1-
import io.reactivex.Observable;
2-
31
import java.util.ArrayList;
42
import java.util.LinkedHashSet;
53
import java.util.List;
64
import java.util.Set;
75

86
class Hangman {
97

10-
Observable<Output> guess(
11-
String word,
12-
Observable<String> letters) {
13-
return letters
14-
.startWith("")
15-
.scan(Output.empty(), (state, letter) -> {
16-
if (state == null || state.state == null) {
17-
return createNewGame(word);
18-
}
19-
20-
if (letter.isEmpty()) {
21-
return state;
22-
}
23-
24-
if (state.state == Status.WIN) {
25-
throw new IllegalStateException("cannot guess after the game is won");
26-
}
27-
28-
if (state.state == Status.LOSE) {
29-
throw new IllegalStateException("cannot guess after the game is lost");
30-
}
31-
32-
return processNewLetter(state, letter);
33-
})
34-
.skip(1);
8+
Output guess(
9+
String word,
10+
List<String> letters) {
11+
12+
Output state = createNewGame(word);
13+
14+
for (String letter : letters) {
15+
if (state.state == Status.WIN) {
16+
throw new IllegalStateException("cannot guess after the game is won");
17+
}
18+
19+
if (state.state == Status.LOSE) {
20+
throw new IllegalStateException("cannot guess after the game is lost");
21+
}
22+
23+
state = processNewLetter(state, letter);
24+
}
25+
26+
return state;
3527
}
3628

3729
private static Output createNewGame(String word) {
@@ -58,12 +50,12 @@ private static Output processCorrectGuess(Output state, String letter) {
5850
Status newStatus = Output.isWin(state.word, newGuesses) ? Status.WIN : Status.ON_GOING;
5951

6052
return new Output(
61-
state.word,
62-
discovered,
63-
newGuesses,
64-
state.misses,
65-
state.parts,
66-
newStatus);
53+
state.word,
54+
discovered,
55+
newGuesses,
56+
state.misses,
57+
state.parts,
58+
newStatus);
6759
}
6860

6961
private static Output processIncorrectGuess(Output state, String letter) {
@@ -78,12 +70,12 @@ private static Output processIncorrectGuess(Output state, String letter) {
7870
Status newStatus = newParts.size() >= order.length ? Status.LOSE : Status.ON_GOING;
7971

8072
return new Output(
81-
state.word,
82-
state.maskedWord,
83-
state.guesses,
84-
newMisses,
85-
newParts,
86-
newStatus);
73+
state.word,
74+
state.maskedWord,
75+
state.guesses,
76+
newMisses,
77+
newParts,
78+
newStatus);
8779
}
8880

8981
static Part[] order = Part.values();

exercises/practice/hangman/.meta/src/reference/java/Output.java

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ class Output {
1919
public final int remainingFailures;
2020

2121
Output(
22-
final String word,
23-
final String maskedWord,
24-
final Set<String> guesses,
25-
final Set<String> misses,
26-
final List<Part> parts,
27-
final Status state) {
22+
final String word,
23+
final String maskedWord,
24+
final Set<String> guesses,
25+
final Set<String> misses,
26+
final List<Part> parts,
27+
final Status state) {
2828
this.word = word;
2929
this.maskedWord = maskedWord;
3030
this.guesses = Set.copyOf(guesses);
@@ -36,22 +36,22 @@ class Output {
3636

3737
static Output empty() {
3838
return new Output(
39-
null,
40-
null,
41-
Collections.emptySet(),
42-
Collections.emptySet(),
43-
Collections.emptyList(),
44-
null);
39+
null,
40+
null,
41+
Collections.emptySet(),
42+
Collections.emptySet(),
43+
Collections.emptyList(),
44+
null);
4545
}
4646

4747
static Output initialState(final String secret) {
4848
return new Output(
49-
secret,
50-
getGuessedWord(secret, Collections.emptySet()),
51-
new LinkedHashSet<>(),
52-
new LinkedHashSet<>(),
53-
new ArrayList<>(),
54-
Status.ON_GOING);
49+
secret,
50+
getGuessedWord(secret, Collections.emptySet()),
51+
new LinkedHashSet<>(),
52+
new LinkedHashSet<>(),
53+
new ArrayList<>(),
54+
Status.ON_GOING);
5555
}
5656

5757
boolean isLetterAlreadyPlayed(final String letter) {
@@ -64,15 +64,15 @@ boolean isLetterInSecret(final String letter) {
6464

6565
static String getGuessedWord(String secret, Set<String> letters) {
6666
return secret.chars()
67-
.mapToObj(i -> String.valueOf((char) i))
68-
.map(c -> letters.contains(c) ? c : "_")
69-
.collect(joining());
67+
.mapToObj(i -> String.valueOf((char) i))
68+
.map(c -> letters.contains(c) ? c : "_")
69+
.collect(joining());
7070
}
7171

7272
static boolean isWin(String secret, Set<String> guessedLetters) {
7373
return secret.chars()
74-
.mapToObj(i -> String.valueOf((char) i))
75-
.allMatch(guessedLetters::contains);
74+
.mapToObj(i -> String.valueOf((char) i))
75+
.allMatch(guessedLetters::contains);
7676
}
7777

7878
static boolean isLoss(List<Part> parts) {
@@ -82,13 +82,13 @@ static boolean isLoss(List<Part> parts) {
8282
@Override
8383
public String toString() {
8484
return "Output{" +
85-
"secret='" + word + '\'' +
86-
", discovered='" + maskedWord + '\'' +
87-
", guess=" + guesses +
88-
", misses=" + misses +
89-
", parts=" + parts +
90-
", status=" + state +
91-
", remainingFailures=" + remainingFailures +
92-
'}';
85+
"secret='" + word + '\'' +
86+
", discovered='" + maskedWord + '\'' +
87+
", guess=" + guesses +
88+
", misses=" + misses +
89+
", parts=" + parts +
90+
", status=" + state +
91+
", remainingFailures=" + remainingFailures +
92+
'}';
9393
}
9494
}

exercises/practice/hangman/src/main/java/Hangman.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import io.reactivex.Observable;
1+
import java.util.List;
22

33
class Hangman {
44

5-
Observable<Output> guess(String word, Observable<String> letters) {
5+
Output guess(String word, List<String> letters) {
66
throw new UnsupportedOperationException("Delete this statement and write your own implementation.");
77
}
88

exercises/practice/hangman/src/test/java/HangmanTest.java

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import io.reactivex.Observable;
2-
31
import org.junit.jupiter.api.BeforeEach;
42
import org.junit.jupiter.api.Disabled;
53
import org.junit.jupiter.api.DisplayName;
64
import org.junit.jupiter.api.Test;
75

6+
import java.util.List;
7+
88
import static org.junit.jupiter.api.Assertions.assertEquals;
99
import static org.junit.jupiter.api.Assertions.assertThrows;
1010

@@ -20,9 +20,7 @@ public void init() {
2020
@Test
2121
@DisplayName("Initially 9 failures are allowed and no letters are guessed")
2222
void initially9FailuresAreAllowedAndNoLettersAreGuessed() {
23-
Output result = hangman
24-
.guess("loot", Observable.empty())
25-
.blockingLast();
23+
Output result = hangman.guess("loot", List.of());
2624

2725
assertEquals(Status.ON_GOING, result.state);
2826
assertEquals("____", result.maskedWord);
@@ -33,9 +31,10 @@ void initially9FailuresAreAllowedAndNoLettersAreGuessed() {
3331
@Test
3432
@DisplayName("After 10 failures the game is over")
3533
void after10FailuresTheGameIsOver() {
36-
Output result = hangman
37-
.guess("loot", Observable.fromArray("a", "b", "c", "d", "e", "f", "g", "h", "i", "j"))
38-
.blockingLast();
34+
Output result = hangman.guess(
35+
"loot",
36+
List.of("a", "b", "c", "d", "e", "f", "g", "h", "i", "j")
37+
);
3938

4039
assertEquals(Status.LOSE, result.state);
4140
assertEquals("____", result.maskedWord);
@@ -46,9 +45,10 @@ void after10FailuresTheGameIsOver() {
4645
@Test
4746
@DisplayName("Losing with several correct guesses")
4847
void losingWithSeveralCorrectGuesses() {
49-
Output result = hangman
50-
.guess("loot", Observable.fromArray("t", "o", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j"))
51-
.blockingLast();
48+
Output result = hangman.guess(
49+
"loot",
50+
List.of("t", "o", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j")
51+
);
5252

5353
assertEquals(Status.LOSE, result.state);
5454
assertEquals("_oot", result.maskedWord);
@@ -59,9 +59,7 @@ void losingWithSeveralCorrectGuesses() {
5959
@Test
6060
@DisplayName("Feeding a correct letter removes underscores")
6161
void feedingCorrectLetterRemovesUnderscores() {
62-
Output result = hangman
63-
.guess("loot", Observable.fromArray("t"))
64-
.blockingLast();
62+
Output result = hangman.guess("loot", List.of("t"));
6563

6664
assertEquals(Status.ON_GOING, result.state);
6765
assertEquals("___t", result.maskedWord);
@@ -72,9 +70,7 @@ void feedingCorrectLetterRemovesUnderscores() {
7270
@Test
7371
@DisplayName("Feeding a correct letter twice counts as a failure")
7472
void feedingCorrectLetterTwiceCountAsASuccess() {
75-
Output result = hangman
76-
.guess("loot", Observable.fromArray("t", "t"))
77-
.blockingLast();
73+
Output result = hangman.guess("loot", List.of("t", "t"));
7874

7975
assertEquals(Status.ON_GOING, result.state);
8076
assertEquals("___t", result.maskedWord);
@@ -85,9 +81,7 @@ void feedingCorrectLetterTwiceCountAsASuccess() {
8581
@Test
8682
@DisplayName("Guessing a repeated letter reveals all instances")
8783
void guessingARepeatedLetterRevealsAllInstances() {
88-
Output result = hangman
89-
.guess("loot", Observable.fromArray("t", "t", "o"))
90-
.blockingLast();
84+
Output result = hangman.guess("loot", List.of("t", "t", "o"));
9185

9286
assertEquals(Status.ON_GOING, result.state);
9387
assertEquals("_oot", result.maskedWord);
@@ -98,9 +92,7 @@ void guessingARepeatedLetterRevealsAllInstances() {
9892
@Test
9993
@DisplayName("Getting all the letters right makes for a win")
10094
void gettingAllTheLettersRightMakesForASuccess() {
101-
Output result = hangman
102-
.guess("loot", Observable.fromArray("t", "t", "o", "l"))
103-
.blockingLast();
95+
Output result = hangman.guess("loot", List.of("t", "t", "o", "l"));
10496

10597
assertEquals(Status.WIN, result.state);
10698
assertEquals("loot", result.maskedWord);
@@ -111,9 +103,10 @@ void gettingAllTheLettersRightMakesForASuccess() {
111103
@Test
112104
@DisplayName("Winning on the last guess is still a win")
113105
void winningOnTheLastGuessIsStillAWin() {
114-
Output result = hangman
115-
.guess("loot", Observable.fromArray("a", "b", "c", "d", "e", "f", "g", "h", "i", "t", "o", "l"))
116-
.blockingLast();
106+
Output result = hangman.guess(
107+
"loot",
108+
List.of("a", "b", "c", "d", "e", "f", "g", "h", "i", "t", "o", "l")
109+
);
117110

118111
assertEquals(Status.WIN, result.state);
119112
assertEquals("loot", result.maskedWord);
@@ -125,10 +118,11 @@ void winningOnTheLastGuessIsStillAWin() {
125118
@DisplayName("Guessing after a lose is error")
126119
void guessingAfterALoseIsError() {
127120
IllegalStateException ex = assertThrows(
128-
IllegalStateException.class,
129-
() -> hangman
130-
.guess("loot", Observable.fromArray("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"))
131-
.blockingLast()
121+
IllegalStateException.class,
122+
() -> hangman.guess(
123+
"loot",
124+
List.of("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k")
125+
)
132126
);
133127

134128
assertEquals("cannot guess after the game is lost", ex.getMessage());
@@ -139,12 +133,10 @@ void guessingAfterALoseIsError() {
139133
@DisplayName("Guessing after a win is error")
140134
void guessingAfterAWinIsError() {
141135
IllegalStateException ex = assertThrows(
142-
IllegalStateException.class,
143-
() -> hangman
144-
.guess("loot", Observable.fromArray("t", "o", "l", "l"))
145-
.blockingLast()
136+
IllegalStateException.class,
137+
() -> hangman.guess("loot", List.of("t", "o", "l", "l"))
146138
);
147139

148140
assertEquals("cannot guess after the game is won", ex.getMessage());
149141
}
150-
}
142+
}

0 commit comments

Comments
 (0)