package com.github.donkirkby.vograbulary.anagrams; import static com.github.donkirkby.vograbulary.Assert.*; import static org.junit.Assert.*; import java.util.List; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import com.github.donkirkby.vograbulary.ultraghost.WordList; public class AnagramsGameModelTest { @Rule public final ExpectedException thrown = ExpectedException.none(); @Test public void reveal() { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setDeck("ERFTOP"); // EXEC char letter1 = model.revealLetter(); String unclaimedLetters1 = model.getUnclaimedLetters(); char letter2 = model.revealLetter(); String unclaimedLetters2 = model.getUnclaimedLetters(); // VERIFY assertEquals("letter 1", 'E', letter1); assertEquals("unclaimed letters 1", "E", unclaimedLetters1); assertEquals("letter 2", 'R', letter2); assertEquals("unclaimed letters 2", "ER", unclaimedLetters2); } public void testEmpty() { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setDeck("E"); // EXEC boolean isEmptyBefore = model.isDeckEmpty(); model.revealLetter(); boolean isEmptyAfter = model.isDeckEmpty(); // VERIFY assertFalse("empty before", isEmptyBefore); assertTrue("empty after", isEmptyAfter); } public void testRestart() { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setDeck("ERFTOP"); // EXEC model.revealLetter(); model.getUnclaimedLetters(); model.setDeck("XYZ"); char letter = model.revealLetter(); String unclaimedLetters = model.getUnclaimedLetters(); // VERIFY assertEquals("letter", 'X', letter); assertEquals("unclaimed letters", "X", unclaimedLetters); } public void testMakeWord() throws InvalidWordException { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList( "FORE", "GORE", "PORE", "FORK")); model.setDeck("ERFGOP"); AnagramsPlayer player1 = new AnagramsPlayer(); AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //E model.revealLetter(); //R model.revealLetter(); //F model.revealLetter(); //G model.revealLetter(); //O model.makeWord("FORE", player2); String unclaimedLetters = model.getUnclaimedLetters(); int player1Score = player1.getScore(); int player2Score = player2.getScore(); // VERIFY assertEquals("unclaimed letters", "G", unclaimedLetters); assertEquals("score 1", 0, player1Score); assertEquals("score 2", 4, player2Score); } public void testMakeGoodWordAfterUnavailableWord() throws Exception { // SETUP String expectedMessage = "The letter K is not available to make FORK."; final AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList( "FORE", "GORE", "PORE", "FORK")); model.setDeck("ERFGOP"); final AnagramsPlayer player1 = new AnagramsPlayer(); final AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //E model.revealLetter(); //R model.revealLetter(); //F model.revealLetter(); //G model.revealLetter(); //O InvalidWordException ex = makeInvalidWord(model, "FORK", player2); model.makeWord("FORE", player2); // VERIFY assertEquals("message", expectedMessage, ex.getMessage()); } private InvalidWordException makeInvalidWord( final AnagramsGameModel model, final String word, final AnagramsPlayer player) throws Exception { try { model.makeWord(word, player); fail("should have thrown InvalidWordException"); return null; } catch (InvalidWordException ex) { return ex; } } private InvalidWordException changeInvalidWord( final AnagramsGameModel model, final String oldWord, final String newWord, final AnagramsPlayer player) throws Exception { try { model.changeWord(oldWord, newWord, player); fail("should have thrown InvalidWordException"); return null; } catch (InvalidWordException ex) { return ex; } } public void testChangeWord() throws InvalidWordException { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList(new String[] { "FORE", "FORGE", "FORK", "GORE", "PORE", })); model.setDeck("ERFGOPN"); AnagramsPlayer player1 = new AnagramsPlayer(); AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //E model.revealLetter(); //R model.revealLetter(); //F model.revealLetter(); //G model.revealLetter(); //O model.revealLetter(); //P model.makeWord("FORE", player2); model.changeWord("FORE", "FORGE", player1); String unclaimedLetters = model.getUnclaimedLetters(); int player1Score = player1.getScore(); int player2Score = player2.getScore(); // VERIFY assertEquals("unclaimed letters", "P", unclaimedLetters); assertEquals("score 1", 5, player1Score); assertEquals("score 2", 0, player2Score); } public void testChangeUnusedWord() throws Exception { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList(new String[] { "FORE", "FORGE", "FORK", "GORE", "PORE", })); model.setDeck("ERFGOPN"); AnagramsPlayer player1 = new AnagramsPlayer(); AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //E model.revealLetter(); //R model.revealLetter(); //F model.revealLetter(); //G model.revealLetter(); //O model.revealLetter(); //P InvalidWordException ex = changeInvalidWord(model, "FORE", "FORGE", player1); String unclaimedLetters = model.getUnclaimedLetters(); int player1Score = player1.getScore(); // VERIFY assertEquals("message", "FORE is not a claimed word.", ex.getMessage()); assertEquals("unclaimed letters", "ERFGOP", unclaimedLetters); assertEquals("score 1", 0, player1Score); } public void testChangeToUnavailableWord() throws Exception { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList(new String[] { "FORE", "FORCE", "FORGE", "FORK", "GORE", "PORE", })); model.setDeck("ERFGOPN"); AnagramsPlayer player1 = new AnagramsPlayer(); AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //E model.revealLetter(); //R model.revealLetter(); //F model.revealLetter(); //G model.revealLetter(); //O model.revealLetter(); //P model.makeWord("FORE", player1); InvalidWordException ex = changeInvalidWord(model, "FORE", "FORCE", player1); model.changeWord("FORE", "FORGE", player1); String unclaimedLetters = model.getUnclaimedLetters(); int player1Score = player1.getScore(); // VERIFY assertEquals( "message", "C is not available to make FORCE.", ex.getMessage()); assertEquals("unclaimed letters", "P", unclaimedLetters); assertEquals("score 1", 5, player1Score); } public void testChangeToUnknownWord() throws Exception { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList(new String[] { "FORE", "FORCE", "FORGE", "FORK", "GORE", "PORE", })); model.setDeck("ERFGOPN"); AnagramsPlayer player1 = new AnagramsPlayer(); AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //E model.revealLetter(); //R model.revealLetter(); //F model.revealLetter(); //G model.revealLetter(); //O model.revealLetter(); //P model.makeWord("FORE", player1); InvalidWordException ex = changeInvalidWord(model, "FORE", "GROFE", player1); model.changeWord("FORE", "FORGE", player1); String unclaimedLetters = model.getUnclaimedLetters(); int player1Score = player1.getScore(); // VERIFY assertEquals( "message", "GROFE is not in the dictionary.", ex.getMessage()); assertEquals("unclaimed letters", "P", unclaimedLetters); assertEquals("score 1", 5, player1Score); } public void testReuseWord() throws Exception { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList(new String[] { "RATS", "STAR", "STARS", "START", })); model.setDeck("STARST"); AnagramsPlayer player1 = new AnagramsPlayer(); AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //S model.revealLetter(); //T model.revealLetter(); //A model.revealLetter(); //R model.revealLetter(); //S model.revealLetter(); //T model.makeWord("RATS", player1); model.changeWord("RATS", "STAR", player2); InvalidWordException ex = changeInvalidWord(model, "STAR", "RATS", player1); // VERIFY assertEquals( "message", "RATS has already been played.", ex.getMessage()); } public void testIncompleteChange() throws Exception { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList(new String[] { "FORE", "FORGE", "FORK", "GORE", "PORE", })); model.setDeck("ERFGOPN"); AnagramsPlayer player1 = new AnagramsPlayer(); AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //E model.revealLetter(); //R model.revealLetter(); //F model.revealLetter(); //G model.revealLetter(); //O model.revealLetter(); //P model.makeWord("FORE", player1); InvalidWordException ex = changeInvalidWord(model, "FORE", "PORE", player1); model.changeWord("FORE", "FORGE", player1); String unclaimedLetters = model.getUnclaimedLetters(); int player1Score = player1.getScore(); // VERIFY assertEquals( "message", "Some letters of FORE were not used in PORE.", ex.getMessage()); assertEquals("unclaimed letters", "P", unclaimedLetters); assertEquals("score 1", 5, player1Score); } public void testShortWord() throws Exception { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList(new String[] { "FORE", "FORGE", "FORK", "GORE", "PORE", })); model.setDeck("ERFGOPN"); AnagramsPlayer player1 = new AnagramsPlayer(); AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //E model.revealLetter(); //R model.revealLetter(); //F model.revealLetter(); //G model.revealLetter(); //O model.revealLetter(); //P InvalidWordException ex = makeInvalidWord(model, "FOR", player1); // VERIFY assertEquals( "message", "Words must be at least 4 letters long.", ex.getMessage()); } public void testMakeUnknownWord() throws Exception { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList(new String[] { "FORE", "GORE", "PORE", "FORK" })); model.setDeck("ERFGOP"); AnagramsPlayer player1 = new AnagramsPlayer(); AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //E model.revealLetter(); //R model.revealLetter(); //F model.revealLetter(); //G model.revealLetter(); //O InvalidWordException ex = makeInvalidWord(model, "FORG", player2); String unclaimedLetters = model.getUnclaimedLetters(); int player1Score = player1.getScore(); int player2Score = player2.getScore(); // VERIFY assertEquals( "message", "FORG is not in the dictionary.", ex.getMessage()); assertEquivalent("unclaimed letters", "ERFGO", unclaimedLetters); assertEquals("score 1", 0, player1Score); assertEquals("score 2", 0, player2Score); } public void testMakeUnavailableWord() throws Exception { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList(new String[] { "FORE", "GORE", "PORE", "FORK" })); model.setDeck("ERFGOP"); AnagramsPlayer player1 = new AnagramsPlayer(); AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //E model.revealLetter(); //R model.revealLetter(); //F model.revealLetter(); //G model.revealLetter(); //O InvalidWordException ex = makeInvalidWord(model, "FORK", player2); String unclaimedLetters = model.getUnclaimedLetters(); int player1Score = player1.getScore(); int player2Score = player2.getScore(); // VERIFY assertEquals( "message", "The letter K is not available to make FORK.", ex.getMessage()); assertEquivalent("unclaimed letters", "ERFGO", unclaimedLetters); assertEquals("score 1", 0, player1Score); assertEquals("score 2", 0, player2Score); } public void testGetWordsFromMake() throws InvalidWordException { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList(new String[] { "FORE", "GORE", "PORE", "FORK" })); model.setDeck("ERFGOP"); AnagramsPlayer player1 = new AnagramsPlayer(); AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //E model.revealLetter(); //R model.revealLetter(); //F model.revealLetter(); //G model.revealLetter(); //O model.makeWord("FORE", player2); List<AnagramsPlayer> players = model.getPlayers(); List<String> player1Words = model.getWords(player1); List<String> player2Words = model.getWords(player2); // VERIFY assertTrue("player 1 found", players.contains(player1)); assertTrue("player 2 found", players.contains(player2)); assertEquals("player count", 2, players.size()); assertEquals("player 1 word count", 0, player1Words.size()); assertEquals("player 2 word count", 1, player2Words.size()); assertEquals("player 2 word", "FORE", player2Words.get(0)); } public void testGetWordsFromChange() throws InvalidWordException { // SETUP AnagramsGameModel model = new AnagramsGameModel(); model.setWordList(new WordList(new String[] { "FORE", "FORGE", "GORE", "PORE", "FORK" })); model.setDeck("ERFGOP"); AnagramsPlayer player1 = new AnagramsPlayer(); AnagramsPlayer player2 = new AnagramsPlayer(); model.addPlayer(player1); model.addPlayer(player2); // EXEC model.revealLetter(); //E model.revealLetter(); //R model.revealLetter(); //F model.revealLetter(); //G model.revealLetter(); //O model.makeWord("FORE", player2); model.changeWord("FORE", "FORGE", player1); List<String> player1Words = model.getWords(player1); List<String> player2Words = model.getWords(player2); // VERIFY assertEquals("player 1 word count", 1, player1Words.size()); assertEquals("player 2 word count", 0, player2Words.size()); assertEquals("player 1 word", "FORGE", player1Words.get(0)); } }