From 1f52be6d451f5902b8a9e09af63a01681daa01fd Mon Sep 17 00:00:00 2001
From: Paktalin <likorn@ttu.ee>
Date: Thu, 31 May 2018 23:31:41 +0300
Subject: [PATCH] Exercise 6.6 done. Now you can move a king, but only to accessible position

---
 app/src/main/java/com/example/paktalin/agilejava_exercises/Board.java                      |  4 +++-
 app/src/main/java/com/example/paktalin/agilejava_exercises/Piece.java                      | 30 +++++++++++++++++++++++++++++-
 app/src/main/java/com/example/paktalin/agilejava_exercises/Position.java                   |  4 ++--
 app/src/main/java/com/example/paktalin/agilejava_exercises/moves/KingMoveStrategy.java     | 23 +++++++++++++++++++++++
 app/src/main/java/com/example/paktalin/agilejava_exercises/moves/KingMoves.java            | 15 ---------------
 app/src/main/java/com/example/paktalin/agilejava_exercises/moves/MoveStrategy.java         | 13 +++++++++++++
 app/src/main/java/com/example/paktalin/agilejava_exercises/moves/Moves.java                | 10 ----------
 app/src/test/java/com/example/paktalin/agilejava_exercises/AllTests.java                   |  4 ++--
 app/src/test/java/com/example/paktalin/agilejava_exercises/moves/KingMoveStrategyTest.java | 41 +++++++++++++++++++++++++++++++++++++++++
 app/src/test/java/com/example/paktalin/agilejava_exercises/moves/KingMovesTest.java        | 31 -------------------------------
 10 files changed, 113 insertions(+), 62 deletions(-)
 create mode 100644 app/src/main/java/com/example/paktalin/agilejava_exercises/moves/KingMoveStrategy.java
 delete mode 100644 app/src/main/java/com/example/paktalin/agilejava_exercises/moves/KingMoves.java
 create mode 100644 app/src/main/java/com/example/paktalin/agilejava_exercises/moves/MoveStrategy.java
 delete mode 100644 app/src/main/java/com/example/paktalin/agilejava_exercises/moves/Moves.java
 create mode 100644 app/src/test/java/com/example/paktalin/agilejava_exercises/moves/KingMoveStrategyTest.java
 delete mode 100644 app/src/test/java/com/example/paktalin/agilejava_exercises/moves/KingMovesTest.java

