From c503e6422e47470b040ee94278d579c26e65686b Mon Sep 17 00:00:00 2001
From: Dominic Masters <dominic@domsplace.com>
Date: Mon, 4 Oct 2021 00:45:39 -0700
Subject: [PATCH] Even more tests again.

---
 src/poker2/poker.c  |  38 +++++++++++++++
 src/poker2/poker.h  |  23 ++++++++-
 test/poker2/poker.c | 114 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 174 insertions(+), 1 deletion(-)

diff --git a/src/poker2/poker.c b/src/poker2/poker.c
index 608e0a28..e4608b64 100644
--- a/src/poker2/poker.c
+++ b/src/poker2/poker.c
@@ -189,6 +189,10 @@ uint8_t pokerPlayerGetNextBetter(poker2_t *poker, uint8_t current) {
   return 0xFF;
 }
 
+int32_t pokerPlayerGetCallBet(poker2_t *poker, poker2player_t *player) {
+  return pokerGetCallValue(poker) - player->currentBet;
+}
+
 // Betting
 void pokerPlayerBetPot(
   poker2_t *poker, poker2pot_t *pot, uint8_t playerIndex, int32_t chips
@@ -206,4 +210,38 @@ void pokerPlayerBet(poker2_t *poker, uint8_t playerIndex, int32_t chips) {
   pokerPlayerBetPot(
     poker, poker->pots + (poker->potCount - 1), playerIndex, chips
   );
+}
+
+poker2turn_t pokerTurnFold(poker2_t *poker, uint8_t player) {
+  return (poker2turn_t){
+    .chips = 0,
+    .confidence = 1,
+    .type = POKER_TURN_TYPE_FOLD
+  };
+}
+
+poker2turn_t pokerTurnBet(poker2_t *poker, uint8_t playerIndex, int32_t chips) {
+  poker2turn_t turn;
+  poker2player_t *player;
+  int32_t i;
+  player = poker->players + playerIndex;
+  turn.confidence = 1;
+
+  if(chips == 0) {
+    turn.type = POKER_TURN_TYPE_CHECK;
+    turn.chips = 0;
+  } else if(player->chips <= chips) {
+    turn.chips = player->chips;
+    turn.type = POKER_TURN_TYPE_ALL_IN;
+  } else {
+    turn.chips = chips;
+    turn.type = POKER_TURN_TYPE_BET;
+    i = pokerGetCallValue(poker);
+
+    if(chips == (i - player->currentBet)) {
+      turn.type = POKER_TURN_TYPE_CALL;
+    }
+  }
+
+  return turn;
 }
\ No newline at end of file
diff --git a/src/poker2/poker.h b/src/poker2/poker.h
index 60537f82..d1d09420 100644
--- a/src/poker2/poker.h
+++ b/src/poker2/poker.h
@@ -23,6 +23,14 @@
 #define POKER_COMMUNITY_SIZE_MAX 5
 #define POKER_POT_COUNT_MAX POKER_PLAYER_COUNT_MAX
 
+#define POKER_TURN_TYPE_OUT 0x00
+#define POKER_TURN_TYPE_FOLD 0x01
+#define POKER_TURN_TYPE_BET 0x02
+#define POKER_TURN_TYPE_CALL 0x03
+#define POKER_TURN_TYPE_ALL_IN 0x04
+#define POKER_TURN_TYPE_CALL_ALL_IN 0x04
+#define POKER_TURN_TYPE_CHECK 0x05
+
 typedef struct {
   int32_t chips;
   card_t cards[POKER_PLAYER_HAND_SIZE_MAX];
@@ -37,6 +45,12 @@ typedef struct {
   uint8_t playerCount;
 } poker2pot_t;
 
+typedef struct {
+  uint8_t type;
+  int32_t chips;
+  float confidence;
+} poker2turn_t;
+
 typedef struct {
   card_t deck[CARD_DECK_SIZE];
   uint8_t deckSize;
@@ -83,7 +97,14 @@ void pokerPlayerDealAll(poker2_t *poker, uint8_t count);
 bool pokerPlayerDoesNeedToBetThisRound(poker2_t *poker, uint8_t playerIndex);
 uint8_t pokerPlayerGetRemainingBetter(poker2_t *poker);
 uint8_t pokerPlayerGetNextBetter(poker2_t *poker, uint8_t current);
+int32_t pokerPlayerGetCallBet(poker2_t *poker, poker2player_t *player);
 void pokerPlayerBetPot(
   poker2_t *poker, poker2pot_t *pot, uint8_t playerIndex, int32_t chips
 );
-void pokerPlayerBet(poker2_t *poker, uint8_t playerIndex, int32_t chips);
\ No newline at end of file
+void pokerPlayerBet(poker2_t *poker, uint8_t playerIndex, int32_t chips);
+
+poker2turn_t pokerTurnFold(poker2_t *poker, uint8_t player);
+poker2turn_t pokerTurnBet(poker2_t *poker, uint8_t playerIndex, int32_t chips);
+
+poker2turn_t pokerTurnFold(poker2_t *poker, uint8_t player);
+poker2turn_t pokerTurnBet(poker2_t *poker, uint8_t playerIndex, int32_t chips);
\ No newline at end of file
diff --git a/test/poker2/poker.c b/test/poker2/poker.c
index 36e26879..0aa9d34b 100644
--- a/test/poker2/poker.c
+++ b/test/poker2/poker.c
@@ -649,6 +649,31 @@ void test_pokerPlayerGetNextBetter_should_GetTheNextBetter(void) {
   TEST_ASSERT_EQUAL_UINT8(0x00, better);
 }
 
+void test_pokerPlayerGetCallBet_should_GetCallBet(void) {
+  poker2_t poker;
+  uint8_t p0, p1, p2;
+
+  pokerInit(&poker);
+  p0 = pokerPlayerAdd(&poker);
+  p1 = pokerPlayerAdd(&poker);
+  p2 = pokerPlayerAdd(&poker);
+
+  pokerPlayerBet(&poker, p0, 100);
+  TEST_ASSERT_EQUAL_INT32(0, pokerPlayerGetCallBet(&poker,poker.players+p0));
+  TEST_ASSERT_EQUAL_INT32(100, pokerPlayerGetCallBet(&poker,poker.players+p1));
+  TEST_ASSERT_EQUAL_INT32(100, pokerPlayerGetCallBet(&poker,poker.players+p2));
+
+  pokerPlayerBet(&poker, p1, 200);
+  TEST_ASSERT_EQUAL_INT32(100, pokerPlayerGetCallBet(&poker,poker.players+p0));
+  TEST_ASSERT_EQUAL_INT32(0, pokerPlayerGetCallBet(&poker,poker.players+p1));
+  TEST_ASSERT_EQUAL_INT32(200, pokerPlayerGetCallBet(&poker,poker.players+p2));
+
+  pokerPlayerBet(&poker, p2, 300);
+  TEST_ASSERT_EQUAL_INT32(200, pokerPlayerGetCallBet(&poker,poker.players+p0));
+  TEST_ASSERT_EQUAL_INT32(100, pokerPlayerGetCallBet(&poker,poker.players+p1));
+  TEST_ASSERT_EQUAL_INT32(0, pokerPlayerGetCallBet(&poker,poker.players+p2));
+}
+
 void test_pokerPlayerBetPot_should_AddChipsToThePot(void) {
   poker2_t poker;
   poker2pot_t *pot;
@@ -711,6 +736,88 @@ void test_pokerPlayerBet_should_BetToTheActivePot(void) {
   TEST_ASSERT_EQUAL_INT32(50, pot->chips);
 }
 
+void test_pokerTurnFold_should_ReturnAFoldAction(void) {
+  poker2_t poker;
+  poker2turn_t turn;
+  pokerInit(&poker);
+  pokerPlayerAdd(&poker);
+
+  turn = pokerTurnFold(&poker, 0x00);
+  TEST_ASSERT_EQUAL_INT32(0, turn.chips);
+  TEST_ASSERT_EQUAL_UINT8(POKER_TURN_TYPE_FOLD, turn.type);
+  TEST_ASSERT_EQUAL_FLOAT(1.0f, turn.confidence);
+}
+
+void test_pokerTurnBet_should_ReturnACheckAction(void) {
+  poker2_t poker;
+  poker2turn_t turn;
+  pokerInit(&poker);
+  pokerPlayerAdd(&poker);
+
+  turn = pokerTurnBet(&poker, 0x00, 0);
+  TEST_ASSERT_EQUAL_INT32(0, turn.chips);
+  TEST_ASSERT_EQUAL_UINT8(POKER_TURN_TYPE_CHECK, turn.type);
+  TEST_ASSERT_EQUAL_FLOAT(1.0f, turn.confidence);
+}
+
+void test_pokerTurnBet_should_ReturnAnAllInAction(void) {
+  poker2_t poker;
+  poker2turn_t turn;
+  pokerInit(&poker);
+  pokerPlayerAdd(&poker);
+  pokerPlayerChipsAdd(poker.players, 500);
+
+  turn = pokerTurnBet(&poker, 0x00, 500);
+  TEST_ASSERT_EQUAL_INT32(500, turn.chips);
+  TEST_ASSERT_EQUAL_UINT8(POKER_TURN_TYPE_ALL_IN, turn.type);
+  TEST_ASSERT_EQUAL_FLOAT(1.0f, turn.confidence);
+
+  pokerPlayerChipsAdd(poker.players, 500);
+  turn = pokerTurnBet(&poker, 0x00, 1001);
+  TEST_ASSERT_EQUAL_INT32(1000, turn.chips);
+  TEST_ASSERT_EQUAL_UINT8(POKER_TURN_TYPE_ALL_IN, turn.type);
+  TEST_ASSERT_EQUAL_FLOAT(1.0f, turn.confidence);
+}
+
+void test_pokerTurnBet_should_ReturnACallAction(void) {
+  poker2_t poker;
+  poker2turn_t turn;
+  pokerInit(&poker);
+  pokerPlayerChipsAdd(poker.players + pokerPlayerAdd(&poker), 1000);
+  pokerPlayerChipsAdd(poker.players + pokerPlayerAdd(&poker), 1000);
+  
+  pokerPlayerBet(&poker, 0, 300);
+  pokerPlayerBet(&poker, 1, 500);
+
+  turn = pokerTurnBet(&poker, 0x00, 200);
+  TEST_ASSERT_EQUAL_INT32(200, turn.chips);
+  TEST_ASSERT_EQUAL_UINT8(POKER_TURN_TYPE_CALL, turn.type);
+  TEST_ASSERT_EQUAL_FLOAT(1.0f, turn.confidence);
+
+  pokerPlayerBet(&poker, 0, 300);
+  turn = pokerTurnBet(&poker, 0x01, 100);
+  TEST_ASSERT_EQUAL_INT32(100, turn.chips);
+  TEST_ASSERT_EQUAL_UINT8(POKER_TURN_TYPE_CALL, turn.type);
+  TEST_ASSERT_EQUAL_FLOAT(1.0f, turn.confidence);
+}
+
+void test_pokerTurnBet_should_ReturnARaiseAction(void) {
+  poker2_t poker;
+  poker2turn_t turn;
+  pokerInit(&poker);
+  pokerPlayerChipsAdd(poker.players + pokerPlayerAdd(&poker), 1000);
+
+  turn = pokerTurnBet(&poker, 0x00, 300);
+  TEST_ASSERT_EQUAL_INT32(300, turn.chips);
+  TEST_ASSERT_EQUAL_UINT8(POKER_TURN_TYPE_BET, turn.type);
+  TEST_ASSERT_EQUAL_FLOAT(1.0f, turn.confidence);
+
+  turn = pokerTurnBet(&poker, 0x00, 200);
+  TEST_ASSERT_EQUAL_INT32(200, turn.chips);
+  TEST_ASSERT_EQUAL_UINT8(POKER_TURN_TYPE_BET, turn.type);
+  TEST_ASSERT_EQUAL_FLOAT(1.0f, turn.confidence);
+}
+
 int test_poker() {
   UNITY_BEGIN();
 
@@ -739,9 +846,16 @@ int test_poker() {
   RUN_TEST(test_pokerPlayerDoesNeedToBetThisRound_should_IgnoreFoldedPlayers);
   RUN_TEST(test_pokerPlayerGetRemainingBetter_should_ReturnRemainingBetters);
   RUN_TEST(test_pokerPlayerGetNextBetter_should_GetTheNextBetter);
+  RUN_TEST(test_pokerPlayerGetCallBet_should_GetCallBet);
   RUN_TEST(test_pokerPlayerBetPot_should_AddChipsToThePot);
   RUN_TEST(test_pokerPlayerBetPot_should_UpdatePlayerState);
   RUN_TEST(test_pokerPlayerBet_should_BetToTheActivePot);
+  RUN_TEST(test_pokerTurnFold_should_ReturnAFoldAction);
+  RUN_TEST(test_pokerTurnBet_should_ReturnACheckAction);
+  RUN_TEST(test_pokerTurnBet_should_ReturnAnAllInAction);
+  RUN_TEST(test_pokerTurnBet_should_ReturnACallAction);
+  RUN_TEST(test_pokerTurnBet_should_ReturnARaiseAction);
+
 
   return UNITY_END();
 }
\ No newline at end of file