rora 0.0.6 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/README.md +59 -15
  2. data/Rakefile +0 -1
  3. data/lib/rora.rb +4 -0
  4. data/lib/rora/{hands.csv → 5-card-hands.csv} +0 -0
  5. data/lib/rora/7-card-hands.csv +323765 -0
  6. data/lib/rora/cards.csv +52 -0
  7. data/lib/rora/flushes.csv +40 -0
  8. data/lib/rora/model/board.rb +2 -2
  9. data/lib/rora/model/card.rb +17 -14
  10. data/lib/rora/model/deck.rb +23 -0
  11. data/lib/rora/model/equity.rb +18 -0
  12. data/lib/rora/model/hand.rb +12 -27
  13. data/lib/rora/model/hand_type.rb +1 -1
  14. data/lib/rora/model/pot.rb +1 -1
  15. data/lib/rora/model/rank.rb +34 -16
  16. data/lib/rora/model/starting_hand.rb +22 -18
  17. data/lib/rora/model/suit.rb +26 -11
  18. data/lib/rora/model/table.rb +0 -3
  19. data/lib/rora/repository/card_repository.rb +17 -0
  20. data/lib/rora/repository/hand_repository.rb +60 -20
  21. data/lib/rora/repository/starting_hand_repository.rb +2 -1
  22. data/lib/rora/utils/equity_calculator.rb +47 -0
  23. data/lib/rora/utils/hand_ranking_generator.rb +135 -0
  24. data/test/rora/model/board_test.rb +19 -20
  25. data/test/rora/model/card_test.rb +45 -15
  26. data/test/rora/model/deck_test.rb +24 -0
  27. data/test/rora/model/hand_test.rb +5 -29
  28. data/test/rora/model/hand_type_test.rb +3 -3
  29. data/test/rora/model/pot_test.rb +2 -2
  30. data/test/rora/model/rank_test.rb +10 -2
  31. data/test/rora/model/seat_test.rb +1 -1
  32. data/test/rora/model/starting_hand_test.rb +8 -16
  33. data/test/rora/model/suit_test.rb +3 -3
  34. data/test/rora/model/table_test.rb +8 -8
  35. data/test/rora/repository/hand_repository_test.rb +14 -16
  36. data/test/rora/utils/equity_calculator_test.rb +53 -0
  37. data/test/rora_test.rb +1 -1
  38. metadata +13 -6
  39. data/test/rora/model/game_test.rb +0 -23
@@ -1,11 +1,45 @@
1
1
  require File.expand_path("../../rora_test", File.dirname(__FILE__))
2
2
 
3
3
  class CardTest < ActiveSupport::TestCase
4
-
5
4
  def setup
6
5
  @card = Card.new("AS")
7
6
  end
8
7
 
8
+ test "should be able to sort cards by rank" do
9
+ cards = Card.to_cards "2H,4D,QS,JC,7D,TC,AH,KD,6H,9D,3S,5C,8C"
10
+ cards.sort!
11
+
12
+ assert_equal "Ace of Hearts", cards[0].value
13
+ assert_equal "King of Diamonds", cards[1].value
14
+ assert_equal "Queen of Spades", cards[2].value
15
+ assert_equal "Jack of Clubs", cards[3].value
16
+ assert_equal "Ten of Clubs", cards[4].value
17
+ assert_equal "Nine of Diamonds", cards[5].value
18
+ assert_equal "Eight of Clubs", cards[6].value
19
+ assert_equal "Seven of Diamonds", cards[7].value
20
+ assert_equal "Six of Hearts", cards[8].value
21
+ assert_equal "Five of Clubs", cards[9].value
22
+ assert_equal "Four of Diamonds", cards[10].value
23
+ assert_equal "Three of Spades", cards[11].value
24
+ assert_equal "Two of Hearts", cards[12].value
25
+ end
26
+
27
+ test "should be able to sort cards by suit" do
28
+ cards = Card.to_cards "AS,AH,AD,AC"
29
+ cards.sort!
30
+
31
+ assert_equal "Ace of Hearts", cards[0].value
32
+ assert_equal "Ace of Diamonds", cards[1].value
33
+ assert_equal "Ace of Spades", cards[2].value
34
+ assert_equal "Ace of Clubs", cards[3].value
35
+
36
+ end
37
+
38
+ test "should be able to identify duplicate cards" do
39
+ cards = Card.to_cards("AS,AS,KS,KS")
40
+ assert_equal 2, cards.uniq.size
41
+ end
42
+
9
43
  test "should be able to create a card with the specified rank and suit" do
