2 * Copyright (c) 2018. Developed by Hedgecode.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.hedgecode.chess;
19 import java.util.Iterator;
20 import java.util.List;
23 import org.apache.commons.configuration.XMLConfiguration;
24 import org.apache.commons.configuration.HierarchicalConfiguration;
25 import org.apache.commons.configuration.SubnodeConfiguration;
27 import org.junit.Test;
29 import org.hedgecode.chess.position.Castle;
30 import org.hedgecode.chess.position.Color;
31 import org.hedgecode.chess.position.ColorPiece;
32 import org.hedgecode.chess.position.Position;
33 import org.hedgecode.chess.position.Positions;
34 import org.hedgecode.chess.position.Square;
37 * Abstract Common Chess Position Test class.
39 * @author Dmitry Samoshin aka gotty
41 public abstract class AbstractPositionTest extends AbstractXMLConfigTest {
43 protected static final String NAME = "name";
44 protected static final String POSITION = "position";
46 private static final String INITIAL = "initial";
47 private static final String EMPTY = "empty";
48 private static final String SQUARES = "squares";
49 private static final String MOVE = "move";
50 private static final String CASTLE = "castle";
51 private static final String EN_PASSANT = "enPassant";
52 private static final String HALFMOVE = "halfmove";
53 private static final String FULLMOVE = "fullmove";
55 private static final String MSG_POSITION = "[%s]:";
56 private static final String MSG_POSITION_SQUARE = "[%s -> Square %s]:";
57 private static final String MSG_POSITION_MOVE = "[%s -> Move]:";
58 private static final String MSG_POSITION_CASTLE = "[%s -> Castle (%s)]:";
59 private static final String MSG_POSITION_EN_PASSANT = "[%s -> En Passant]:";
60 private static final String MSG_POSITION_HALFMOVE = "[%s -> Halfmove]:";
61 private static final String MSG_POSITION_FULLMOVE = "[%s -> Fullmove]:";
63 private String positionName;
65 public abstract List<XMLConfiguration> getXMLPositions() throws Exception;
68 public void testPositions() throws Exception {
69 for (XMLConfiguration xmlConfig : getXMLPositions())
70 testPosition(xmlConfig);
73 public void testPosition(HierarchicalConfiguration xmlPosition) throws Exception {
74 boolean isInitial = false, isEmpty = false;
75 boolean isSquares = !xmlPosition.subset(SQUARES).isEmpty();
76 if (xmlPosition.containsKey(INITIAL))
77 isInitial = xmlPosition.getBoolean(INITIAL);
78 if (xmlPosition.containsKey(EMPTY))
79 isEmpty = xmlPosition.getBoolean(EMPTY);
81 isInitial || isEmpty || isSquares
83 if (isSquares && !isEmpty) {
84 SubnodeConfiguration squaresNode = xmlPosition.configurationAt(SQUARES);
85 Iterator<String> keys = squaresNode.getKeys();
86 while (keys.hasNext()) {
87 String key = keys.next();
88 String value = squaresNode.getString(key);
93 ColorPiece.valueOf(value)
97 if (xmlPosition.containsKey(MOVE)) {
100 xmlPosition.getString(MOVE)
104 if (!xmlPosition.subset(CASTLE).isEmpty()) {
105 SubnodeConfiguration castleNode = xmlPosition.configurationAt(CASTLE);
106 Iterator<String> keys = castleNode.getKeys();
107 while (keys.hasNext()) {
108 String key = keys.next();
109 String value = castleNode.getString(key);
111 Color.valueOf(key.toUpperCase())
114 Castle.valueOf(value)
118 if (xmlPosition.containsKey(EN_PASSANT)) {
121 xmlPosition.getString(EN_PASSANT)
125 if (xmlPosition.containsKey(HALFMOVE)) {
127 xmlPosition.getInt(HALFMOVE, -1) >= 0
130 if (xmlPosition.containsKey(FULLMOVE)) {
132 xmlPosition.getInt(FULLMOVE, 0) > 0
138 protected String getConfigName() {
139 return getClass().getSimpleName();
142 protected Position assignPosition(HierarchicalConfiguration xmlPosition) {
143 if (xmlPosition.containsKey(INITIAL) && xmlPosition.getBoolean(INITIAL)) {
144 return Positions.INITIAL.getPosition();
146 Position position = Positions.EMPTY.getPosition();
147 if (!xmlPosition.subset(SQUARES).isEmpty()) {
148 SubnodeConfiguration squaresNode = xmlPosition.configurationAt(SQUARES);
149 Iterator<String> keys = squaresNode.getKeys();
150 while (keys.hasNext()) {
151 String key = keys.next();
152 String value = squaresNode.getString(key);
154 ColorPiece.valueOf(value),
155 Square.getSquare(key)
159 if (xmlPosition.containsKey(MOVE))
162 xmlPosition.getString(MOVE)
165 if (!xmlPosition.subset(CASTLE).isEmpty()) {
166 SubnodeConfiguration castleNode = xmlPosition.configurationAt(CASTLE);
167 Iterator<String> keys = castleNode.getKeys();
168 while (keys.hasNext()) {
169 String key = keys.next();
170 String value = castleNode.getString(key);
172 Color.valueOf(key.toUpperCase()),
173 Castle.valueOf(value)
177 if (xmlPosition.containsKey(EN_PASSANT))
178 position.setEnPassant(
180 xmlPosition.getString(EN_PASSANT)
183 if (xmlPosition.containsKey(HALFMOVE))
184 position.setHalfMove(
185 xmlPosition.getInt(HALFMOVE)
187 if (xmlPosition.containsKey(FULLMOVE))
188 position.setFullMove(
189 xmlPosition.getInt(FULLMOVE)
194 protected void assertPositionEquals(Position expected, Position actual) {
213 expected.getCastle(Color.WHITE),
214 actual.getCastle(Color.WHITE)
222 expected.getCastle(Color.BLACK),
223 actual.getCastle(Color.BLACK)
227 MSG_POSITION_EN_PASSANT,
230 expected.getEnPassant(),
231 actual.getEnPassant()
235 MSG_POSITION_HALFMOVE,
238 expected.getHalfMove(),
243 MSG_POSITION_FULLMOVE,
246 expected.getFullMove(),
251 protected void assertDiagramEquals(Position expected, Position actual) {
259 expected.getSquares(),
264 private void assertSquaresEquals(Map<Square, ColorPiece> expected, Map<Square, ColorPiece> actual) {
265 for (Map.Entry<Square, ColorPiece> entry : expected.entrySet()) {
270 entry.getKey().name()
273 actual.get(entry.getKey())
278 protected void assertStringEquals(String expected, String actual) {
289 public String getPositionName() {
293 protected void setPositionName(String name) {
299 public static void main(String[] args) throws Exception {
300 XMLConfiguration xmlConfig = new XMLConfiguration(
302 FENBuilderTest.class.getResource("FENBuilderTest.xml").toURI()
305 for (HierarchicalConfiguration testConfig : xmlConfig.configurationsAt(TESTS)) {
306 AbstractPositionTest.testPosition(
307 testConfig.configurationAt(POSITION)