This code is part of the Tic Tac Toe Tutorial.
package org.limewire.ui.swing.tictactoe; import junit.framework.Test; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.lib.legacy.ClassImposteriser; import org.limewire.util.BaseTestCase; /** * Tests the various ways a Tic Tac Toe game could be won, along with * testing that draws and game not decided is returned. * <p> * <ol> * <li>Extend from <code>BaseTestCase</code>. * <li>Add a <code>suite</code> method which builds the test suite using. * <li>Precede each method you want to be called by the suite with 'test'. * <li>Use asserts. * <li>Use mocks when appropriate. * <p> * Additionally, this test class has two methods to show how to use mocks * in test cases. In reality, mocks aren't necessary for this case because * creating a <code>TicTacToeBoard</code> instance can be done using an initial * constructor. However, mocks are included for demonstration. */ public class TicTacToeBoardTest extends BaseTestCase { public TicTacToeBoardTest(String name) { super(name); } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static Test suite() { return buildTestSuite(TicTacToeBoardTest.class); } /** * @throws Exception if any error occurs. */ public void testXAcross() throws Exception { TicTacToeBoard x1 = new TicTacToeBoard('x', 'x', 'x', 'o', 'o', 'x', 'o', 'o', 'e'); assertEquals(x1.result(), TicTacToeWinner.ACROSS_1); TicTacToeBoard x2 = new TicTacToeBoard('o', 'x', 'x', 'x', 'x', 'x', 'o', 'o', 'e'); assertEquals(x2.result(), TicTacToeWinner.ACROSS_2); TicTacToeBoard x3 = new TicTacToeBoard('o', 'x', 'o', 'o', 'o', 'x', 'x', 'x', 'x'); assertEquals(x3.result(), TicTacToeWinner.ACROSS_3); } public void testOAcross() throws Exception { TicTacToeBoard o1 = new TicTacToeBoard('o', 'o', 'o', 'o', 'x', 'x', 'x', 'o', 'e'); assertEquals(o1.result(), TicTacToeWinner.ACROSS_1); TicTacToeBoard o2 = new TicTacToeBoard('o', 'x', 'x', 'o', 'o', 'o', 'x', 'o', 'e'); assertEquals(o2.result(), TicTacToeWinner.ACROSS_2); TicTacToeBoard o3 = new TicTacToeBoard('o', 'x', 'o', 'x', 'o', 'x', 'o', 'o', 'o'); assertEquals(o3.result(), TicTacToeWinner.ACROSS_3); } public void testXDown() throws Exception { TicTacToeBoard x1 = new TicTacToeBoard('x', 'x', 'o', 'x', 'o', 'x', 'x', 'o', 'e'); assertEquals(x1.result(), TicTacToeWinner.DOWN_1); TicTacToeBoard x2 = new TicTacToeBoard('o', 'x', 'o', 'o', 'x', 'o', 'x', 'x', 'e'); assertEquals(x2.result(), TicTacToeWinner.DOWN_2); TicTacToeBoard x3 = new TicTacToeBoard('o', 'x', 'x', 'x', 'o', 'x', 'o', 'o', 'x'); assertEquals(x3.result(), TicTacToeWinner.DOWN_3); } public void testODown() throws Exception { TicTacToeBoard o1 = new TicTacToeBoard('o', 'x', 'o', 'o', 'x', 'x', 'o', 'o', 'e'); assertEquals(o1.result(), TicTacToeWinner.DOWN_1); TicTacToeBoard o2 = new TicTacToeBoard('o', 'o', 'x', 'x', 'o', 'o', 'x', 'o', 'e'); assertEquals(o2.result(), TicTacToeWinner.DOWN_2); TicTacToeBoard o3 = new TicTacToeBoard('x', 'x', 'o', 'x', 'o', 'o', 'o', 'x', 'o'); assertEquals(o3.result(), TicTacToeWinner.DOWN_3); } public void testXDiagonal() throws Exception { //negative slope TicTacToeBoard x1 = new TicTacToeBoard('x', 'x', 'o', 'o', 'x', 'x', 'o', 'o', 'x'); assertEquals(x1.result(), TicTacToeWinner.DIAG_1); //positive slope TicTacToeBoard x2 = new TicTacToeBoard('o', 'x', 'x', 'o', 'x', 'o', 'x', 'o', 'e'); assertEquals(x2.result(), TicTacToeWinner.DIAG_2); } public void testODiagonal() throws Exception { //negative slope TicTacToeBoard o1 = new TicTacToeBoard('o', 'x', 'o', 'x', 'o', 'x', 'x', 'o', 'o'); assertEquals(o1.result(), TicTacToeWinner.DIAG_1); //positive slope TicTacToeBoard o2 = new TicTacToeBoard('x', 'x', 'o', 'x', 'o', 'o', 'o', 'x', 'e'); assertEquals(o2.result(), TicTacToeWinner.DIAG_2); } public void testDraw() throws Exception { TicTacToeBoard draw = new TicTacToeBoard('o', 'x', 'o', 'x', 'o', 'x', 'x', 'o', 'x'); assertEquals(draw.result(), TicTacToeWinner.DRAW); } public void testNoWinnerYet() throws Exception { TicTacToeBoard noOneYet = new TicTacToeBoard('o', 'x', 'o', 'x', 'o', 'x', 'x', 'o', 'e'); assertEquals(noOneYet.result(), TicTacToeWinner.NO_ONE_YET); //negative slope TicTacToeBoard x1 = new TicTacToeBoard('x', 'x', 'o', 'o', 'x', 'x', 'o', 'o', 'x'); assertNotEquals(x1.result(), TicTacToeWinner.NO_ONE_YET); } /** * You can mock the <code>TicTacToeBoard</code> in order to test whether * validating for a win is done correctly. * <p> * This mock sets up a board which has o winning through across 2. * <p> */ public void testWithMocksAcross() throws Exception { final TicTacToeBoard test = new TicTacToeBoard(); Mockery context = new Mockery(); context = new Mockery() { { setImposteriser(ClassImposteriser.INSTANCE); } }; final TicTacToeBoard board = context.mock(TicTacToeBoard.class); context.checking(new Expectations() { { char [] mockBoard = {'e', 'e', 'x', 'o', 'o', 'o', 'x', 'x', 'o' }; allowing(board); will(returnValue(mockBoard)); } }); assertEquals(test.result(board), TicTacToeWinner.ACROSS_2); } /** * Tests having a board without a winner and empty cells (marked as 'e') * returns as no one won yet (and not as a draw). */ public void testWithMocksNotYet() throws Exception { final TicTacToeBoard test = new TicTacToeBoard(); Mockery contextNotYet = new Mockery(); contextNotYet = new Mockery() { { setImposteriser(ClassImposteriser.INSTANCE); } }; final TicTacToeBoard board2 = contextNotYet.mock(TicTacToeBoard.class); contextNotYet.checking(new Expectations() { { char [] mockBoard2 = {'e', 'e', 'x', 'o', 'o', 'x', 'o', 'x', 'o' }; allowing(board2); will(returnValue(mockBoard2)); } }); assertEquals(test.result(board2), TicTacToeWinner.NO_ONE_YET); } }