10
44
  card = Card.new(Rank::ACE, Suit::SPADE)
11
45
  assert_equal card.rank, Rank::ACE
@@ -18,37 +52,33 @@ class CardTest < ActiveSupport::TestCase
18
52
  assert_equal card.suit, Suit::SPADE
19
53
  end
20
54
 
55
+ test "should have an id" do
56
+ assert_equal 103, @card.uid
57
+ end
58
+
21
59
  test "should raise an exception when attempting to create a card with an invalid string value" do
22
- assert_raise ArgumentError do
60
+ assert_raise_message "A is an invalid card sequence", ArgumentError do
23
61
  card = Card.new("A")
24
62
  end
25
- assert_raise ArgumentError do
63
+ assert_raise_message "ASK is an invalid card sequence", ArgumentError do
26
64
  card = Card.new("ASK")
27
65
  end
28
66
  end
29
67
 
30
- test "a card should have an id" do
31
- assert_equal 1927, @card.id
32
- end
33
-
34
- test "a card id should be equal to the product of the card suit id and rank id" do
35
- assert_equal @card.id, (Rank::ACE.id * Suit::SPADE.id)
36
- end
37
-
38
68
  test "a card should have a key" do
39
69
  assert_equal "AS", @card.key
40
70
  end
41
71
 
42
- test "a card key should be equal to the concatenation of the card suit key and rank key" do
72
+ test "a card key should be equal to the concatenation of the cards' suit key and rank key" do
43
73
  assert_equal "AS", (Rank::ACE.key + Suit::SPADE.key)
44
74
  end
45
75
 
46
- test "a card should have a name" do
47
- assert_equal "Ace of Spades", Card.new("AS").name
76
+ test "a card should have a value" do
77
+ assert_equal "Ace of Spades", Card.new("AS").value
48
78
  end
49
79
 
50
80
  test "should generate a readable string representation" do
51
- assert_equal "Card: Ace of Spades", Card.new("AS").to_s
81
+ assert_equal "Ace of Spades", Card.new("AS").to_s
52
82
  end
53
83
 
54
84
  test "should convert an arbitrarily long string of characters into an array of cards" do
@@ -111,4 +111,28 @@ class DeckTest < ActiveSupport::TestCase
111
111
  assert_equal true, @deck.contains_any?("AH,KH,QH,JH,KS")
112
112
  end
113
113
 
114
+ test "should remove all spades from the deck" do
115
+ @deck.remove_all(Suit::SPADE)
116
+ assert_equal 39, @deck.cards.size
117
+ assert_equal 0, @deck.count_cards_with_suit(Suit::SPADE)
118
+ end
119
+
120
+ test "should remove all kings from the deck" do
121
+ @deck.remove_all(Rank::KING)
122
+ assert_equal 48, @deck.cards.size
123
+ assert_equal 0, @deck.count_cards_with_rank(Rank::KING)
124
+ end
125
+
126
+ test "should retain all spades in the deck" do
127
+ @deck.retain_all(Suit::SPADE)
128
+ assert_equal 13, @deck.cards.size
129
+ assert_equal 13, @deck.count_cards_with_suit(Suit::SPADE)
130
+ end
131
+
132
+ test "should retain all kings in the deck" do
133
+ @deck.retain_all(Rank::KING)
134
+ assert_equal 4, @deck.cards.size
135
+ assert_equal 4, @deck.count_cards_with_rank(Rank::KING)
136
+ end
137
+
114
138
  end
@@ -7,45 +7,25 @@ class HandTest < ActiveSupport::TestCase
7
7
  end
8
8
 
9
9
  test "should raise an error when a hand is not created with 5 cards" do
10
- assert_raise ArgumentError do
10
+ assert_raise_message "Exactly 5 cards are required to create a hand, 2 provided", ArgumentError do
11
11
  Hand.new [Card.new("AS"), Card.new("KS")]
12
12
  end
13
13
  end
14
14
 
15
15
  test "should raise an error when a hand is not created with 10 characters" do
