From eaed03df54a06dc19ed3952e9b9c11e0f4d177e2 Mon Sep 17 00:00:00 2001
From: marlehmann <marlehmann@student.ethz.ch>
Date: Fri, 29 Nov 2024 17:58:16 +0100
Subject: [PATCH] updated tests

---
 unit-tests/player.cpp |   3 +-
 unit-tests/trick.cpp  | 238 ++++++++++++++++++++++++++++++++++++++----
 2 files changed, 219 insertions(+), 22 deletions(-)

diff --git a/unit-tests/player.cpp b/unit-tests/player.cpp
index c372c74..a4603f3 100644
--- a/unit-tests/player.cpp
+++ b/unit-tests/player.cpp
@@ -1,3 +1,4 @@
+
 //
 // Created by martinalavanya on 23.11.24.
 //
@@ -235,4 +236,4 @@ TEST(CardTest, SerializationException) {
     rapidjson::Document json = rapidjson::Document(rapidjson::kObjectType);
     json.Parse("not json");
     EXPECT_THROW(player::from_json(json), WizardException);
-}
+}
\ No newline at end of file
diff --git a/unit-tests/trick.cpp b/unit-tests/trick.cpp
index ee0a00a..a4603f3 100644
--- a/unit-tests/trick.cpp
+++ b/unit-tests/trick.cpp
@@ -1,43 +1,239 @@
+
 //
 // Created by martinalavanya on 23.11.24.
 //
 
 #include "gtest/gtest.h"
 #include "../src/common/exceptions/WizardException.h"
-#include "../src/common/game_state/cards/trick.h"
+#include "../src/common/game_state/player/player.h"
+#include "../src/common/game_state/player/hand.h"
 #include "../src/common/serialization/json_utils.h"
 
