blob: 0ad59ae0adfb655e5c1a596534f9965ff3ca4a76 [file] [log] [blame]
/*
* $Id$
* $Revision$
* $Date$
*
* ====================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package wicket.examples.hangman;
import java.util.Iterator;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestSuite;
import net.sourceforge.jwebunit.WebTestCase;
import nl.openedge.util.jetty.JettyDecorator;
/**
* Testcase for the <code>Game</code> class.
*
* @author Chris Turner
* @version 1.0
*/
public class HangManTest extends WebTestCase
{
/**
* Create the test case.
*
* @param message
* The test name
*/
public HangManTest(String message)
{
super(message);
}
/**
* Tests the hangman class directly for a winning game.
*
* @throws Exception
*/
public void testHangmanWinGame() throws Exception
{
Game hangman = new Game();
hangman.newGame(5, new WordGenerator(new String[] { "testing" }));
Assert.assertEquals(5, hangman.getGuessesRemaining());
Assert.assertFalse(hangman.isWon());
Assert.assertFalse(hangman.isLost());
doGuessTest(hangman, 'a', false);
Assert.assertEquals(4, hangman.getGuessesRemaining());
Assert.assertFalse(hangman.isWon());
Assert.assertFalse(hangman.isLost());
guess(hangman, 'a');
Assert.assertEquals(4, hangman.getGuessesRemaining());
Assert.assertFalse(hangman.isWon());
Assert.assertFalse(hangman.isLost());
doGuessTest(hangman, 't', true);
Assert.assertEquals(4, hangman.getGuessesRemaining());
Assert.assertFalse(hangman.isWon());
Assert.assertFalse(hangman.isLost());
doGuessTest(hangman, 'e', true);
Assert.assertEquals(4, hangman.getGuessesRemaining());
Assert.assertFalse(hangman.isWon());
Assert.assertFalse(hangman.isLost());
doGuessTest(hangman, 's', true);
Assert.assertEquals(4, hangman.getGuessesRemaining());
Assert.assertFalse(hangman.isWon());
Assert.assertFalse(hangman.isLost());
doGuessTest(hangman, 'i', true);
Assert.assertEquals(4, hangman.getGuessesRemaining());
Assert.assertFalse(hangman.isWon());
Assert.assertFalse(hangman.isLost());
doGuessTest(hangman, 'n', true);
Assert.assertEquals(4, hangman.getGuessesRemaining());
Assert.assertFalse(hangman.isWon());
Assert.assertFalse(hangman.isLost());
doGuessTest(hangman, 'g', true);
Assert.assertEquals(4, hangman.getGuessesRemaining());
Assert.assertTrue(hangman.isWon());
Assert.assertFalse(hangman.isLost());
}
private Letter letter(Game hangman, char c)
{
for (Iterator iter = hangman.getLetters().iterator(); iter.hasNext();)
{
Letter letter = (Letter)iter.next();
if (letter.asString().equalsIgnoreCase(Character.toString(c)))
{
return letter;
}
}
return null;
}
private boolean guess(Game hangman, char c)
{
return hangman.guess(letter(hangman, c));
}
/**
* Tests the hangman class directly for a lost game.
*
* @throws Exception
*/
public void testHangmanLoseGame() throws Exception
{
Game hangman = new Game();
hangman.newGame(2, new WordGenerator(new String[] { "foo" }));
Assert.assertEquals(2, hangman.getGuessesRemaining());
Assert.assertFalse(hangman.isWon());
Assert.assertFalse(hangman.isLost());
doGuessTest(hangman, 'z', false);
Assert.assertEquals(1, hangman.getGuessesRemaining());
Assert.assertFalse(hangman.isWon());
Assert.assertFalse(hangman.isLost());
doGuessTest(hangman, 'v', false);
Assert.assertEquals(0, hangman.getGuessesRemaining());
Assert.assertFalse(hangman.isWon());
Assert.assertTrue(hangman.isLost());
}
/**
* Tests the webapplication for a successful match.
*/
public void testHangmanSuccessWebGame()
{
getTestContext().setBaseUrl("http://localhost:8098/wicket-examples");
beginAt("/hangman?word=hangman");
assertTitleEquals("Wicket Examples - hangman");
assertLinkPresent("start");
clickLink("start");
assertTitleEquals("Wicket Examples - hangman");
assertTextPresent("guesses remaining");
assertElementPresent("guessesRemaining");
assertTextInElement("guessesRemaining", "5");
clickLink("letter_f");
assertElementPresent("guessesRemaining");
assertTextInElement("guessesRemaining", "4");
clickLink("letter_h");
assertElementPresent("guessesRemaining");
assertTextInElement("guessesRemaining", "4");
clickLink("letter_a");
clickLink("letter_n");
clickLink("letter_g");
clickLink("letter_m");
assertTextPresent("Congratulations! You guessed that the word was ");
}
/**
* Tests the webapplication for an unsuccessful match.
*/
public void testHangmanFailureWebGame()
{
getTestContext().setBaseUrl("http://localhost:8098/wicket-examples");
beginAt("/hangman?word=hangman");
assertTitleEquals("Wicket Examples - hangman");
assertLinkPresent("start");
clickLink("start");
assertTitleEquals("Wicket Examples - hangman");
assertTextPresent("guesses remaining");
assertElementPresent("guessesRemaining");
assertTextInElement("guessesRemaining", "5");
clickLink("letter_f");
assertElementPresent("guessesRemaining");
assertTextInElement("guessesRemaining", "4");
assertLinkNotPresent("letter_f");
clickLink("letter_x");
assertTextInElement("guessesRemaining", "3");
clickLink("letter_e");
assertTextInElement("guessesRemaining", "2");
clickLink("letter_t");
assertTextInElement("guessesRemaining", "1");
clickLink("letter_v");
assertTextPresent("Bad luck. You failed to guess that the word was");
}
/**
* Performs a guess.
* @param hangman
* @param c
* @param expected
*/
private void doGuessTest(Game hangman, char c, boolean expected)
{
Assert.assertFalse(letter(hangman, c).isGuessed());
Assert.assertEquals(expected, guess(hangman, c));
Assert.assertTrue(letter(hangman, c).isGuessed());
}
/**
* Creates the testsuite.
*
* @return the testsuite.
*/
public static Test suite()
{
TestSuite suite = new TestSuite();
suite.addTestSuite(HangManTest.class);
JettyDecorator deco = new JettyDecorator(suite);
deco.setPort(8098);
deco.setWebappContextRoot("src/webapp");
deco.setContextPath("/wicket-examples");
return deco;
}
}