16
- assert_raise ArgumentError do
16
+ assert_raise_message "Exactly 5 cards are required to create a hand, 8 provided", ArgumentError do
17
17
  Hand.new "ASKSQSJS"
18
18
  end
19
19
  end
20
20
 
21
21
  test "should raise an error when creating a hand with duplicate cards" do
22
- assert_raise ArgumentError do
22
+ assert_raise_message "The hand contains duplicate cards", ArgumentError do
23
23
  Hand.new "AS KS JS AS KS"
24
24
  end
25
25
  end
26
26
 
27
- test "the hand should have an id" do
28
- assert_equal 7193866898674063, @hand.id
29
- end
30
-
31
- test "the hand id should be equal to the product of each card id contained in the hand" do
32
- assert_equal @hand.id, (Card.new("AS").id * Card.new("KS").id * Card.new("QS").id * Card.new("JS").id * Card.new("TS").id)
33
- end
34
-
35
- test "the hand should have a hash key" do
36
- assert_equal 2101589603, @hand.hash_key
37
- end
38
-
39
- test "the hash key should be equal to the product of each card rank id in the hand times" do
40
- assert_equal Hand.new("ASACAHJSTS").hash_key, (Card.new("AS").rank.id * Card.new("AC").rank.id * Card.new("AH").rank.id * Card.new("JS").rank.id * Card.new("TS").rank.id)
41
- end
42
-
43
- test "the hash key should be equal to the product of each card rank id in the hand times 67 when the hand is a flush" do
44
- assert_equal @hand.hash_key, (Card.new("AS").rank.id * Card.new("KS").rank.id * Card.new("QS").rank.id * Card.new("JS").rank.id * Card.new("TS").rank.id * 67)
45
- end
46
-
47
- test "the hand should have a value" do
48
- assert_equal "AS,KS,QS,JS,TS", @hand.value
27
+ test "the hand should have a hand key" do
28
+ assert_equal "ASKSQSJSTS", @hand.key
49
29
  end
50
30
 
51
31
  test "the hand should be a flush" do
@@ -60,10 +40,6 @@ class HandTest < ActiveSupport::TestCase
60
40
  assert_equal 1, @hand.score
61
41
  end
62
42
 
63
- test "the hand should have a probability" do
64
- assert_equal 0.0015, @hand.probability
65
- end
66
-
67
43
  test "the hand should have a name" do
68
44
  assert_equal "Royal Flush", @hand.name
69
45
  end
@@ -15,19 +15,19 @@ class HandTypeTest < ActiveSupport::TestCase
15
15
  end
16
16
 
17
17
  test "should raise an error when performing a lookup with an invalid key" do
18
- assert_raise ArgumentError do
18
+ assert_raise_message "No hand type exists for key 'L'", ArgumentError do
19
19
  HandType.get "L"
20
20
  end
21
21
  end
22
22
 
23
23
  test "should raise an error when performing a lookup with an empty key" do
24
- assert_raise ArgumentError do
24
+ assert_raise_message "No hand type exists for key ''", ArgumentError do
25
25
  HandType.get ""
26
26
  end
27
27
  end
28
28
 
29
29
  test "should raise an error when performing a lookup with a nil key" do
30
- assert_raise TypeError do
30
+ assert_raise_message "can't convert nil into String", TypeError do
31
31
  HandType.get nil
32
32
  end
33
33
  end
@@ -1,7 +1,7 @@
1
1
  require File.expand_path("../../rora_test", File.dirname(__FILE__))
2
2
 
3
3
  class PotTest < ActiveSupport::TestCase
4
-
4
+
5
5
  def setup
6
6
  @pot = Pot.new
7
7
  end
@@ -11,7 +11,7 @@ class PotTest < ActiveSupport::TestCase
11
11
  end
12
12
 
13
13
  test "should raise an error when attempting to add a negative value to the pot" do
14
- assert_raise ArgumentError do
14
+ assert_raise_message "Can only add positive values", ArgumentError do
15
15
  @pot.add -0.50
16
16
  end
17
17
  end
@@ -27,7 +27,7 @@ class RankTest < ActiveSupport::TestCase
27
27
  end
28
28
 
29
29
  test "should raise an error when performing a lookup with an empty key" do
30
- assert_raise_message "No rank exists for key ''", ArgumentError do
30
+ assert_raise_message "No rank exists for key ''", ArgumentError do
31
31
  Rank.get ""