-class trick_testing : public ::testing::Test {
 
-protected:
-    virtual void SetUp() {
-        serializable_value<int>* trick_color = new serializable_value<int>(2);;
-        serializable_value<int>* trump_color = new serializable_value<int>(3);
-        std::vector<std::pair<card*, player*>> cards_and_players;
+TEST(PlayerTest, CreatePlayer)
+{
+    std::string name =  "vatkruidvat";
+    player test_player(name);
+
+    //check name
+    EXPECT_EQ(test_player.get_player_name(), name);
+
+    // check tricks
+    int nof_tricks = 2;
+
+    test_player.set_nof_tricks(nof_tricks);
+    EXPECT_FALSE(test_player.get_nof_tricks(), 3);//should fail
+
+    //check predicted tricks
+
+    int pred_tricks = 4;
+
+    test_player.set_nof_predicted(pred_tricks);
+    EXPECT_EQ(test_player.get_nof_predicted(), pred_tricks);
+
+    //check score
+    int score = 7;
+    test_player.set_scores(score);
+    EXPECT_EQ(test_player.get_scores(), score);
+
+
+}
+
+TEST(HandTest, RemoveFromEmptyHand)
+{
+    std::string name =  "vatkruidvat";
+
+    player test_player(name);
+    card* test_card = new card(2, 4);
+
+    std::string error = "";
+    std::string card_id = test_card->get_id();
+
+    //remove card without adding it
+    bool result = test_player.remove_card(card_id, test_card, error);
+    //should have returned false
+    EXPECT_FALSE(result);
+    //clear memory
+    delete test_card;
+
+
+}
+// checks add_card, get_nof_cards, remove card
+TEST(HandTest, HandWithOneCard)
+{
+    std::string name =  "vatkruidvat";
+
+    player test_player(name);
+    card* test_card = new card(2, 4);
+
+    std::string error = "";
+    std::string card_id = test_card->get_id();
+    test_player.add_card(test_card, error);
+
+    //add card to card vector
+    std::vector<card*> cards;
+    cards.push_back(test_card);
+
+    //should have one card in the hand
+    EXPECT_EQ(test_player.get_nof_cards(), cards.size());
+
+    // hand in test_player should be the same as cards vector
+    EXPECT_EQ(test_player.get_hand(), cards);
+    //remove card after adding it
+
+    bool result = test_player.remove_card(card_id, test_card, error);
+
+    EXPECT_TRUE(result);
+
+    // clean up memory
+    delete test_card;
+}
+
+TEST(HandTest, HandWithThreeCards)
+{
+    std::string name = "vatkruidvat";
+    player test_player(name);
+
+    // Create the cards
+    card* test_card_1 = new card(2, 4);
+    card* test_card_2 = new card(10, 3);
+    card* test_card_3 = new card(1, 1);
+
+    std::string error = "";
+    std::vector<card*> cards;
+
+    // add the 3 cards
+    test_player.add_card(test_card_1, error);
+    cards.push_back(test_card_1);
+
+    test_player.add_card(test_card_2, error);
+    cards.push_back(test_card_2);
+
+    test_player.add_card(test_card_3, error);
+    cards.push_back(test_card_3);
+
+    // check if nr of cards in the hand matches the size of the vector
+    EXPECT_EQ(test_player.get_nof_cards(), cards.size());
+    std::vector<card*> hand = test_player.get_hand()->get_cards();
+
+    //check if all cards are still the same
+    for (size_t i = 0; i < cards.size(); ++i) {
+        //check color and value because == operator not overloaded for card type
+        EXPECT_EQ(hand[i]->get_id(), cards[i]->get_id());
 
-        card* test_card = new card(2, 4);
-        player* test_player = new player("vatkruidvat");
-        cards_and_players.push_back(std::make_pair(test_card, test_player));
 
+        //alternative
     }
 
-    /* Any object and subroutine declared here can be accessed in the tests */
+    // remove card 2 and check
+    std::string card_id_to_remove = test_card_2->get_id();
+    bool result = test_player.remove_card(card_id_to_remove, test_card_2, error);
+
+    EXPECT_TRUE(result);
+
+    // check nr of cards after removal
+    cards.erase(cards.begin() + 1);
+    EXPECT_EQ(test_player.get_nof_cards(), cards.size());
+
+    // check that hand == updated vector
+    EXPECT_EQ(test_player.get_nof_cards(), cards.size());
+    std::vector<card*> updated_hand = test_player.get_hand()->get_cards();
+    for (size_t i = 0; i < cards.size(); ++i) {
+        //since it is the exact same card, we can compare card id
+        EXPECT_EQ(updated_hand[i]->get_id(), cards[i]->get_id());
+
+        //EXPECT_EQ(updated_hand[i]->get_color(), cards[i]->get_color());
+        //EXPECT_EQ(updated_hand[i]->get_value(), cards[i]->get_value());
+    }
+
+    // clean up memory
+    delete test_card_1;
+    delete test_card_2;
+    delete test_card_3;
+
+}
+// check wrap_up_round()
 
-    // cards[i][j] holds a pointer to the j-th copy of a card of value i
-    std::vector<std::pair<card*, player*>> cards_and_players;
-    trick* test_trick;
-    std::string err;
-};
+//correct estimate -> + 10 per trick, + 20 in general
+//incorrect estimate -> -10 for each trick offset
 
-TEST_F(trick_testing, CreatePlayer)
+// tests if score is computed correctly if predicted tricks == collected tricks
+TEST(HandTest, WrapUpRoundBadPrediction)
 {
+    std::string name =  "vatkruidvat";
 
-    std::string trick_id = "trick_1";
-    trick test_trick(trick_id, cards_and_players, trick_color, trump_color);
+    player test_player(name);
+    test_player.set_scores(20);
+    test_player.set_nof_tricks(2);
+    test_player.set_nof_predicted(4);
+    int previous_score = test_player.get_scores().back()->get_value();
 
-    //check name
+    test_player.wrap_up_round();
+    std::vector<serializable_value<int>*> scores = test_player.get_scores();
+    int new_score = scores.back()->get_value();
+    //since two tricks off (2 made, 4 predicted) --> subtract 2 * 10 from previous score
+    EXPECT_EQ(new_score, 0);
+
+    // lost 20 points from previous point to this round
+    EXPECT_EQ(std::abs(new_score, previous_score), 20);
+
+
+}
+
+// tests if score is computed correctly if predicted tricks == collected tricks
+TEST(HandTest, WrapUpRoundGoodGameplay)
+{
+    std::string name =  "vatkruidvat";
+
+    player test_player(name);
+    test_player.set_scores(20);
+    test_player.set_nof_tricks(2);
+    test_player.set_nof_predicted(2);
+    int previous_score = test_player.get_scores().back()->get_value();
+
+
+    // compute score
+    test_player.wrap_up_round();
+    std::vector<serializable_value<int>*> scores = test_player.get_scores();
+    int new_score = scores.back()->get_value();
+    //since two tricks off (2 made, 2 predicted) --> add 2 * 10 + 20 to previous score
+    EXPECT_EQ(new_score, 60);
+    int collected_points = scores.back()->get_value();
+
+    //made 40 points in this round
+    EXPECT_EQ(std::abs(new_score, previous_score), 40);
+
+
+}
+
+// Serialization and subsequent deserialization must yield the same object
+TEST(CardTest, SerializationEquality) {
+    std::string name =  "vatkruidvat";
+    player player_send(name);
+    player_send.set_scores(20);
+    player_send.set_nof_tricks(2);
+    player_send.set_nof_predicted(4);
+
+    rapidjson::Document* json_send = player_send.to_json();
+    std::string message = json_utils::to_string(json_send);
+    delete json_send;
 
-    EXPECT_EQ(test_trick.get_trick_color(), 2);
+    rapidjson::Document json_received = rapidjson::Document(rapidjson::kObjectType);
+    json_received.Parse(message.c_str());
+    player* player_received = player::from_json(json_received);
 
+    EXPECT_EQ(player_send.get_id(), player_received->get_id());
+    EXPECT_EQ(player_send.get_nof_cards(), player_received->get_nof_cards());
+    EXPECT_EQ(player_send.get_nof_predicted(), player_received->get_nof_cards());
+    EXPECT_EQ(player_send.get_player_name(), player_received->get_player_name());
+    EXPECT_EQ(player_send.get_scores(), player_received->get_scores());
+    EXPECT_EQ(player_send.get_hand(), player_received->get_hand());
+    delete player_received;
+}
 
+// Deserializing an invalid string must throw a WizardException
+TEST(CardTest, SerializationException) {
+    rapidjson::Document json = rapidjson::Document(rapidjson::kObjectType);
+    json.Parse("not json");
+    EXPECT_THROW(player::from_json(json), WizardException);
 }
\ No newline at end of file
-- 
GitLab