- 先手の第一手が真ん中なら、先手必勝
- 先手の第一手が真ん中の隣なら、引き分け
- 先手の第一手が上記以外なら、後手必勝
なんと。
でも、数学的にもプログラミング的にも面白いテーマなのでもうちょっと続けようと思います。
GameクラスのwinOfというメソッドをテストしようとしましたが、winOfはprivateなメソッド。
privateなメソッドをテストしたいとき、どうするか?
JUnitかdjUnitに便利な機能があるかなと思いましたが見つけられなかったので、自前でリフレクションを使ってテストすることにしました。
こんな感じです。
package com.kenjih.connectfour.test.games; import static org.junit.Assert.*; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.kenjih.connectfour.main.games.Game; import com.kenjih.connectfour.main.players.RandomPlayer; public class TestGame { Game game; @Before public void setUp() throws Exception { game = new Game(new RandomPlayer(), new RandomPlayer()); } @After public void tearDown() throws Exception { } private void setBoard(char[][] board) throws Exception { Field field = game.getClass().getDeclaredField("board"); field.setAccessible(true); field.set(game, board); } private boolean winOf(char stone) throws Exception { Method method = game.getClass().getDeclaredMethod("winOf", char.class); method.setAccessible(true); return (Boolean) method.invoke(game, stone); } @Test public void testWinOf_1() throws Exception { char[][] board = { ".......".toCharArray(), ".......".toCharArray(), "..XOOO.".toCharArray(), "..XXOO.".toCharArray(), "..X.X..".toCharArray(), ".......".toCharArray() }; setBoard(board); assertEquals(false, winOf('O')); assertEquals(false, winOf('X')); } @Test public void testWinOf_2() throws Exception { char[][] board = { ".......".toCharArray(), ".......".toCharArray(), "..O....".toCharArray(), "..O....".toCharArray(), "..O....".toCharArray(), "..O....".toCharArray() }; setBoard(board); assertEquals(true, winOf('O')); assertEquals(false, winOf('X')); } // other test cases follow. }
0 件のコメント:
コメントを投稿