32
32
  end
33
33
  end
@@ -39,7 +39,15 @@ class RankTest < ActiveSupport::TestCase
39
39
  end
40
40
 
41
41
  test "should generate a readable string representation" do
42
- assert_equal "Rank: Ace", Rank::ACE.to_s
42
+ assert_equal "Ace", Rank::ACE.to_s
43
+ end
44
+
45
+ test "two identical ranks should be equal" do
46
+ assert_equal true, Rank::ACE == Rank::ACE
47
+ end
48
+
49
+ test "two different ranks should not be equal" do
50
+ assert_equal false, Rank::EIGHT == Rank::FIVE
43
51
  end
44
52
 
45
53
  end
@@ -7,7 +7,7 @@ class SeatTest < ActiveSupport::TestCase
7
7
  end
8
8
 
9
9
  test "should raise an error when a seat is created with a seat number less than 1" do
10
- assert_raise ArgumentError do
10
+ assert_raise_message "Must create a seat number with a value of 1 or greater", ArgumentError do
11
11
  Seat.new 0
12
12
  end
13
13
  end
@@ -2,24 +2,20 @@ require File.expand_path("../../rora_test", File.dirname(__FILE__))
2
2
 
3
3
  class StartingHandTest < ActiveSupport::TestCase
4
4
 
5
- def setup
6
- @hand = StartingHand.new "ASKS"
7
- end
8
-
9
5
  test "should raise an error when a starting hand is not created with 2 cards" do
10
- assert_raise ArgumentError do
6
+ assert_raise_message "Exactly 2 cards are required to create a starting hand, 3 provided", ArgumentError do
11
7
  StartingHand.new [Card.new("AS"), Card.new("KS"), Card.new("QS")]
12
8
  end
13
9
  end
14
10
 
15
11
  test "should raise an error when a starting hand is not created with 4 characters" do
16
- assert_raise ArgumentError do
12
+ assert_raise_message "Exactly 2 cards are required to create a starting hand, 4 provided", ArgumentError do
17
13
  StartingHand.new "ASKSQSJS"
18
14
  end
19
15
  end
20
16
 
21
17
  test "should raise an error when creating a starting hand with duplicate cards" do
22
- assert_raise ArgumentError do
18
+ assert_raise_message "The starting hand contains duplicate cards", ArgumentError do
23
19
  StartingHand.new "ASAS"
24
20
  end
25
21
  end
@@ -33,7 +29,7 @@ class StartingHandTest < ActiveSupport::TestCase
33
29
  end
34
30
 
35
31
  test "the starting hand should have a value" do
36
- assert_equal "AS,KS", StartingHand.new("ASKS").value
32
+ assert_equal "Ace of Spades, King of Spades", StartingHand.new("ASKS").value
37
33
  end
38
34
 
39
35
  test "the starting hand should have a short value" do
@@ -48,16 +44,12 @@ class StartingHandTest < ActiveSupport::TestCase
48
44
  assert_equal false, StartingHand.new("ASKH").pocket_pair?
49
45
  end
50
46
 
51
- test "the starting hand should have an id that is equal to the product of the card ids" do
52
- assert_equal StartingHand.new("ASKH").id, (Card.new("AS").id * Card.new("KH").id)
53
- end
54
-
55
- test "the starting hand should have a key that is equal to the product of the card rank ids when the starting hand is unsuited" do
56
- assert_equal StartingHand.new("ASKH").key, (Card.new("AS").rank.id * Card.new("KH").rank.id)
47
+ test "the starting hand should have a key that is composed of the card keys" do
48
+ assert_equal "ASKH", StartingHand.new("ASKH").key
57
49
  end
58
50
 
59
- test "the starting hand should have a key that is equal to 67 times the product of the card rank ids when the starting hand is suited" do
60
- assert_equal StartingHand.new("ASKS").key, (Card.new("AS").rank.id * Card.new("KS").rank.id * 67)
51
+ test "the starting hand key should have a consistent ordering" do
52
+ assert_equal "ASKH", StartingHand.new("KHAS").key
61
53
  end
62
54
 
63
55
  test "should return all starting hands" do
@@ -21,13 +21,13 @@ class SuitTest < ActiveSupport::TestCase
21
21
  end
22
22
 
23
23
  test "should raise an error when performing a lookup with an invalid key" do
