[LIB-9] Separate chesshog-core module
[chesshog.git] / chesshog-core / src / test / java / org / hedgecode / chess / AbstractPositionTest.java
diff --git a/chesshog-core/src/test/java/org/hedgecode/chess/AbstractPositionTest.java b/chesshog-core/src/test/java/org/hedgecode/chess/AbstractPositionTest.java
new file mode 100644 (file)
index 0000000..98ea11d
--- /dev/null
@@ -0,0 +1,313 @@
+/*
+ * Copyright (c) 2018. Developed by Hedgecode.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.hedgecode.chess;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.configuration.XMLConfiguration;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.configuration.SubnodeConfiguration;
+
+import org.junit.Test;
+
+import org.hedgecode.chess.position.Castle;
+import org.hedgecode.chess.position.Color;
+import org.hedgecode.chess.position.ColorPiece;
+import org.hedgecode.chess.position.Position;
+import org.hedgecode.chess.position.Positions;
+import org.hedgecode.chess.position.Square;
+
+/**
+ * Abstract Common Chess Position Test class.
+ *
+ * @author Dmitry Samoshin aka gotty
+ */
+public abstract class AbstractPositionTest extends AbstractXMLConfigTest {
+
+    protected static final String NAME = "name";
+    protected static final String POSITION = "position";
+
+    private static final String INITIAL = "initial";
+    private static final String EMPTY = "empty";
+    private static final String SQUARES = "squares";
+    private static final String MOVE = "move";
+    private static final String CASTLE = "castle";
+    private static final String EN_PASSANT = "enPassant";
+    private static final String HALFMOVE = "halfmove";
+    private static final String FULLMOVE = "fullmove";
+
+    private static final String MSG_POSITION = "[%s]:";
+    private static final String MSG_POSITION_SQUARE = "[%s -> Square %s]:";
+    private static final String MSG_POSITION_MOVE = "[%s -> Move]:";
+    private static final String MSG_POSITION_CASTLE = "[%s -> Castle (%s)]:";
+    private static final String MSG_POSITION_EN_PASSANT = "[%s -> En Passant]:";
+    private static final String MSG_POSITION_HALFMOVE = "[%s -> Halfmove]:";
+    private static final String MSG_POSITION_FULLMOVE = "[%s -> Fullmove]:";
+
+    private String positionName;
+
+    public abstract List<XMLConfiguration> getXMLPositions() throws Exception;
+
+    @Test
+    public void testPositions() throws Exception {
+        for (XMLConfiguration xmlConfig : getXMLPositions())
+            testPosition(xmlConfig);
+    }
+
+    public void testPosition(HierarchicalConfiguration xmlPosition) throws Exception {
+        boolean isInitial = false, isEmpty = false;
+        boolean isSquares = !xmlPosition.subset(SQUARES).isEmpty();
+        if (xmlPosition.containsKey(INITIAL))
+            isInitial = xmlPosition.getBoolean(INITIAL);
+        if (xmlPosition.containsKey(EMPTY))
+            isEmpty = xmlPosition.getBoolean(EMPTY);
+        assertTrue(
+                isInitial || isEmpty || isSquares
+        );
+        if (isSquares && !isEmpty) {
+            SubnodeConfiguration squaresNode = xmlPosition.configurationAt(SQUARES);
+            Iterator<String> keys = squaresNode.getKeys();
+            while (keys.hasNext()) {
+                String key = keys.next();
+                String value = squaresNode.getString(key);
+                assertNotNull(
+                        Square.getSquare(key)
+                );
+                assertNotNull(
+                        ColorPiece.valueOf(value)
+                );
+            }
+        }
+        if (xmlPosition.containsKey(MOVE)) {
+            assertNotNull(
+                    Color.valueOf(
+                            xmlPosition.getString(MOVE)
+                    )
+            );
+        }
+        if (!xmlPosition.subset(CASTLE).isEmpty()) {
+            SubnodeConfiguration castleNode = xmlPosition.configurationAt(CASTLE);
+            Iterator<String> keys = castleNode.getKeys();
+            while (keys.hasNext()) {
+                String key = keys.next();
+                String value = castleNode.getString(key);
+                assertNotNull(
+                        Color.valueOf(key.toUpperCase())
+                );
+                assertNotNull(
+                        Castle.valueOf(value)
+                );
+            }
+        }
+        if (xmlPosition.containsKey(EN_PASSANT)) {
+            assertNotNull(
+                    Square.getSquare(
+                            xmlPosition.getString(EN_PASSANT)
+                    )
+            );
+        }
+        if (xmlPosition.containsKey(HALFMOVE)) {
+            assertTrue(
+                    xmlPosition.getInt(HALFMOVE, -1) >= 0
+            );
+        }
+        if (xmlPosition.containsKey(FULLMOVE)) {
+            assertTrue(
+                    xmlPosition.getInt(FULLMOVE, 0) > 0
+            );
+        }
+    }
+
+    @Override
+    protected String getConfigName() {
+        return getClass().getSimpleName();
+    }
+
+    protected Position assignPosition(HierarchicalConfiguration xmlPosition) {
+        if (xmlPosition.containsKey(INITIAL) && xmlPosition.getBoolean(INITIAL)) {
+            return Positions.INITIAL.getPosition();
+        }
+        Position position = Positions.EMPTY.getPosition();
+        if (!xmlPosition.subset(SQUARES).isEmpty()) {
+            SubnodeConfiguration squaresNode = xmlPosition.configurationAt(SQUARES);
+            Iterator<String> keys = squaresNode.getKeys();
+            while (keys.hasNext()) {
+                String key = keys.next();
+                String value = squaresNode.getString(key);
+                position.setPiece(
+                        ColorPiece.valueOf(value),
+                        Square.getSquare(key)
+                );
+            }
+        }
+        if (xmlPosition.containsKey(MOVE))
+            position.setMove(
+                    Color.valueOf(
+                            xmlPosition.getString(MOVE)
+                    )
+            );
+        if (!xmlPosition.subset(CASTLE).isEmpty()) {
+            SubnodeConfiguration castleNode = xmlPosition.configurationAt(CASTLE);
+            Iterator<String> keys = castleNode.getKeys();
+            while (keys.hasNext()) {
+                String key = keys.next();
+                String value = castleNode.getString(key);
+                position.setCastle(
+                        Color.valueOf(key.toUpperCase()),
+                        Castle.valueOf(value)
+                );
+            }
+        }
+        if (xmlPosition.containsKey(EN_PASSANT))
+            position.setEnPassant(
+                    Square.getSquare(
+                            xmlPosition.getString(EN_PASSANT)
+                    )
+            );
+        if (xmlPosition.containsKey(HALFMOVE))
+            position.setHalfMove(
+                    xmlPosition.getInt(HALFMOVE)
+            );
+        if (xmlPosition.containsKey(FULLMOVE))
+            position.setFullMove(
+                    xmlPosition.getInt(FULLMOVE)
+            );
+        return position;
+    }
+
+    protected void assertPositionEquals(Position expected, Position actual) {
+        assertDiagramEquals(
+                expected,
+                actual
+        );
+        assertEquals(
+                String.format(
+                        MSG_POSITION_MOVE,
+                        positionName
+                ),
+                expected.getMove(),
+                actual.getMove()
+        );
+        assertEquals(
+                String.format(
+                        MSG_POSITION_CASTLE,
+                        positionName,
+                        Color.WHITE
+                ),
+                expected.getCastle(Color.WHITE),
+                actual.getCastle(Color.WHITE)
+        );
+        assertEquals(
+                String.format(
+                        MSG_POSITION_CASTLE,
+                        positionName,
+                        Color.BLACK
+                ),
+                expected.getCastle(Color.BLACK),
+                actual.getCastle(Color.BLACK)
+        );
+        assertEquals(
+                String.format(
+                        MSG_POSITION_EN_PASSANT,
+                        positionName
+                ),
+                expected.getEnPassant(),
+                actual.getEnPassant()
+        );
+        assertEquals(
+                String.format(
+                        MSG_POSITION_HALFMOVE,
+                        positionName
+                ),
+                expected.getHalfMove(),
+                actual.getHalfMove()
+        );
+        assertEquals(
+                String.format(
+                        MSG_POSITION_FULLMOVE,
+                        positionName
+                ),
+                expected.getFullMove(),
+                actual.getFullMove()
+        );
+    }
+
+    protected void assertDiagramEquals(Position expected, Position actual) {
+        assertNotNull(
+                expected
+        );
+        assertNotNull(
+                actual
+        );
+        assertSquaresEquals(
+                expected.getSquares(),
+                actual.getSquares()
+        );
+    }
+
+    private void assertSquaresEquals(Map<Square, ColorPiece> expected, Map<Square, ColorPiece> actual) {
+        for (Map.Entry<Square, ColorPiece> entry : expected.entrySet()) {
+            assertEquals(
+                    String.format(
+                            MSG_POSITION_SQUARE,
+                            positionName,
+                            entry.getKey().name()
+                    ),
+                    entry.getValue(),
+                    actual.get(entry.getKey())
+            );
+        }
+    }
+
+    protected void assertStringEquals(String expected, String actual) {
+        assertEquals(
+                String.format(
+                        MSG_POSITION,
+                        positionName
+                ),
+                expected,
+                actual
+        );
+    }
+
+    public String getPositionName() {
+        return positionName;
+    }
+
+    protected void setPositionName(String name) {
+        positionName = name;
+    }
+
+
+/*
+    public static void main(String[] args) throws Exception {
+        XMLConfiguration xmlConfig = new XMLConfiguration(
+                new File(
+                        FENBuilderTest.class.getResource("FENBuilderTest.xml").toURI()
+                )
+        );
+        for (HierarchicalConfiguration testConfig : xmlConfig.configurationsAt(TESTS)) {
+            AbstractPositionTest.testPosition(
+                    testConfig.configurationAt(POSITION)
+            );
+        }
+    }
+*/
+
+}