Search on the blog

2013年7月5日金曜日

Connect Fourソルバーを作る(2)

Connect Four既に解かれてる(お互いが最善手を指した場合の結果が分かっている)らしいです。
  • 先手の第一手が真ん中なら、先手必勝
  • 先手の第一手が真ん中の隣なら、引き分け
  • 先手の第一手が上記以外なら、後手必勝
なんと。

でも、数学的にもプログラミング的にも面白いテーマなのでもうちょっと続けようと思います。

今日はテストコードを追加しました。

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 件のコメント:

コメントを投稿