24
- assert_raise ArgumentError do
24
+ assert_raise_message "No suit exists for key 'L'", ArgumentError do
25
25
  Suit.get("L")
26
26
  end
27
27
  end
28
28
 
29
29
  test "should raise an error when performing a lookup with an empty key" do
30
- assert_raise ArgumentError do
30
+ assert_raise_message "No suit exists for key ''", ArgumentError do
31
31
  Suit.get("")
32
32
  end
33
33
  end
@@ -39,7 +39,7 @@ class SuitTest < ActiveSupport::TestCase
39
39
  end
40
40
 
41
41
  test "should generate a readable string representation" do
42
- assert_equal "Suit: Spades", Suit::SPADE.to_s
42
+ assert_equal "Spades", Suit::SPADE.to_s
43
43
  end
44
44
 
45
45
  end
@@ -39,7 +39,7 @@ class TableTest < ActiveSupport::TestCase
39
39
  end
40
40
 
41
41
  test "should raise an error when a table is created with less than two seats" do
42
- assert_raise ArgumentError, "A table must have at least two seats" do
42
+ assert_raise_message "A table must have at least two seats", ArgumentError do
43
43
  Table.new 1
44
44
  end
45
45
  end
@@ -56,19 +56,19 @@ class TableTest < ActiveSupport::TestCase
56
56
 
57
57
  test "should raise an error when attempting to seat a player at a seat that is already taken" do
58
58
  @table.add "player1", 4
59
- assert_raise ArgumentError, "Seat number 4 is already taken by another player" do
59
+ assert_raise_message "Seat number 4 is already taken by another player", ArgumentError do
60
60
  @table.add "player2", 4
61
61
  end
62
62
  end
63
63
 
64
64
  test "should raise an error when attempting to seat a player at a seat that does not exist" do
65
- assert_raise ArgumentError, "Seat number 11 does not exist at this table" do
65
+ assert_raise_message "Seat number 11 does not exist at this table", ArgumentError do
66
66
  @table.add "player", 11
67
67
  end
68
- assert_raise ArgumentError, "Seat number 0 does not exist at this table" do
68
+ assert_raise_message "Seat number 0 does not exist at this table", ArgumentError do
69
69
  @table.add "player", 0
70
70
  end
71
- assert_raise ArgumentError, "Seat number -3 does not exist at this table" do
71
+ assert_raise_message "Seat number -3 does not exist at this table", ArgumentError do
72
72
  @table.add "player", -3
73
73
  end
74
74
  end
@@ -100,7 +100,7 @@ class TableTest < ActiveSupport::TestCase
100
100
 
101
101
  test "should raise an error when attempting to seat a player at a full table" do
102
102
  (1..9).each {|x| @table.add("player#{x}")}
103
- assert_raise RuntimeError do
103
+ assert_raise_message "Cannot add player, the table is full", RuntimeError do
104
104
  @table.add "player 10"
105
105
  end
106
106
  end
@@ -135,7 +135,7 @@ class TableTest < ActiveSupport::TestCase
135
135
 
136
136
  test "should raise an error when trying to find the next player to act when there are less than two players at the table" do
137
137
  @table.add("Player 1", 1)
138
- assert_raise RuntimeError, "Cannot find the next player when there are less than two players at the table" do
138
+ assert_raise_message "There are fewer than two players at the table", RuntimeError do
139
139
  @table.the_seat_after @table.seat(8)
140
140
  end
141
141
  end
@@ -160,7 +160,7 @@ class TableTest < ActiveSupport::TestCase
160
160
 
161
161
  test "should raise an error when trying to find the previous player to act when there are less than two players at the table" do
162
162
  @table.add("Player 1", 1)
163
- assert_raise RuntimeError, "Cannot find the previous player when there are less than two players at the table" do
163
+ assert_raise_message "There are fewer than two players at the table", RuntimeError do
164
164
  @table.the_seat_before @table.seat(8)
165
165
  end
166
166
  end
@@ -1,26 +1,24 @@
1
1
  require File.expand_path("../../rora_test", File.dirname(__FILE__))
2
2
 
3
3
  class HandRepositoyTest < ActiveSupport::TestCase
4
-
4
+
5
5
  def setup
6
6
  @repository = HandRepository.instance
7
7
  end
8
8
 
