Skip to content
Snippets Groups Projects
Commit 3201c4c8 authored by FrederickPi1969's avatar FrederickPi1969
Browse files

mend

Gurantee performance of card validation & updation (test done)
parent 7065bb62
No related branches found
No related tags found
No related merge requests found
No preview for this file type
No preview for this file type
No preview for this file type
...@@ -8,7 +8,12 @@ import java.util.ArrayList; ...@@ -8,7 +8,12 @@ import java.util.ArrayList;
import java.util.Random; import java.util.Random;
// Test for judging whether a play is legal /**
* A comprehensive test for RuleController class, Including
* 1. validating each card in given contexts (including behavior of wildDraw4)
* 2. updating the gameState (matchable color, number, symbol) when player plays a specific card
* 3. Initialization of initial game state
*/
class RuleControllerTest { class RuleControllerTest {
private static CardParser parser = new CardParser(); private static CardParser parser = new CardParser();
...@@ -256,28 +261,34 @@ class RuleControllerTest { ...@@ -256,28 +261,34 @@ class RuleControllerTest {
ArrayList<Integer> groundTruth = groundTruthGenerator(ruler, player, ArrayList<Integer> groundTruth = groundTruthGenerator(ruler, player,
ruler.getMatchableColor(), ruler.getMatchableNumber(), ruler.getMatchableSymbol()); ruler.getMatchableColor(), ruler.getMatchableNumber(), ruler.getMatchableSymbol());
ruler.isValidPlay(player, 25, true); // check behavior of red 0 // current player plays red 0
ruler.isValidPlay(player, 25, true);
assert(checkStateUpdatedCorrectly(ruler, "red", "none", "0", 0)); assert(checkStateUpdatedCorrectly(ruler, "red", "none", "0", 0));
// current player plays red skip card
setCurrentState(ruler, "red", "none", "8", 0); setCurrentState(ruler, "red", "none", "8", 0);
ruler.isValidPlay(player, 20,true); // red skip card ruler.isValidPlay(player, 20,true);
assert(checkStateUpdatedCorrectly(ruler, "red", "skip", "none", 3)); assert(checkStateUpdatedCorrectly(ruler, "red", "skip", "none", 3));
// current player plays red reverse card
setCurrentState(ruler, "red", "none", "8", 0); setCurrentState(ruler, "red", "none", "8", 0);
ruler.isValidPlay(player, 22,true); // red reverse card ruler.isValidPlay(player, 22,true);
assert(checkStateUpdatedCorrectly(ruler, "red", "reverse", "none", 0)); assert(checkStateUpdatedCorrectly(ruler, "red", "reverse", "none", 0));
assert(!ruler.getIsClockwise()); assert(!ruler.getIsClockwise());
// current player plays red draw 2
ruler.changeGameOrder(); ruler.changeGameOrder();
setCurrentState(ruler, "red", "none", "8", 0); setCurrentState(ruler, "red", "none", "8", 0);
ruler.isValidPlay(player, 24,true); // red draw2 card ruler.isValidPlay(player, 24,true);
assert(checkStateUpdatedCorrectly(ruler, "red", "draw2", "none", 1)); assert(checkStateUpdatedCorrectly(ruler, "red", "draw2", "none", 1));
assert(ruler.getPenaltyDraw() == 2); // next player should draw 2 assert(ruler.getPenaltyDraw() == 2); // next player should draw 2
// current player plays blue 8
setCurrentState(ruler, "red", "none", "8", 0); setCurrentState(ruler, "red", "none", "8", 0);
ruler.isValidPlay(player, 58, true); // blue 8 ruler.isValidPlay(player, 58, true);
assert(checkStateUpdatedCorrectly(ruler, "blue", "none", "8", 0)); assert(checkStateUpdatedCorrectly(ruler, "blue", "none", "8", 0));
// current player plays wild card
setCurrentState(ruler, "red", "none", "8", 0); setCurrentState(ruler, "red", "none", "8", 0);
ruler.isValidPlay(player, 102, true); // wild card, color should be NA, a special state ruler.isValidPlay(player, 102, true); // wild card, color should be NA, a special state
assert(checkStateUpdatedCorrectly(ruler, "NA", "none", "none", 0)); assert(checkStateUpdatedCorrectly(ruler, "NA", "none", "none", 0));
...@@ -319,8 +330,37 @@ class RuleControllerTest { ...@@ -319,8 +330,37 @@ class RuleControllerTest {
} }
/**
* 12. Test initialization of beginning game state is done properly
* As this is a random process, it should be repeated many times using for loop
*/
@Test
void testInitialization() {
ArrayList<String> colors = new ArrayList<>();
colors.add("red");
colors.add("green");
colors.add("blue");
colors.add("yellow");
ArrayList<String> numbers = new ArrayList<>();
for(int i = 0; i <= 9; i++) {
numbers.add((Integer.toString(i)));
}
for (int i = 0; i < 500; i++) {
RuleController ruler = new RuleController();
assert(colors.contains(ruler.getMatchableColor()));
assert(numbers.contains(ruler.getMatchableNumber()));
assert(ruler.getMatchableSymbol().equals("none"));
}
}
/** /**
* helper function:
* extract all the cards that the ruler think as legal * extract all the cards that the ruler think as legal
*/ */
private ArrayList<Integer> getAllLegalCardsByRuler(RuleController ruler, Player player) { private ArrayList<Integer> getAllLegalCardsByRuler(RuleController ruler, Player player) {
......
...@@ -51,21 +51,24 @@ public class CardManager { ...@@ -51,21 +51,24 @@ public class CardManager {
return null; return null;
} }
ArrayList<Integer> cardsDrawnFromDiscard = new ArrayList<Integer>(); ArrayList<Integer> cardsDrawnFromDiscard = new ArrayList<>();
if (numCardLeft() < numToDraw) { if (numCardLeft() < numToDraw) {
int numToDrawFromDiscard = numToDraw - cardPile.size(); int numToDrawFromDiscard = numToDraw - cardPile.size();
numToDraw -= numToDrawFromDiscard;
cardsDrawnFromDiscard = drawCardsfromDiscardPile(numToDrawFromDiscard); cardsDrawnFromDiscard = drawCardsfromDiscardPile(numToDrawFromDiscard);
if (numToDraw == 0) return cardsDrawnFromDiscard; // we don't need to check cardPile anymore
} }
ArrayList<Integer> drawnCards = new ArrayList<Integer>(cardPile.subList(0, numToDraw));
ArrayList<Integer> drawnCards = new ArrayList<>(cardPile.subList(0, numToDraw));
drawnCards.addAll(cardsDrawnFromDiscard); drawnCards.addAll(cardsDrawnFromDiscard);
cardPile.subList(0, numToDraw).clear(); // erase the drawn cards cardPile.subList(0, numToDraw).clear(); // erase the drawn cards
return drawnCards; return drawnCards;
} }
private ArrayList<Integer> drawCardsfromDiscardPile(int numToDraw) { private ArrayList<Integer> drawCardsfromDiscardPile(int numToDraw) {
ArrayList<Integer> drawnCards = new ArrayList<Integer>(discardPile.subList(0, numToDraw)); ArrayList<Integer> drawnCards = new ArrayList<>(discardPile.subList(0, numToDraw));
cardPile.subList(0, numToDraw).clear(); // erase the drawn cards discardPile.subList(0, numToDraw).clear(); // erase the drawn cards
return drawnCards; return drawnCards;
} }
......
...@@ -21,6 +21,7 @@ public class Game { ...@@ -21,6 +21,7 @@ public class Game {
* @param playerNum * @param playerNum
*/ */
public Game(int playerNum) { public Game(int playerNum) {
assert(playerNum >= 1 && playerNum <= 10); // UNO is intended for 1-10 players
gameCardManager = new CardManager(); gameCardManager = new CardManager();
ruler = new RuleController(); ruler = new RuleController();
decideFirstPlayerID(playerNum); decideFirstPlayerID(playerNum);
...@@ -46,7 +47,6 @@ public class Game { ...@@ -46,7 +47,6 @@ public class Game {
currentPlayerID = rand.nextInt(playerNum); currentPlayerID = rand.nextInt(playerNum);
} }
/** /**
* find the next player in the sequence, regardless whether he or not should be skipped * find the next player in the sequence, regardless whether he or not should be skipped
*/ */
......
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