diff --git a/src/common/game_state/cards/trick.cpp b/src/common/game_state/cards/trick.cpp index de288e67614bae1b566cecc765cf4bab5ec3502c..cfd7234c0a89a23430a5e16897b55ce664bb8070 100644 --- a/src/common/game_state/cards/trick.cpp +++ b/src/common/game_state/cards/trick.cpp @@ -42,13 +42,15 @@ trick::~trick() { int trick::get_trick_color() const { return this->_trick_color->get_value(); } - -std::vector<std::pair<card*, player*>> trick::get_cards() const +int trick::get_trump_color() const +{ + return this->_trump_color->get_value(); +} +std::vector<std::pair<card*, player*>> trick::get_cards_and_players() const { return this->_cards; } - #ifdef WIZARD_SERVER // determines winner using trump color player* trick::wrap_up_trick(std::string& err) { @@ -138,7 +140,7 @@ void trick::set_trick_color(int color) { //TODO write from json and to json // for creating updated instance of trick -trick *trick::from_json(const rapidjson::Value &json) { +trick* trick::from_json(const rapidjson::Value &json) { if (json.HasMember("id") && json.HasMember("cards") && json.HasMember("trump_color") diff --git a/src/common/game_state/cards/trick.h b/src/common/game_state/cards/trick.h index 0081e357aee6c8a5413927b997463792fe22c8d9..fc20253b19ed81e529af23fb386cb555611862f5 100644 --- a/src/common/game_state/cards/trick.h +++ b/src/common/game_state/cards/trick.h @@ -22,23 +22,20 @@ private: serializable_value<int>* _trump_color; std::vector<std::pair<card*, player*>> _cards; - +public: + trick(); explicit trick(std::string id); - trick(std::string id, std::vector<std::pair<card*, player*>> &cards, serializable_value<int>* trick_color, serializable_value<int>* trump_color); - -public: - trick(); explicit trick(int trump); ~trick(); // accessors [[nodiscard]] int get_trick_color() const; - std::vector<std::pair<card*, player*>> get_cards() const; - + [[nodiscard]] std::vector<std::pair<card*, player*>> get_cards_and_players() const; + [[nodiscard]] int get_trump_color() const; #ifdef WIZARD_SERVER // state update functions diff --git a/unit-tests/CMakeLists.txt b/unit-tests/CMakeLists.txt index b5c32df7758babd98ca25018beed5521d1cb7b3b..f9a485c27a0d62ec15d813f7f0e4e78e351ff618 100644 --- a/unit-tests/CMakeLists.txt +++ b/unit-tests/CMakeLists.txt @@ -1,10 +1,10 @@ project(Wizard-unit-tests) set(TEST_SOURCE_FILES - card.cpp - deck.cpp + #card.cpp + # deck.cpp # hand.cpp - player.cpp + # player.cpp trick.cpp) add_executable(Wizard-tests ${TEST_SOURCE_FILES}) diff --git a/unit-tests/trick.cpp b/unit-tests/trick.cpp index a4603f3b5d673d280b51401a1865293eed539e37..5576bcd00881a158011c5b9d46761cc8e8623ba8 100644 --- a/unit-tests/trick.cpp +++ b/unit-tests/trick.cpp @@ -1,239 +1,534 @@ - // // Created by martinalavanya on 23.11.24. // #include "gtest/gtest.h" #include "../src/common/exceptions/WizardException.h" -#include "../src/common/game_state/player/player.h" -#include "../src/common/game_state/player/hand.h" +#include "../src/common/game_state/cards/trick.h" #include "../src/common/serialization/json_utils.h" - -TEST(PlayerTest, CreatePlayer) +class trick_testing : public ::testing::Test { - std::string name = "vatkruidvat"; - player test_player(name); +protected: + serializable_value<int>* trick_color = nullptr; + serializable_value<int>* trump_color = nullptr; + trick* test_trick = nullptr; + std::vector<std::pair<card*, player*>> cards_and_players; + + //virtual void SetUp() { + // serializable_value<int>* trick_color = new serializable_value<int>(2); // trick color is 2 + // serializable_value<int>* trump_color = new serializable_value<int>(3);// trump color is 3 + // std::vector<std::pair<card*, player*>> cards_and_players; + + // 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)); + // test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + + // } + + // Delete dynamically allocated cards and players + virtual void TearDown() { + for (int i = 0; i < cards_and_players.size(); i++) { + delete cards_and_players[i].first; // delete the `card*` + delete cards_and_players[i].second; // delete the `player*` + } + delete trick_color; + delete trump_color; + cards_and_players.clear(); + } +}; - //check name - EXPECT_EQ(test_player.get_player_name(), name); +//note about cards: 1-13 are number cards (x4), 0 are jester cards (x4), 14 are wizard cards (x4) - // check tricks - int nof_tricks = 2; +TEST_F(trick_testing, CreateAndChangeTrick) { + trick_color = new serializable_value<int>(2); //trick color is 2 + trump_color = new serializable_value<int>(3); - test_player.set_nof_tricks(nof_tricks); - EXPECT_FALSE(test_player.get_nof_tricks(), 3);//should fail + 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)); - //check predicted tricks + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + //check cards and players + EXPECT_EQ(1, test_trick->get_cards_and_players().size()); + EXPECT_EQ(cards_and_players, test_trick->get_cards_and_players()); + // check that trick color was set correctly - int pred_tricks = 4; + EXPECT_EQ(test_trick->get_trick_color(), 2); + test_trick->set_trick_color(3); + EXPECT_EQ(test_trick->get_trick_color(), 3); - test_player.set_nof_predicted(pred_tricks); - EXPECT_EQ(test_player.get_nof_predicted(), pred_tricks); + //check trump color + EXPECT_EQ(test_trick->get_trump_color(), 3); - //check score - int score = 7; - test_player.set_scores(score); - EXPECT_EQ(test_player.get_scores(), score); } -TEST(HandTest, RemoveFromEmptyHand) +// scoring scenarios +// have any card be a wizard --> wins +TEST_F(trick_testing, OneWizard) { - std::string name = "vatkruidvat"; + serializable_value<int>* trick_color = new serializable_value<int>(0); // trick color is 0 + serializable_value<int>* trump_color = new serializable_value<int>(3);// trump color is 3 + //if a wizard is played, then the other players may play any card they wish (of any suit) + card* card1 = new card(14, 0); //winning wizard card + card* card2 = new card(2, 2); + card* card3 = new card(4, 3); //trump card + card* card4 = new card(14, 0); //second wizard card + + player* player1 = new player("Player_1"); + player* player2 = new player("Player_2"); + player* player3 = new player("Player_3"); + player* player4 = new player("Player_4"); + + // Initialize cards_and_players using {} notation + std::vector<std::pair<card*, player*>> cards_and_players = { + {card1, player1}, + {card2, player2}, + {card3, player3}, + {card4, player4} + }; + + + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + std::string error = ""; + player* winner = test_trick->wrap_up_trick(error); + EXPECT_EQ(player1->get_player_name(), winner->get_player_name()); // player 1 expected to win + EXPECT_EQ(cards_and_players[0].first->get_value(), 14); //first card is a wizard +} - player test_player(name); - card* test_card = new card(2, 4); +//first wizard card wins +TEST_F(trick_testing, AllWizards) +{ + serializable_value<int>* trick_color = new serializable_value<int>(0); // trick color is 0 + serializable_value<int>* trump_color = new serializable_value<int>(3); // trump color is 3 - std::string error = ""; - std::string card_id = test_card->get_id(); + card* card1 = new card(14, 0); //winning wizard card + card* card2 = new card(14, 0); + card* card3 = new card(14, 0); + card* card4 = new card(14, 0); - //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; + player* player1 = new player("Player_1"); + player* player2 = new player("Player_2"); + player* player3 = new player("Player_3"); + player* player4 = new player("Player_4"); + std::vector<std::pair<card*, player*>> cards_and_players = { + {card1, player1}, + {card2, player2}, + {card3, player3}, + {card4, player4} + }; + + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + std::string error = ""; + player* winner = test_trick->wrap_up_trick(error); + EXPECT_EQ(player1->get_player_name(), winner->get_player_name()); // player 1 expected to win + EXPECT_EQ(cards_and_players[1].first->get_value(), 14); //second card is a wizard } -// checks add_card, get_nof_cards, remove card -TEST(HandTest, HandWithOneCard) + + +//first card is a jester --> wins only if everyone plays a jester, otherwise the jester looses +TEST_F(trick_testing, OneJesterHighestCard) { - std::string name = "vatkruidvat"; + serializable_value<int>* trick_color = new serializable_value<int>(2); // trick color is 2 + serializable_value<int>* trump_color = new serializable_value<int>(4);// trump color is 4 + //jester has color 0, value 0 + card* card1 = new card(0, 0); //jester looses + card* card2 = new card(2, 2); //first number card --> decides trick color + card* card3 = new card(4, 2); //winning card (highest of color 2) + card* card4 = new card(3, 1);//player can't match suit and has no trump + + player* player1 = new player("Player_1"); + player* player2 = new player("Player_2"); + player* player3 = new player("Player_3"); + player* player4 = new player("Player_4"); + + std::vector<std::pair<card*, player*>> cards_and_players = { + {card1, player1}, + {card2, player2}, + {card3, player3}, + {card4, player4} + }; + + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + std::string error = ""; + player* winner = test_trick->wrap_up_trick(error); + EXPECT_EQ(player3->get_player_name(), winner->get_player_name()); // player 3 expected to win + EXPECT_EQ(cards_and_players[3].first->get_value(), 3); //last card should be a 3 +} + +//first card is a jester, trump card wins +TEST_F(trick_testing, OneJesterWithTrump) +{ + serializable_value<int>* trick_color = new serializable_value<int>(2); // trick color is 2 + serializable_value<int>* trump_color = new serializable_value<int>(4);// trump color is 4 + //jester has color 0, value 0 + card* card1 = new card(0, 0); //jester looses + card* card2 = new card(2, 2); //first number card --> decides trick color + card* card3 = new card(4, 2); + card* card4 = new card(3, 4);//winning card -> trump + + player* player1 = new player("Player_1"); + player* player2 = new player("Player_2"); + player* player3 = new player("Player_3"); + player* player4 = new player("Player_4"); + + std::vector<std::pair<card*, player*>> cards_and_players = { + {card1, player1}, + {card2, player2}, + {card3, player3}, + {card4, player4} + }; + + + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + std::string error = ""; + player* winner = test_trick->wrap_up_trick(error); + EXPECT_EQ(player4->get_player_name(), winner->get_player_name()); // player 4 expected to win + auto third_card = cards_and_players[2].first; + EXPECT_EQ(third_card->get_value(), 3); //third card should be a 4 +} - player test_player(name); - card* test_card = new card(2, 4); +//first card is a jester, wizard card wins +TEST_F(trick_testing, OneJesterWithWizard) +{ + serializable_value<int>* trick_color = new serializable_value<int>(0); // trick color is 0 + serializable_value<int>* trump_color = new serializable_value<int>(4);// trump color is 4 + //jester has color 0, value 0 + card* card1 = new card(0, 0); //jester looses + card* card2 = new card(14, 0); //wizard card wins + card* card3 = new card(13, 3); //remaining players may play any suit because wizard was played + card* card4 = new card(3, 4); + + player* player1 = new player("Player_1"); + player* player2 = new player("Player_2"); + player* player3 = new player("Player_3"); + player* player4 = new player("Player_4"); + + std::vector<std::pair<card*, player*>> cards_and_players = { + {card1, player1}, + {card2, player2}, + {card3, player3}, + {card4, player4} + }; + + + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); std::string error = ""; - std::string card_id = test_card->get_id(); - test_player.add_card(test_card, error); + player* winner = test_trick->wrap_up_trick(error); + EXPECT_EQ(player2->get_player_name(), winner->get_player_name()); // player 2 expected to win + EXPECT_EQ(cards_and_players[2].first->get_value(), 13); //third card should be a 13 +} - //add card to card vector - std::vector<card*> cards; - cards.push_back(test_card); +//first card is a jester, wizard card wins +TEST_F(trick_testing, OneJesterWithWizardAndTrump) +{ + serializable_value<int>* trick_color = new serializable_value<int>(2); // trick color is 2 + serializable_value<int>* trump_color = new serializable_value<int>(4);// trump color is 4 + //jester has color 0, value 0 + card* card1 = new card(0, 0); //jester looses + card* card2 = new card(4, 2); //trick color 2 + card* card3 = new card(13, 4); //trump card + card* card4 = new card(14, 0); //wizard wins + + player* player1 = new player("Player_1"); + player* player2 = new player("Player_2"); + player* player3 = new player("Player_3"); + player* player4 = new player("Player_4"); + + std::vector<std::pair<card*, player*>> cards_and_players = { + {card1, player1}, + {card2, player2}, + {card3, player3}, + {card4, player4} + }; + + + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + std::string error = ""; + player* winner = test_trick->wrap_up_trick(error); + EXPECT_EQ(player4->get_player_name(), winner->get_player_name()); // player 4 expected to win + EXPECT_EQ(cards_and_players[3].first->get_value(), 14); //last card is a wizard +} - //should have one card in the hand - EXPECT_EQ(test_player.get_nof_cards(), cards.size()); +//all jesters +TEST_F(trick_testing, AllJesters) +{ + serializable_value<int>* trick_color = new serializable_value<int>(0); // trick color is 0 + serializable_value<int>* trump_color = new serializable_value<int>(4);// trump color for this trick is 4 + //jester has color 0, value 0 + card* card1 = new card(0, 0); //winning jester card + card* card2 = new card(0, 0); + card* card3 = new card(0, 0); + card* card4 = new card(0, 0); - // 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); + player* player1 = new player("Player_1"); + player* player2 = new player("Player_2"); + player* player3 = new player("Player_3"); + player* player4 = new player("Player_4"); - EXPECT_TRUE(result); + std::vector<std::pair<card*, player*>> cards_and_players = { + {card1, player1}, + {card2, player2}, + {card3, player3}, + {card4, player4} + }; - // clean up memory - delete test_card; + + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + std::string error = ""; + player* winner = test_trick->wrap_up_trick(error); + EXPECT_EQ(player1->get_player_name(), winner->get_player_name()); // player 1 expected to win + EXPECT_EQ(cards_and_players[3].first->get_value(), 0); //last card should be a jester } -TEST(HandTest, HandWithThreeCards) + + +//highest trump card wins +TEST_F(trick_testing, HighestTrump) { - std::string name = "vatkruidvat"; - player test_player(name); + serializable_value<int>* trick_color = new serializable_value<int>(3); // trick color is 3 + serializable_value<int>* trump_color = new serializable_value<int>(2);// trump color is 2 - // 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; + card* card1 = new card(2, 3); //decides trick color + card* card2 = new card(6, 2); //highest trump card --> wins trick + card* card3 = new card(3, 2); //lower trump card + card* card4 = new card(8, 3); //highest non-trump of trick color --> still looses - // add the 3 cards - test_player.add_card(test_card_1, error); - cards.push_back(test_card_1); + player* player1 = new player("Player_1"); + player* player2 = new player("Player_2"); + player* player3 = new player("Player_3"); + player* player4 = new player("Player_4"); - test_player.add_card(test_card_2, error); - cards.push_back(test_card_2); + std::vector<std::pair<card*, player*>> cards_and_players = { + {card1, player1}, + {card2, player2}, + {card3, player3}, + {card4, player4} + }; - 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(); + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + std::string error = ""; + player* winner = test_trick->wrap_up_trick(error); + EXPECT_EQ(player2->get_player_name(), winner->get_player_name()); // player 2 expected to win + EXPECT_EQ(cards_and_players[1].first->get_value(), 6); //second card should be a 6 +} - //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()); +//only trump played -> highest trump card wins +TEST_F(trick_testing, OnlyTrump) +{ + serializable_value<int>* trick_color = new serializable_value<int>(1); // trick color is 1 + serializable_value<int>* trump_color = new serializable_value<int>(1);// trump color is 1 - //alternative - } - // 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); + card* card1 = new card(12, 1); + card* card2 = new card(6, 1); + card* card3 = new card(13, 1);//highest trump wins + card* card4 = new card(8, 1); - EXPECT_TRUE(result); + player* player1 = new player("Player_1"); + player* player2 = new player("Player_2"); + player* player3 = new player("Player_3"); + player* player4 = new player("Player_4"); - // check nr of cards after removal - cards.erase(cards.begin() + 1); - EXPECT_EQ(test_player.get_nof_cards(), cards.size()); + std::vector<std::pair<card*, player*>> cards_and_players = { + {card1, player1}, + {card2, player2}, + {card3, player3}, + {card4, player4} + }; - // 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()); - } + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + std::string error = ""; + player* winner = test_trick->wrap_up_trick(error); + EXPECT_EQ(player3->get_player_name(), winner->get_player_name()); // player 3 expected to win + EXPECT_EQ(cards_and_players[2].first->get_value(), 13); //third card should be a 13 +} +// if no trump is played, the highest card wins +TEST_F(trick_testing, NoTrump) +{ + serializable_value<int>* trick_color = new serializable_value<int>(1); // trick color is 1 + serializable_value<int>* trump_color = new serializable_value<int>(3);// trump color is 3 - // clean up memory - delete test_card_1; - delete test_card_2; - delete test_card_3; + card* card1 = new card(1, 1); + card* card2 = new card(6, 2); + card* card3 = new card(11, 1); //winner + card* card4 = new card(8, 1); + + player* player1 = new player("Player_1"); + player* player2 = new player("Player_2"); + player* player3 = new player("Player_3"); + player* player4 = new player("Player_4"); + + std::vector<std::pair<card*, player*>> cards_and_players = { + {card1, player1}, + {card2, player2}, + {card3, player3}, + {card4, player4} + }; + + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + std::string error = ""; + player* winner = test_trick->wrap_up_trick(error); + EXPECT_EQ(player3->get_player_name(), winner->get_player_name()); // player 3 expected to win + EXPECT_EQ(cards_and_players[2].first->get_value(), 11); //third card should be a 11 } -// check wrap_up_round() -//correct estimate -> + 10 per trick, + 20 in general -//incorrect estimate -> -10 for each trick offset +//check setup round +TEST_F(trick_testing, SetupRound) +{ + serializable_value<int>* trick_color = new serializable_value<int>(1); // trick color is 1 + serializable_value<int>* trump_color = new serializable_value<int>(3);// trump color is 3 + + + card* card1 = new card(1, 1); + card* card2 = new card(6, 2); + card* card3 = new card(11, 1); //winner + card* card4 = new card(8, 1); + + player* player1 = new player("Player_1"); + player* player2 = new player("Player_2"); + player* player3 = new player("Player_3"); + player* player4 = new player("Player_4"); -// tests if score is computed correctly if predicted tricks == collected tricks -TEST(HandTest, WrapUpRoundBadPrediction) + std::vector<std::pair<card*, player*>> cards_and_players = { + {card1, player1}, + {card2, player2}, + {card3, player3}, + {card4, player4} + }; + + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + std::string error = ""; + test_trick->set_up_round(error, 4); + EXPECT_EQ(0, test_trick->get_trick_color()); //expect trick color 0 after reset + EXPECT_EQ(0, test_trick->get_cards_and_players().size()); //expect empty cards and players vector + +} + +//check add card +TEST_F(trick_testing, AddCard) { - std::string name = "vatkruidvat"; + int trump_color = 3; + std::string err = ""; - 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(); + card* card1 = new card(1, 1); + card* card2 = new card(6, 2); + //create player and add card to player hand + player* player1 = new player("Player_1"); + player1->add_card(card1, err); - 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); + std::vector<std::pair<card*, player*>> cards_and_players = {{card1, player1}}; - // lost 20 points from previous point to this round - EXPECT_EQ(std::abs(new_score, previous_score), 20); + test_trick = new trick(); + test_trick->set_up_round(err, trump_color); + EXPECT_TRUE(test_trick->add_card(card1, player1, err));//card1 is in hand + EXPECT_FALSE(test_trick->add_card(card2, player1, err));//card 2 is not in hand + EXPECT_TRUE(test_trick->add_card(card1, player1, err));//card was played, player was added + EXPECT_EQ(test_trick->get_cards_and_players(), cards_and_players); //check if player was added to cards_ } -// tests if score is computed correctly if predicted tricks == collected tricks -TEST(HandTest, WrapUpRoundGoodGameplay) + +//test a full round +TEST_F(trick_testing, EntireRound) { - std::string name = "vatkruidvat"; + int trump_color = 4; + std::string err = ""; + + card* card1 = new card(2, 4); + card* card2 = new card(4, 3); + card* card3 = new card(8, 2); + card* card4 = nullptr;// Null card + - 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(); + player* player1 = new player("Player_1"); + player* player2 = new player("Player_2"); + player* player3 = new player("Player_3"); + // add cards to players' hands + player1->add_card(card1, err); + player2->add_card(card2, err); + player3->add_card(card3, err); - // 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(); + //create trick + test_trick = new trick(); + test_trick->set_up_round(err, trump_color); - //made 40 points in this round - EXPECT_EQ(std::abs(new_score, previous_score), 40); + // Test adding valid cards from player 1 + EXPECT_TRUE(test_trick->add_card(card1, player1, err)); + EXPECT_TRUE(test_trick->add_card(card2, player1, err)); + // Test adding a card not in the player's hand + EXPECT_FALSE(test_trick->add_card(nullptr, player1, err)); + EXPECT_FALSE(test_trick->add_card(card3, player1, err)); // Card 3 belongs to player 3 + // Test adding a null card + EXPECT_FALSE(test_trick->add_card(card4, player2, err)); + EXPECT_EQ(err, "The desired card cannot be played."); + + // Test adding a valid card from player 2 + EXPECT_TRUE(test_trick->add_card(card3, player2, err)); + + // Check the cards and players stored in the trick + std::vector<std::pair<card*, player*>> expected_cards_and_players = { + {card1, player1}, + {card2, player1}, + {card3, player2} + }; + EXPECT_EQ(test_trick->get_cards_and_players(), expected_cards_and_players); + + player* winner = test_trick->wrap_up_trick(err); + EXPECT_EQ(player1, winner); //player 1 played trump --> wins } + +//TODO 28.11: check the serialization deserialization --> after that, these tests should be done + // 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(); +TEST_F(trick_testing, SerializationEquality) { + trick_color = new serializable_value<int>(2); //trick color is 2 + trump_color = new serializable_value<int>(3); + + 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)); + + test_trick = new trick("test_trick_id", cards_and_players, trick_color, trump_color); + + rapidjson::Document* json_send = test_trick->to_json(); std::string message = json_utils::to_string(json_send); delete json_send; rapidjson::Document json_received = rapidjson::Document(rapidjson::kObjectType); json_received.Parse(message.c_str()); - player* player_received = player::from_json(json_received); + trick* trick_received = trick::from_json(json_received); + + EXPECT_EQ(test_trick->get_id(), trick_received->get_id()); + EXPECT_EQ(test_trick->get_trump_color(), trick_received->get_trump_color()); + EXPECT_EQ(test_trick->get_cards_and_players()[0].first->get_color(), trick_received->get_cards_and_players()[0].first->get_color()); + EXPECT_EQ(test_trick->get_cards_and_players()[0].first->get_value(), trick_received->get_cards_and_players()[0].first->get_value()); + EXPECT_EQ(test_trick->get_trick_color(), trick_received->get_trick_color()); - 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; + delete trick_received; } // Deserializing an invalid string must throw a WizardException -TEST(CardTest, SerializationException) { +TEST_F(trick_testing, 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 +} +