// TextParserTest.java
package net.sf.gogui.text;
import java.io.Reader;
import java.io.StringReader;
import net.sf.gogui.go.Board;
import net.sf.gogui.go.GoColor;
import static net.sf.gogui.go.GoColor.BLACK;
import static net.sf.gogui.go.GoColor.WHITE;
import static net.sf.gogui.go.GoColor.EMPTY;
import net.sf.gogui.go.GoPoint;
public final class TextParserTest
extends junit.framework.TestCase
{
public static void main(String args[])
{
junit.textui.TestRunner.run(suite());
}
public static junit.framework.Test suite()
{
return new junit.framework.TestSuite(TextParserTest.class);
}
public void testParse()
{
parse(" + + O + O O # # + \n" +
" + + O + O O # # + \n" +
" + # O O O O O # # \n" +
" + # + O O # # # + \n" +
" + # O O # + # O + \n" +
" + + O # # + # + + \n" +
" + O O O # + + # + \n" +
" # O O # # # # + + \n" +
" + O O O # # # + + \n");
checkSize(9);
checkColor(0, 0, EMPTY);
checkColor(0, 1, BLACK);
checkColor(0, 2, EMPTY);
checkColor(1, 0, WHITE);
checkColor(1, 1, WHITE);
checkColor(1, 2, WHITE);
checkColor(2, 0, WHITE);
checkColor(2, 1, WHITE);
checkColor(2, 2, WHITE);
checkColor(3, 0, WHITE);
checkColor(3, 1, BLACK);
checkColor(3, 2, WHITE);
checkColor(3, 3, BLACK);
}
public void testHeightGreaterWidth()
{
parse(". X . .\n" +
"O . . .\n" +
". . . .\n" +
". . . .\n" +
". . . .\n" +
". . . .\n");
checkSize(6);
checkColor(0, 4, WHITE);
checkColor(1, 5, BLACK);
}
public void testWidthGreaterHeight()
{
parse(". X . . . .\n" +
"O . . . . .\n");
checkSize(6);
checkColor(0, 0, WHITE);
checkColor(1, 1, BLACK);
}
/** Test example from GNU Go documentation width row width increasing. */
public void testWidthIncreasing()
{
parse("@@@@@\n" +
"@OOO@\n" +
"@O.OO@\n" +
"@@..O@\n" +
"@@OO@@\n" +
"@@@@@\n");
checkSize(6);
checkColor(0, 5, BLACK);
checkColor(5, 5, EMPTY);
}
public void testParseGnuGo()
{
parse(" A B C D E F G H J K L M N O P Q R S T\n" +
"19 . . . . . . O O X . . . . . . . . . . 19\n" +
"18 . O O . . O O X . X . X O . O X . . . 18\n" +
"17 . X X O O . X X . . X . O . . X . . . 17\n" +
"16 . X . X . O . . X + . . . . X + . . . 16\n" +
"15 . O X . O . . O . . X . O . . . X . . 15\n" +
"14 . O . X O . . . . . . . . . . . . . . 14\n" +
"13 . . . X O . . O . . X O O . X . . . . 13\n" +
"12 . . O X . . . . . . X X . O X . . . . 12\n" +
"11 . . O X . O . O . . . X O O O X . . . 11 WHITE (O) has captured 1 stones\n" +
"10 . . O X . . . . O + . X X X O + . . . 10 BLACK (X) has captured 2 stones\n" +
" 9 . . O X . . . . . . . X O . . . X . . 9\n" +
" 8 . O O X . . . . X X X X O O . X . . . 8\n" +
" 7 . X X X . . X . . O O X . O X . X . . 7\n" +
" 6 . . . . . . . O . . . O X X . X X X . 6\n" +
" 5 X X X X . . O . . . O O X X X O O X X 5\n" +
" 4 O X . O . . . . . + . X O X O + . O O 4\n" +
" 3 O O O . . . O . . O . . O O . O . . . 3\n" +
" 2 . . . . . . . . . . . . . . O . . . . 2\n" +
" 1 . . . . . . . . . . . . . . . . . . . 1\n" +
" A B C D E F G H J K L M N O P Q R S T\n");
checkSize(19);
checkColor(0, 0, EMPTY);
checkColor(0, 1, EMPTY);
checkColor(0, 2, WHITE);
checkColor(0, 3, WHITE);
checkColor(0, 4, BLACK);
checkColor(0, 5, EMPTY);
}
/** Test parsing if long lines were wrapped. */
public void testParseGnuGoLineWrap()
{
parse(" A B C D E F G H J K L M N O P Q R S T\n" +
"19 . . . . . . O O X . . . . . . . . . . 19\n" +
"18 . O O . . O O X . X . X O . O X . . . 18\n" +
"17 . X X O O . X X . . X . O . . X . . . 17\n" +
"16 . X . X . O . . X + . . . . X + . . . 16\n" +
"15 . O X . O . . O . . X . O . . . X . . 15\n" +
"14 . O . X O . . . . . . . . . . . . . . 14\n" +
"13 . . . X O . . O . . X O O . X . . . . 13\n" +
"12 . . O X . . . . . . X X . O X . . . . 12\n" +
"11 . . O X . O . O . . . X O O O X . . . 11 WHITE (O) has captured 1\n" +
"stones\n" +
"10 . . O X . . . . O + . X X X O + . . . 10 BLACK (X) has captured 2\n" +
"stones\n" +
" 9 . . O X . . . . . . . X O . . . X . . 9\n" +
" 8 . O O X . . . . X X X X O O . X . . . 8\n" +
" 7 . X X X . . X . . O O X . O X . X . . 7\n" +
" 6 . . . . . . . O . . . O X X . X X X . 6\n" +
" 5 X X X X . . O . . . O O X X X O O X X 5\n" +
" 4 O X . O . . . . . + . X O X O + . O O 4\n" +
" 3 O O O . . . O . . O . . O O . O . . . 3\n" +
" 2 . . . . . . . . . . . . . . O . . . . 2\n" +
" 1 . . . . . . . . . . . . . . . . . . . 1\n" +
" A B C D E F G H J K L M N O P Q R S T\n");
checkSize(19);
checkColor(0, 0, EMPTY);
checkColor(0, 1, EMPTY);
checkColor(0, 2, WHITE);
checkColor(0, 3, WHITE);
checkColor(0, 4, BLACK);
checkColor(0, 5, EMPTY);
}
/** Test that parsing succeeds if non-breaking spaces are used.
The clipboard can contain non-breaking spaces if the text is copied
from other programs. */
public void testNonBreakingSpace()
{
parse(" + " + '\u00A0' + "+ O + O O # # + \n" +
" + + O + O O # # + \n" +
" + # O O O O O # # \n" +
" + # + O O # # # + \n" +
" + # O O # + # O + \n" +
" + + O # # + # + + \n" +
" + O O O # + + # + \n" +
" # O O # # # # + + \n" +
" + O O O # # # + + \n");
checkSize(9);
}
/** Test that parsing succeeds if leading > characters exist as
in quotatations in emails. */
public void testMailQuotations()
{
parse(">" +
"> . . . . . ." +
"> O O . . . ." +
"> O O X X X X" +
"> . X O O X ." +
"> . X O . O X" +
"> . X O O . X");
checkSize(6);
}
private Board m_board;
private void checkColor(int x, int y, GoColor c)
{
assertEquals(c, m_board.getColor(GoPoint.get(x, y)));
}
private void checkSize(int size)
{
assertEquals(size, m_board.getSize());
}
public void parse(String s)
{
TextParser parser = new TextParser();
try
{
Reader reader = new StringReader(s);
parser.parse(reader);
m_board = parser.getBoard();
}
catch (ParseError e)
{
fail(e.getMessage());
}
}
}