diff --git a/app/src/main/java/com/example/paktalin/agilejava_exercises/Board.java b/app/src/main/java/com/example/paktalin/agilejava_exercises/Board.java
index 6874cd7..0343620 100644
--- a/app/src/main/java/com/example/paktalin/agilejava_exercises/Board.java
+++ b/app/src/main/java/com/example/paktalin/agilejava_exercises/Board.java
@@ -33,7 +33,9 @@ public class Board {
     }
 
     public void move(Position from, Position to) {
-        layout.move(from, to);
+        Piece piece = layout.getPieceAtPosition(from);
+        if (piece.isMovable(from, to))
+            layout.move(from, to);
     }
 
     public Piece getPieceAtPosition(String position) {
diff --git a/app/src/main/java/com/example/paktalin/agilejava_exercises/Piece.java b/app/src/main/java/com/example/paktalin/agilejava_exercises/Piece.java
index ac1856a..aa2c369 100644
--- a/app/src/main/java/com/example/paktalin/agilejava_exercises/Piece.java
+++ b/app/src/main/java/com/example/paktalin/agilejava_exercises/Piece.java
@@ -2,6 +2,9 @@ package com.example.paktalin.agilejava_exercises;
 
 import android.support.annotation.NonNull;
 
+import com.example.paktalin.agilejava_exercises.moves.KingMoveStrategy;
+import com.example.paktalin.agilejava_exercises.moves.MoveStrategy;
+
 import java.util.List;
 
 /**
@@ -9,6 +12,7 @@ import java.util.List;
  */
 
 public class Piece implements Comparable<Piece> {
+
     public enum Color {White, Black}
 
     private Type type;
@@ -16,6 +20,7 @@ public class Piece implements Comparable<Piece> {
 
     private double strength;
     private Position position;
+    private MoveStrategy moveStrategy;
 
     private Piece() {}
 
@@ -25,10 +30,22 @@ public class Piece implements Comparable<Piece> {
     }
 
     public enum Type {
-        Pawn(1, 'p'), Knight(2.5, 'n'), Rook(5, 'r'), Bishop(3, 'b'), Queen(9, 'q'), King(0, 'k');
+        Pawn(1, 'p'),
+        Knight(2.5, 'n'),
+        Rook(5, 'r'),
+        Bishop(3, 'b'),
+        Queen(9, 'q'),
+        King(0, 'k', new KingMoveStrategy());
 
         private double strength;
         private char representation;
+        private MoveStrategy moveStrategy;
+
+        Type(double strength, char representation, MoveStrategy moveStrategy) {
+            this.strength = strength;
+            this.representation = representation;
+            this.moveStrategy = moveStrategy;
+        }
 
         Type(double strength, char representation) {
             this.strength = strength;
@@ -42,6 +59,10 @@ public class Piece implements Comparable<Piece> {
         public double getStrength() {
             return strength;
         }
+
+        public MoveStrategy getMoveStrategy() {
+            return moveStrategy;
+        }
     }
 
     public void setPosition(Position position) {
@@ -90,6 +111,10 @@ public class Piece implements Comparable<Piece> {
                 piece.getType() == currentPiece.getType();
     }
 
+    boolean isMovable(Position from, Position to) {
+        return this.getType().getMoveStrategy().isMovable(from, to);
+    }
+
     double getStrength() {
         return strength;
     }
@@ -115,6 +140,9 @@ public class Piece implements Comparable<Piece> {
     boolean isType(Piece.Type type) {
         return this.getType() == type;
     }
+    public boolean isAtPosition(Position position) {
+        return this.position.equals(position);
+    }
 
     static Piece createPawn(Color color) {
         return new Piece(color, Type.Pawn);
diff --git a/app/src/main/java/com/example/paktalin/agilejava_exercises/Position.java b/app/src/main/java/com/example/paktalin/agilejava_exercises/Position.java
index 8be6c06..77c1432 100644
--- a/app/src/main/java/com/example/paktalin/agilejava_exercises/Position.java
+++ b/app/src/main/java/com/example/paktalin/agilejava_exercises/Position.java
@@ -47,7 +47,7 @@ public class Position {
         return (int)c - (int)firstColumnLetter;
     }
 
-    int getRow() {
+    public int getRow() {
         return row;
     }
 
@@ -55,7 +55,7 @@ public class Position {
         return column;
     }
 
-    int getIntColumn() {
+    public int getIntColumn() {
         return charToInt(column);
     }
 }
diff --git a/app/src/main/java/com/example/paktalin/agilejava_exercises/moves/KingMoveStrategy.java b/app/src/main/java/com/example/paktalin/agilejava_exercises/moves/KingMoveStrategy.java
new file mode 100644
index 0000000..33eb874
--- /dev/null
+++ b/app/src/main/java/com/example/paktalin/agilejava_exercises/moves/KingMoveStrategy.java
@@ -0,0 +1,23 @@
+package com.example.paktalin.agilejava_exercises.moves;
+
+import com.example.paktalin.agilejava_exercises.Position;
+
+/**
+ * Created by Paktalin on 31/05/2018.
+ */
+
+public class KingMoveStrategy implements MoveStrategy{
+
+    @Override
+    public boolean isMovable(Position from, Position to) {
+        int fromRow = from.getRow();
+        int fromColumn = from.getIntColumn();
+
+        int toRow = to.getRow();
+        int toColumn = to.getIntColumn();
+
+        if ((Math.abs(toRow - fromRow) > 1) || (Math.abs(toColumn - fromColumn) > 1))
+            return false;
+        return true;
+    }
+}
diff --git a/app/src/main/java/com/example/paktalin/agilejava_exercises/moves/KingMoves.java b/app/src/main/java/com/example/paktalin/agilejava_exercises/moves/KingMoves.java
deleted file mode 100644
index 93bdcd2..0000000
--- a/app/src/main/java/com/example/paktalin/agilejava_exercises/moves/KingMoves.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.example.paktalin.agilejava_exercises.moves;
-
-import com.example.paktalin.agilejava_exercises.Piece;
-import com.example.paktalin.agilejava_exercises.Position;
-
-import java.util.Map;
-
-
-/**
- * Created by Paktalin on 31/05/2018.
- */
-
-public class KingMoves {
-
-}
diff --git a/app/src/main/java/com/example/paktalin/agilejava_exercises/moves/MoveStrategy.java b/app/src/main/java/com/example/paktalin/agilejava_exercises/moves/MoveStrategy.java
new file mode 100644
index 0000000..fd8d53b
--- /dev/null
+++ b/app/src/main/java/com/example/paktalin/agilejava_exercises/moves/MoveStrategy.java
@@ -0,0 +1,13 @@
+package com.example.paktalin.agilejava_exercises.moves;
+
+import com.example.paktalin.agilejava_exercises.Position;
+
+/**
+ * Created by Paktalin on 31/05/2018.
+ */
+
+public interface MoveStrategy {
+
+    boolean isMovable(Position from, Position to);
+
+}
diff --git a/app/src/main/java/com/example/paktalin/agilejava_exercises/moves/Moves.java b/app/src/main/java/com/example/paktalin/agilejava_exercises/moves/Moves.java
deleted file mode 100644
index 3693b2e..0000000
--- a/app/src/main/java/com/example/paktalin/agilejava_exercises/moves/Moves.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.example.paktalin.agilejava_exercises.moves;
-
-/**
- * Created by Paktalin on 31/05/2018.
- */
-
-public abstract class Moves {
-
-
-}
diff --git a/app/src/test/java/com/example/paktalin/agilejava_exercises/AllTests.java b/app/src/test/java/com/example/paktalin/agilejava_exercises/AllTests.java
index 7fd81ba..03f8697 100644
--- a/app/src/test/java/com/example/paktalin/agilejava_exercises/AllTests.java
+++ b/app/src/test/java/com/example/paktalin/agilejava_exercises/AllTests.java
@@ -1,6 +1,6 @@
 package com.example.paktalin.agilejava_exercises;
 
-import com.example.paktalin.agilejava_exercises.moves.KingMovesTest;
+import com.example.paktalin.agilejava_exercises.moves.KingMoveStrategyTest;
 
 import junit.framework.TestSuite;
 
@@ -17,7 +17,7 @@ public class AllTests extends TestSuite {
         suite.addTestSuite(BoardTest.class);
         suite.addTestSuite(CharacterTest.class);
         suite.addTestSuite(PositionTest.class);
-        suite.addTestSuite(KingMovesTest.class);
+        suite.addTestSuite(KingMoveStrategyTest.class);
 
         return suite;
     }
diff --git a/app/src/test/java/com/example/paktalin/agilejava_exercises/moves/KingMoveStrategyTest.java b/app/src/test/java/com/example/paktalin/agilejava_exercises/moves/KingMoveStrategyTest.java
new file mode 100644
index 0000000..5668937
--- /dev/null
+++ b/app/src/test/java/com/example/paktalin/agilejava_exercises/moves/KingMoveStrategyTest.java
@@ -0,0 +1,41 @@
+package com.example.paktalin.agilejava_exercises.moves;
+
+import com.example.paktalin.agilejava_exercises.Board;
+import com.example.paktalin.agilejava_exercises.Piece;
+import com.example.paktalin.agilejava_exercises.Position;
+
+import junit.framework.TestCase;
+
+/**
+ * Created by Paktalin on 31/05/2018.
+ */
+
+public class KingMoveStrategyTest extends TestCase {
+
+    private Piece king;
+    private Board board;
+
+    @Override
+    protected void setUp() throws Exception {
+        board = Board.createEmpty();
+        board.placePiece(Piece.createKing(Piece.Color.Black), "b5");
+        king = board.getPieceAtPosition("b5");
+    }
+
+    public void testMove() {
+        Position currentPosition = king.getPosition();
+        assertEquals("b5", currentPosition.toString());
+        Position accessiblePosition = Position.create("a6");
+
+        board.move(currentPosition, accessiblePosition);
+        assertTrue(king.isAtPosition(accessiblePosition));
+        assertFalse(king.isAtPosition(currentPosition));
+
+        currentPosition = accessiblePosition;
+        Position notAccessiblePosition = Position.create("d4");
+        board.move(currentPosition, notAccessiblePosition);
+        assertTrue(king.isAtPosition(currentPosition));
+        assertFalse(king.isAtPosition(notAccessiblePosition));
+    }
+
+}
diff --git a/app/src/test/java/com/example/paktalin/agilejava_exercises/moves/KingMovesTest.java b/app/src/test/java/com/example/paktalin/agilejava_exercises/moves/KingMovesTest.java
deleted file mode 100644
index f2f15ed..0000000
--- a/app/src/test/java/com/example/paktalin/agilejava_exercises/moves/KingMovesTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.example.paktalin.agilejava_exercises.moves;
-
-import com.example.paktalin.agilejava_exercises.Board;
-import com.example.paktalin.agilejava_exercises.Piece;
-import com.example.paktalin.agilejava_exercises.Position;
-
-import junit.framework.TestCase;
-
-/**
- * Created by Paktalin on 31/05/2018.
- */
-
-public class KingMovesTest extends TestCase {
-
-    private Piece king;
-    private Board board;
-
-    @Override
-    protected void setUp() throws Exception {
-        board = Board.createEmpty();
-        board.placePiece(Piece.createKing(Piece.Color.Black), "b5");
-        king = board.getPieceAtPosition("b5");
-    }
-
-    public void testCreate() {
-        assertEquals("b5", king.getPosition().toString());
-        board.move(Position.create("b5"), Position.create("a6"));
-        assertEquals("a6", king.getPosition().toString());
-    }
-
-}
--
libgit2 0.25.0