9
- test "should be able to find a poker hand by id" do
10
- result = @repository.find 2101589603
9
+ test "should be able to evaluate a 5 card poker hand" do
10
+ result = @repository.evaluate_5_card_hand Card.to_cards("AS,KS,QS,JS,TS")
11
11
  assert_equal 1, result[0]
12
12
  assert_equal "SF", result[1]
13
13
  assert_equal "Royal Flush", result[2]
14
- assert_equal 0.0015, result[3]
15
14
  end
16
15
 
17
- test "should raise an error when attempting to find a poker hand with an invalid id" do
18
- assert_raise KeyError do
19
- @repository.find 210158960345
20
- end
16
+ test "should be able to evaluate a 7 card poker hand" do
17
+ result = @repository.evaluate_7_card_hand Card.to_cards("KS,3H,2S,AS,AC,AH,AD")
18
+ assert_equal 11, result[0]
21
19
  end
22
20
 
23
- test "should return every poker hand" do
21
+ test "should return all 2,598,960 poker hands" do
24
22
  assert_equal 2598960, @repository.list.size
25
23
  end
26
24
 
@@ -51,33 +49,33 @@ class HandRepositoyTest < ActiveSupport::TestCase
51
49
  end
52
50
 
53
51
  test "should return every distinct poker hand" do
54
- assert_equal 7462, @repository.list_unique.size
52
+ assert_equal 7462, @repository.list_and_group_by_hand_score.size
55
53
  end
56
54
 
57
55
  test "should return every distinct poker hand that can be made with the given starting hand" do
58
- assert_equal 620, @repository.list_unique(:starting_hand => StartingHand.new("AS,KS")).size
56
+ assert_equal 620, @repository.list_and_group_by_hand_score(:starting_hand => StartingHand.new("AS,KS")).size
59
57
  end
60
58
 
61
59
  test "should return every distinct poker hand that can be made with the given starting hand and deck" do
62
60
  deck = Deck.new.remove "AH,KH,AD,KD"
63
- assert_equal 594, @repository.list_unique(:starting_hand => StartingHand.new("AS,KS"), :deck => deck).size
61
+ assert_equal 594, @repository.list_and_group_by_hand_score(:starting_hand => StartingHand.new("AS,KS"), :deck => deck).size
64
62
  end
65
63
 
66
64
  test "should return every distinct poker hand that can be made with the given starting hand, flop, turn and river" do
67
- assert_equal 21, @repository.list_unique(:starting_hand => StartingHand.new("AS,KS"), :board => Board.new("QS,JS,TS,4H,3H")).size
65
+ assert_equal 21, @repository.list_and_group_by_hand_score(:starting_hand => StartingHand.new("AS,KS"), :board => Board.new("QS,JS,TS,4H,3H")).size
68
66
  end
69
67
 
70
68
  test "should return every distinct poker hand that can be made with the given starting hand, flop and turn" do
71
- assert_equal 212, @repository.list_unique(:starting_hand => StartingHand.new("AS,KS"), :board => Board.new("QS,JS,TS,4H")).size
69
+ assert_equal 212, @repository.list_and_group_by_hand_score(:starting_hand => StartingHand.new("AS,KS"), :board => Board.new("QS,JS,TS,4H")).size
72
70
  end
73
71
 
74
72
  test "should return every distinct poker hand that can be made with the given starting hand and flop" do
75
- assert_equal 1042, @repository.list_unique(:starting_hand => StartingHand.new("AS,KS"), :board => Board.new("QS,JS,TS")).size
73
+ assert_equal 1042, @repository.list_and_group_by_hand_score(:starting_hand => StartingHand.new("AS,KS"), :board => Board.new("QS,JS,TS")).size
76
74
  end
77
75
 
78
76
  test "should return every distinct poker hand that can be made with the given starting hand, flop and deck" do
79
77
  deck = Deck.new.remove "AH,KH,AD,KD"
80
- assert_equal 1030, @repository.list_unique(:starting_hand => StartingHand.new("AS,KS"), :board => Board.new("QS,JS,TS"), :deck => deck).size
78
+ assert_equal 1030, @repository.list_and_group_by_hand_score(:starting_hand => StartingHand.new("AS,KS"), :board => Board.new("QS,JS,TS"), :deck => deck).size
81
79
  end
82
80
 
83
81
  end