diff --git a/10_Blackjack/java/src/Game.java b/10_Blackjack/java/src/Game.java index e81c8f56..01e34d39 100644 --- a/10_Blackjack/java/src/Game.java +++ b/10_Blackjack/java/src/Game.java @@ -198,15 +198,28 @@ public class Game { } /** - * Compares two hands accounting for natural blackjacks + * Compares two hands accounting for natural blackjacks using the + * java.lang.Comparable convention of returning positive or negative integers * * @param handA hand to compare * @param handB other hand to compare * @return a negative integer, zero, or a positive integer as handA is less than, equal to, or greater than handB. */ - private int compareHands(LinkedList handA, LinkedList handB) { - // TODO implement compareHands - return 0; + protected int compareHands(LinkedList handA, LinkedList handB) { + int scoreA = this.scoreHand(handA); + int scoreB = this.scoreHand(handB); + + if(scoreA == 21 && scoreB == 21){ + if(handA.size() == 2 && handB.size() != 2){ + return 1; //Hand A wins + } else if (handA.size() != 2 && handB.size() == 2) { + return -1; //Hand B wins + } else { + return 0; //Tie + } + } else { + return Integer.compare(scoreA, scoreB); + } } /** diff --git a/10_Blackjack/java/test/GameTest.java b/10_Blackjack/java/test/GameTest.java index ad0d625b..00ced688 100644 --- a/10_Blackjack/java/test/GameTest.java +++ b/10_Blackjack/java/test/GameTest.java @@ -213,4 +213,113 @@ public class GameTest { // Then assertEquals(13, result); } + + @Test + @DisplayName("compareHands should return 1 meaning A beat B, 20 to 12") + public void compareHandsAWins() { + + givenStubGame(); + LinkedList handA = new LinkedList<>(); + handA.add(new Card(10, Card.Suit.SPADES)); + handA.add(new Card(10, Card.Suit.CLUBS)); + + LinkedList handB = new LinkedList<>(); + handB.add(new Card(1, Card.Suit.SPADES)); + handB.add(new Card(1, Card.Suit.CLUBS)); + + int result = game.compareHands(handA,handB); + + assertEquals(1, result); + } + + @Test + @DisplayName("compareHands should return -1 meaning B beat A, 18 to 4") + public void compareHandsBwins() { + givenStubGame(); + LinkedList handA = new LinkedList<>(); + handA.add(new Card(2, Card.Suit.SPADES)); + handA.add(new Card(2, Card.Suit.CLUBS)); + + LinkedList handB = new LinkedList<>(); + handB.add(new Card(5, Card.Suit.SPADES)); + handB.add(new Card(6, Card.Suit.HEARTS)); + handB.add(new Card(7, Card.Suit.CLUBS)); + + int result = game.compareHands(handA,handB); + + assertEquals(-1, result); + } + + @Test + @DisplayName("compareHands should return 1 meaning A beat B, natural Blackjack to Blackjack") + public void compareHandsAWinsWithNaturalBlackJack() { + //Hand A wins with natural BlackJack, B with Blackjack + givenStubGame(); + LinkedList handA = new LinkedList<>(); + handA.add(new Card(10, Card.Suit.SPADES)); + handA.add(new Card(1, Card.Suit.CLUBS)); + + LinkedList handB = new LinkedList<>(); + handB.add(new Card(6, Card.Suit.SPADES)); + handB.add(new Card(7, Card.Suit.HEARTS)); + handB.add(new Card(8, Card.Suit.CLUBS)); + + int result = game.compareHands(handA,handB); + + assertEquals(1, result); + } + + @Test + @DisplayName("compareHands should return -1 meaning B beat A, natural Blackjack to Blackjack") + public void compareHandsBWinsWithNaturalBlackJack() { + givenStubGame(); + LinkedList handA = new LinkedList<>(); + handA.add(new Card(6, Card.Suit.SPADES)); + handA.add(new Card(7, Card.Suit.HEARTS)); + handA.add(new Card(8, Card.Suit.CLUBS)); + + LinkedList handB = new LinkedList<>(); + handB.add(new Card(10, Card.Suit.SPADES)); + handB.add(new Card(1, Card.Suit.CLUBS)); + + int result = game.compareHands(handA,handB); + + assertEquals(-1, result); + } + + @Test + @DisplayName("compareHands should return 0, hand A and B tied with a Blackjack") + public void compareHandsTieBothBlackJack() { + givenStubGame(); + LinkedList handA = new LinkedList<>(); + handA.add(new Card(11, Card.Suit.SPADES)); + handA.add(new Card(10, Card.Suit.CLUBS)); + + LinkedList handB = new LinkedList<>(); + handB.add(new Card(10, Card.Suit.SPADES)); + handB.add(new Card(11, Card.Suit.CLUBS)); + + int result = game.compareHands(handA,handB); + + assertEquals(0, result); + } + + @Test + @DisplayName("compareHands should return 0, hand A and B tie without a Blackjack") + public void compareHandsTieNoBlackJack() { + givenStubGame(); + LinkedList handA = new LinkedList<>(); + handA.add(new Card(10, Card.Suit.DIAMONDS)); + handA.add(new Card(10, Card.Suit.HEARTS)); + + LinkedList handB = new LinkedList<>(); + handB.add(new Card(10, Card.Suit.SPADES)); + handB.add(new Card(10, Card.Suit.CLUBS)); + + int result = game.compareHands(handA,handB); + + assertEquals(0, result); + } + + } diff --git a/10_Blackjack/java/test/UserIoTest.java b/10_Blackjack/java/test/UserIoTest.java index 2c27b609..a2fccc26 100644 --- a/10_Blackjack/java/test/UserIoTest.java +++ b/10_Blackjack/java/test/UserIoTest.java @@ -70,7 +70,7 @@ public class UserIoTest { @DisplayName("promptInt should print an error and reprompt if given a non-numeric response") public void testPromptIntRepromptsOnNonNumeric() { // Given - Reader in = new StringReader("foo\n1"); // word, then number + Reader in = new StringReader("foo" + System.lineSeparator() +"1"); // word, then number StringWriter out = new StringWriter(); UserIo userIo = new UserIo(in, out); @@ -78,7 +78,7 @@ public class UserIoTest { int result = userIo.promptInt("TEST"); // Then - assertEquals("TEST? !NUMBER EXPECTED - RETRY INPUT LINE\n? ", out.toString()); + assertEquals("TEST? !NUMBER EXPECTED - RETRY INPUT LINE" + System.lineSeparator() +"? ", out.toString()); assertEquals(1, result); } }