Skip to content
Snippets Groups Projects
Commit 7065bb62 authored by FrederickPi1969's avatar FrederickPi1969
Browse files

gurantee card validation & game state updation performance (test done)

parent 0d0090cc
No related branches found
No related tags found
No related merge requests found
No preview for this file type
File deleted
No preview for this file type
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class CardParserTest {
@Test
void parseCardID() {
}
@Test
void parseCardDescription() {
}
@Test
void isWildCard() {
}
}
\ No newline at end of file
......@@ -23,61 +23,19 @@ class RuleControllerTest {
System.out.println(player.getCards());
RuleController ruler = new RuleController();
ruler.setMatchableColor("red");
ruler.setMatchableSymbol("skip");
ruler.setNextPlayerSkiplevel(3);
setCurrentState(ruler, "red", "none", "6", 0);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("red");
ruler.setMatchableSymbol("reverse");
ruler.setNextPlayerSkiplevel(0);
setCurrentState(ruler, "yellow", "reverse", "none", 0);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("red");
ruler.setMatchableSymbol("none");
setCurrentState(ruler, "blue", "draw2", "none", 1); // previous blue draw2
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("blue");
ruler.setMatchableSymbol("skip");
ruler.setNextPlayerSkiplevel(3);
setCurrentState(ruler, "yellow", "none", "none", 2); // previous wildDraw4, declared yellow
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("blue");
ruler.setMatchableSymbol("reverse");
ruler.setNextPlayerSkiplevel(0);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("blue");
ruler.setMatchableSymbol("none");
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("green");
ruler.setMatchableSymbol("skip");
ruler.setNextPlayerSkiplevel(3);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("green");
ruler.setMatchableSymbol("reverse");
ruler.setNextPlayerSkiplevel(0);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("green");
ruler.setMatchableSymbol("none");
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("yellow");
ruler.setMatchableSymbol("skip");
ruler.setNextPlayerSkiplevel(3);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("yellow");
ruler.setMatchableSymbol("reverse");
ruler.setNextPlayerSkiplevel(0);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("yellow");
ruler.setMatchableSymbol("none");
setCurrentState(ruler, "red", "skip", "none", 3);
assert(!ruler.isValidPlay(player, 105, false));
}
......@@ -90,63 +48,30 @@ class RuleControllerTest {
Player player = player_Red_N_WildDraw4_Y();
RuleController ruler = new RuleController();
ruler.setMatchableColor("red");
ruler.setMatchableSymbol("skip");
ruler.setNextPlayerSkiplevel(3);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("red");
ruler.setMatchableSymbol("reverse");
ruler.setNextPlayerSkiplevel(0);
assert(ruler.isValidPlay(player, 105, false)); // playable!
ruler.setMatchableColor("red");
ruler.setMatchableSymbol("none");
assert(ruler.isValidPlay(player, 105, false)); // playable!
ruler.setMatchableColor("blue");
ruler.setMatchableSymbol("skip");
ruler.setNextPlayerSkiplevel(3);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("blue");
ruler.setMatchableSymbol("reverse");
ruler.setNextPlayerSkiplevel(0);
assert(!ruler.isValidPlay(player, 105, false));
setCurrentState(ruler, "red", "none", "6", 0);
assert(ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("blue");
ruler.setMatchableSymbol("none");
assert(!ruler.isValidPlay(player, 105, false));
setCurrentState(ruler, "red", "reverse", "none", 0);
assert(ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("green");
ruler.setMatchableSymbol("skip");
ruler.setNextPlayerSkiplevel(3);
assert(!ruler.isValidPlay(player, 105, false));
setCurrentState(ruler, "red", "draw2", "none", 1); // previous red draw2
assert(ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("green");
ruler.setMatchableSymbol("reverse");
ruler.setNextPlayerSkiplevel(0);
assert(!ruler.isValidPlay(player, 105, false));
setCurrentState(ruler, "red", "none", "none", 2); // previous wildDraw4
assert(ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("green");
ruler.setMatchableSymbol("none");
setCurrentState(ruler, "red", "skip", "none", 3);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("yellow");
ruler.setMatchableSymbol("skip");
ruler.setNextPlayerSkiplevel(3);
setCurrentState(ruler, "blue", "reverse", "none", 0);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("yellow");
ruler.setMatchableSymbol("reverse");
ruler.setNextPlayerSkiplevel(0);
setCurrentState(ruler, "green", "draw2", "none", 0);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("yellow");
ruler.setMatchableSymbol("none");
setCurrentState(ruler, "yellow", "skip", "none", 3);
assert(!ruler.isValidPlay(player, 105, false));
}
}
@Test
/**
......@@ -157,61 +82,19 @@ class RuleControllerTest {
Player player = player_AllColor_Y_WildDraw4_Y();
RuleController ruler = new RuleController();
ruler.setMatchableColor("red");
ruler.setMatchableSymbol("skip");
ruler.setNextPlayerSkiplevel(3);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("red");
ruler.setMatchableSymbol("reverse");
ruler.setNextPlayerSkiplevel(0);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("red");
ruler.setMatchableSymbol("none");
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("blue");
ruler.setMatchableSymbol("skip");
ruler.setNextPlayerSkiplevel(3);
setCurrentState(ruler, "red", "none", "6", 0);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("blue");
ruler.setMatchableSymbol("reverse");
ruler.setNextPlayerSkiplevel(0);
setCurrentState(ruler, "yellow", "reverse", "none", 0);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("blue");
ruler.setMatchableSymbol("none");
setCurrentState(ruler, "blue", "draw2", "none", 1); // previous blue draw2
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("green");
ruler.setMatchableSymbol("skip");
ruler.setNextPlayerSkiplevel(3);
setCurrentState(ruler, "yellow", "none", "none", 2); // previous wildDraw4, declared yellow
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("green");
ruler.setMatchableSymbol("reverse");
ruler.setNextPlayerSkiplevel(0);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("green");
ruler.setMatchableSymbol("none");
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("yellow");
ruler.setMatchableSymbol("skip");
ruler.setNextPlayerSkiplevel(3);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("yellow");
ruler.setMatchableSymbol("reverse");
ruler.setNextPlayerSkiplevel(0);
assert(!ruler.isValidPlay(player, 105, false));
ruler.setMatchableColor("yellow");
ruler.setMatchableSymbol("none");
setCurrentState(ruler, "red", "skip", "none", 3);
assert(!ruler.isValidPlay(player, 105, false));
}
......@@ -222,12 +105,11 @@ class RuleControllerTest {
* 3. test previous card: red 8
*/
void testSituation_Red8() throws Exception {
RuleController ruler = new RuleController();
Player player = playerAllCards(); // a player who owns all cards
ruler.setMatchableColor("red");
ruler.setMatchableSymbol("none");
ruler.setMatchableNumber("8");
setCurrentState(ruler,"red", "none", "8", 0);
ArrayList<Integer> validByRuler = getAllLegalCardsByRuler(ruler, player);
ArrayList<Integer> groundTruth = groundTruthGenerator(ruler, player,
......@@ -236,6 +118,7 @@ class RuleControllerTest {
System.out.println(validByRuler);
System.out.println(groundTruth);
assert(validByRuler.equals(groundTruth));
}
......@@ -246,9 +129,9 @@ class RuleControllerTest {
void testSituation_Yellow0() throws Exception {
RuleController ruler = new RuleController();
Player player = playerAllCards(); // a player who owns all cards
ruler.setMatchableColor("yellow");
ruler.setMatchableSymbol("none");
ruler.setMatchableNumber("0");
setCurrentState(ruler, "yellow", "none", "0", 0);
ArrayList<Integer> validByRuler = getAllLegalCardsByRuler(ruler, player);
ArrayList<Integer> groundTruth = groundTruthGenerator(ruler, player,
ruler.getMatchableColor(), ruler.getMatchableNumber(), ruler.getMatchableSymbol());
......@@ -265,10 +148,9 @@ class RuleControllerTest {
void testSituation_blueSkip() throws Exception {
RuleController ruler = new RuleController();
Player player = playerAllCards(); // a player who owns all cards
ruler.setMatchableColor("blue");
ruler.setMatchableSymbol("skip");
ruler.setMatchableNumber("none");
ruler.setNextPlayerSkiplevel(3);
setCurrentState(ruler, "blue", "skip", "none", 3);
ArrayList<Integer> validByRuler = getAllLegalCardsByRuler(ruler, player);
ArrayList<Integer> groundTruth = groundTruthGenerator(ruler, player,
ruler.getMatchableColor(), ruler.getMatchableNumber(), ruler.getMatchableSymbol());
......@@ -285,10 +167,9 @@ class RuleControllerTest {
void testSituation_greenReverse() throws Exception {
RuleController ruler = new RuleController();
Player player = playerAllCards(); // a player who owns all cards
ruler.setMatchableColor("green");
ruler.setMatchableSymbol("reverse");
ruler.setMatchableNumber("none");
ruler.setNextPlayerSkiplevel(0);
setCurrentState(ruler, "green", "reverse", "none", 0);
ArrayList<Integer> validByRuler = getAllLegalCardsByRuler(ruler, player);
ArrayList<Integer> groundTruth = groundTruthGenerator(ruler, player,
ruler.getMatchableColor(), ruler.getMatchableNumber(), ruler.getMatchableSymbol());
......@@ -305,10 +186,9 @@ class RuleControllerTest {
void testSituation_RedDraw2() throws Exception {
RuleController ruler = new RuleController();
Player player = playerAllCards(); // a player who owns all cards
ruler.setMatchableColor("red");
ruler.setMatchableSymbol("draw2");
ruler.setMatchableNumber("none");
ruler.setNextPlayerSkiplevel(1);
setCurrentState(ruler, "red", "draw2", "none", 1);
ArrayList<Integer> validByRuler = getAllLegalCardsByRuler(ruler, player);
ArrayList<Integer> groundTruth = groundTruthGenerator(ruler, player,
ruler.getMatchableColor(), ruler.getMatchableNumber(), ruler.getMatchableSymbol());
......@@ -319,8 +199,6 @@ class RuleControllerTest {
}
@Test
/**
* 8. test previous card: wild with red as declared color
......@@ -328,10 +206,9 @@ class RuleControllerTest {
void testSituation_wildDeclaredRed() throws Exception {
RuleController ruler = new RuleController();
Player player = playerAllCards(); // a player who owns all cards
ruler.setMatchableColor("red"); // only color should be matchable in this case
ruler.setMatchableSymbol("none");
ruler.setMatchableNumber("none");
ruler.setNextPlayerSkiplevel(0);
setCurrentState(ruler, "red", "none", "none", 0);
ArrayList<Integer> validByRuler = getAllLegalCardsByRuler(ruler, player);
ArrayList<Integer> groundTruth = groundTruthGenerator(ruler, player,
ruler.getMatchableColor(), ruler.getMatchableNumber(), ruler.getMatchableSymbol());
......@@ -349,10 +226,9 @@ class RuleControllerTest {
void testSituation_wildDraw4DeclaredRed() throws Exception {
RuleController ruler = new RuleController();
Player player = playerAllCards(); // a player who owns all cards
ruler.setMatchableColor("red"); // only color should be matchable in this case
ruler.setMatchableSymbol("none");
ruler.setMatchableNumber("none");
ruler.setNextPlayerSkiplevel(2);
setCurrentState(ruler, "red", "none", "none", 2);
ArrayList<Integer> validByRuler = getAllLegalCardsByRuler(ruler, player);
ArrayList<Integer> groundTruth = groundTruthGenerator(ruler, player,
ruler.getMatchableColor(), ruler.getMatchableNumber(), ruler.getMatchableSymbol());
......@@ -363,12 +239,84 @@ class RuleControllerTest {
}
@Test
/**
* 10. Test if ruler is updated correctly if last round was red 8
* suppose the user cannot play wildDraw4
* All possible plays are tested - no need to do more other than wildDraw4
*/
void testUpdate_Red8() {
RuleController ruler = new RuleController();
Player player = playerAllCards(); // a player who owns all cards
setCurrentState(ruler, "red", "none", "8", 0);
ArrayList<Integer> validByRuler = getAllLegalCardsByRuler(ruler, player);
ArrayList<Integer> groundTruth = groundTruthGenerator(ruler, player,
ruler.getMatchableColor(), ruler.getMatchableNumber(), ruler.getMatchableSymbol());
ruler.isValidPlay(player, 25, true); // check behavior of red 0
assert(checkStateUpdatedCorrectly(ruler, "red", "none", "0", 0));
setCurrentState(ruler, "red", "none", "8", 0);
ruler.isValidPlay(player, 20,true); // red skip card
assert(checkStateUpdatedCorrectly(ruler, "red", "skip", "none", 3));
setCurrentState(ruler, "red", "none", "8", 0);
ruler.isValidPlay(player, 22,true); // red reverse card
assert(checkStateUpdatedCorrectly(ruler, "red", "reverse", "none", 0));
assert(!ruler.getIsClockwise());
ruler.changeGameOrder();
setCurrentState(ruler, "red", "none", "8", 0);
ruler.isValidPlay(player, 24,true); // red draw2 card
assert(checkStateUpdatedCorrectly(ruler, "red", "draw2", "none", 1));
assert(ruler.getPenaltyDraw() == 2); // next player should draw 2
setCurrentState(ruler, "red", "none", "8", 0);
ruler.isValidPlay(player, 58, true); // blue 8
assert(checkStateUpdatedCorrectly(ruler, "blue", "none", "8", 0));
setCurrentState(ruler, "red", "none", "8", 0);
ruler.isValidPlay(player, 102, true); // wild card, color should be NA, a special state
assert(checkStateUpdatedCorrectly(ruler, "NA", "none", "none", 0));
}
/**
* 11. test behavior of wildDraw4
* given player has no red card, but has a wildDraw4 card
*/
@Test
void testUpdate_WildDraw4() {
RuleController ruler = new RuleController();
Player player = player_Red_N_WildDraw4_Y();
// previous play red 8
ruler.resetPenaltyDraw();
setCurrentState(ruler, "red", "none", "8", 0);
ruler.isValidPlay(player, 108, true);
assert(checkStateUpdatedCorrectly(ruler, "NA", "none", "none", 2));
assert(ruler.getPenaltyDraw() == 4);
// previous play red draw 2 -- penalty draw should be 6 after wildDraw4 played
ruler.resetPenaltyDraw();
setCurrentState(ruler, "red", "draw2", "none", 1);
ruler.increasePenaltyDraw(2);
ruler.isValidPlay(player, 108, true);
assert(checkStateUpdatedCorrectly(ruler, "NA", "none", "none", 2));
assert(ruler.getPenaltyDraw() == 6);
// previous play wildDraw 4, and declared red as matchable color
ruler.resetPenaltyDraw();
setCurrentState(ruler, "red", "none", "none", 2);
ruler.increasePenaltyDraw(4);
System.out.println(ruler.isValidPlay(player, 108, true));
assert(checkStateUpdatedCorrectly(ruler, "NA", "none", "none", 2));
assert(ruler.getPenaltyDraw() == 8);
}
......@@ -481,4 +429,31 @@ class RuleControllerTest {
}
return player;
}
/**
* helper function to set current game state based on previous player's move
*/
private void setCurrentState(RuleController ruler,
String matchableColor,
String machableSymbol,
String matchabeNumber,
int level) {
ruler.setMatchableColor(matchableColor);
ruler.setMatchableSymbol(machableSymbol);
ruler.setMatchableNumber(matchabeNumber);
ruler.setNextPlayerSkiplevel(level);
}
private boolean checkStateUpdatedCorrectly(RuleController ruler,
String truthColor,
String truthSymbol,
String truthNumber,
int truthLevel) {
return truthColor.equals(ruler.getMatchableColor()) &&
truthSymbol.equals(ruler.getMatchableSymbol()) &&
truthNumber.equals(ruler.getMatchableNumber()) &&
truthLevel == ruler.getNextPlayerSkiplevel();
}
}
\ No newline at end of file
......@@ -9,7 +9,7 @@ public class RuleController {
*/
private String currentMatchableColor;
private String currentMatchableNumber;
private String currentMatchableSymbol = "all"; // all symbols can be played in the first round
private String currentMatchableSymbol = "none"; // Card played in the first round can only match by either color or number
private int nextPlayerSkipLevel = 0;
private int cumulativePenaltyDraw = 0;
private boolean isClockWise = true; // if clockwise, next player will be the element in player list
......@@ -76,38 +76,43 @@ public class RuleController {
String type = result[1];
String content = result[2];
// pending skip
boolean valid = false;
if (nextPlayerSkipLevel == 3) {
return false;
valid = false;
} else if (nextPlayerSkipLevel == 2) {
if (content.equals("wildDraw4")) {
return checkDraw4IsLegal(player);
valid = checkDraw4IsLegal(player);
} else {
valid = false;
}
return false; // any cards other than wildDraw4 are not playable
} else if (nextPlayerSkipLevel == 1) {
if (content.equals("wildDraw4")) {
return checkDraw4IsLegal(player);
valid = checkDraw4IsLegal(player);
} else {
return content.equals("draw2"); // draw 2 is always allowed in this case
}
return content.equals("draw2"); // draw 2 is always allowed in this case
}
boolean valid = false;
// if not skipped, first consider wild card
if (content.equals("wild")) {
valid = true; // can be used unconditionally
}
// then other colored cards
if (checkAttrMatch(currentMatchableColor, color))
valid = true;
if (checkAttrMatch(currentMatchableNumber, content) || checkAttrMatch(currentMatchableSymbol, content))
valid = true;
} else {
// if not skipped, first consider wild card
if (content.equals("wild")) {
valid = true; // can be used unconditionally
}
// check wildDraw4 at last
if (content.equals("wildDraw4")) {
valid = checkDraw4IsLegal(player);
}
// then other colored cards
if (checkAttrMatch(currentMatchableColor, color))
valid = true;
if (checkAttrMatch(currentMatchableNumber, content) || checkAttrMatch(currentMatchableSymbol, content))
valid = true;
// check wildDraw4 at last
if (content.equals("wildDraw4")) {
valid = checkDraw4IsLegal(player);
}
}
if (valid && updateIfValid) {
updateRule(color, type, content);
......@@ -118,13 +123,12 @@ public class RuleController {
private void updateRule(String color, String type, String content) {
setMatchableColor(color); // wildcard "NA" - this will be updated later by player declaring the color
if (type.equals("sym")) {
if (content.equals("skip")) {
setNextPlayerSkiplevel(3);
// the states after the skip.. (supposed skipping is done)
currentMatchableSymbol = content; //??
currentMatchableNumber = "all"; //??
currentMatchableNumber = "none"; //??
} else if (content.equals("draw2")) {
// next round match by either COL or SYM
......@@ -138,7 +142,7 @@ public class RuleController {
setNextPlayerSkiplevel(2);
increasePenaltyDraw(4);
currentMatchableSymbol = "none";
currentMatchableNumber = "none"; // color will be declared by player later
currentMatchableNumber = "none";
} else if (content.equals("reverse")) {
// next round match by either COL or SYM
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment