diff --git a/unit-tests/CMakeLists.txt b/unit-tests/CMakeLists.txt index 24441eafc0d1839b71a8feccb86bfab60075ec6b..b5c32df7758babd98ca25018beed5521d1cb7b3b 100644 --- a/unit-tests/CMakeLists.txt +++ b/unit-tests/CMakeLists.txt @@ -3,7 +3,7 @@ project(Wizard-unit-tests) set(TEST_SOURCE_FILES card.cpp deck.cpp - hand.cpp + # hand.cpp player.cpp trick.cpp) diff --git a/unit-tests/deck.cpp b/unit-tests/deck.cpp index 7009acfd6e5542a36b69239124e3667ab59cd2db..41d46986be4a219ac388a2837ea905b4bbfa8e82 100644 --- a/unit-tests/deck.cpp +++ b/unit-tests/deck.cpp @@ -4,6 +4,7 @@ #include "gtest/gtest.h" #include "../src/common/game_state/cards/deck.h" +#include "../src/common/serialization/json_utils.h" // new deck must hold 60 cards TEST(DeckTest, Creation) { @@ -15,8 +16,7 @@ TEST(DeckTest, Creation) { // can draw trump from new deck TEST(DeckTest, TrumpDraw) { deck mydeck; - card* trump; - trump = mydeck.draw_trump(); + card* trump = mydeck.draw_trump(); EXPECT_TRUE(trump); } @@ -35,7 +35,7 @@ TEST(DeckTest, CardDraw) { ASSERT_EQ(player1->get_hand()->get_nof_cards(), 5); } -// Draw last few cards +// draw last few cards TEST(DeckTest, DrawFinalCards) { deck mydeck; player* player1 = new player("player1"); @@ -60,265 +60,44 @@ TEST(DeckTest, OverDraw) { player* player1 = new player("player1"); std::string err; - EXPECT_FALSE(mydeck.draw_cards(player1, 65, err)); } - -/* A test fixture allows us to reuse the same configuration of objects for all - * tests in a test suite. The name of the fixture must match the test suite. - * - * For each test defined with TEST_F(), googletest will create a fresh test - * fixture at runtime, immediately initialize it via SetUp(), run the test, - * clean up by calling TearDown(), and then delete the test fixture. - * Note that different tests in the same test suite have different test fixture - * objects, and googletest always deletes a test fixture before it creates the - * next one. googletest does not reuse the same test fixture for multiple - * tests. Any changes one test makes to the fixture do not affect other tests. - */ - -class HandTest : public ::testing::Test { - -protected: - virtual void SetUp() { - cards.resize(8); - for (int i = 1; i < 8; ++i) { - for (int j = 0; j < 8; ++j) { - cards[i].push_back(new card(i)); - } - } - } - - /* Any object and subroutine declared here can be accessed in the tests */ - - // cards[i][j] holds a pointer to the j-th copy of a card of value i - std::vector<std::vector<card*>> cards; - hand player_hand; +// check round set up +TEST(DeckTest, Setup) { + deck mydeck; + player* player1 = new player("player1"); std::string err; -}; - -// Adding one card to an empty hand must succeed -TEST_F(HandTest, AddOneCard) { - EXPECT_TRUE(player_hand.add_card(cards[1][0], err)); - std::vector<card*> expected_hand = {cards[1][0]}; - EXPECT_EQ(expected_hand, player_hand.get_cards()); -} - -// The initial state must be an empty hand -TEST_F(HandTest, AddNoCards) { - std::vector<card*> expected_hand = {}; - EXPECT_EQ(expected_hand, player_hand.get_cards()); -} - -// Adding several cards with different values to an empty hand must succeed -TEST_F(HandTest, AddManyCards) { - EXPECT_TRUE(player_hand.add_card(cards[1][0], err)); - EXPECT_TRUE(player_hand.add_card(cards[3][0], err)); - EXPECT_TRUE(player_hand.add_card(cards[7][0], err)); - std::vector<card*> expected_hand = {cards[1][0], cards[3][0], cards[7][0]}; - EXPECT_EQ(expected_hand, player_hand.get_cards()); -} - -// Adding several cards with duplicate values to an empty hand must succeed -TEST_F(HandTest, AddManyCardsWithDuplicates) { - EXPECT_TRUE(player_hand.add_card(cards[1][0], err)); - EXPECT_TRUE(player_hand.add_card(cards[1][1], err)); - EXPECT_TRUE(player_hand.add_card(cards[1][2], err)); - EXPECT_TRUE(player_hand.add_card(cards[3][0], err)); - EXPECT_TRUE(player_hand.add_card(cards[3][1], err)); - EXPECT_TRUE(player_hand.add_card(cards[7][0], err)); - std::vector<card*> expected_hand = {cards[1][0], cards[1][1], cards[1][2], - cards[3][0], cards[3][1], cards[7][0]}; - EXPECT_EQ(expected_hand, player_hand.get_cards()); -} - -// Removing one card from a hand of three cards must succeed -TEST_F(HandTest, RemoveOneCard) { - player_hand.add_card(cards[1][0], err); - player_hand.add_card(cards[3][0], err); - player_hand.add_card(cards[7][0], err); - - card* to_remove = cards[1][0]; - card* removed_card = nullptr; - EXPECT_TRUE(player_hand.remove_card(to_remove->get_id(), removed_card, err)); - std::vector<card*> expected_hand = {cards[3][0], cards[7][0]}; - EXPECT_EQ(to_remove, removed_card); - EXPECT_EQ(expected_hand, player_hand.get_cards()); -} - -// Removing a card from an empty hand must fail -// Removing a nonexistent card from a hand of three cards must fail -TEST_F(HandTest, RemoveNonexistentCards) { - card* to_remove = cards[1][0]; - card* removed_card = cards[1][0]; - EXPECT_FALSE(player_hand.remove_card(to_remove->get_id(), removed_card, err)); - std::vector<card*> expected_hand = {}; - EXPECT_EQ(nullptr, removed_card); - // Use ASSERT instead of EXPECT to abort the current function (test) - // because adding and removing additional cards in an already incorrect - // hand makes no sense. - ASSERT_EQ(expected_hand, player_hand.get_cards()); - - player_hand.add_card(cards[1][0], err); - player_hand.add_card(cards[3][0], err); - player_hand.add_card(cards[7][0], err); - - to_remove = cards[1][1]; - removed_card = cards[1][1]; - EXPECT_FALSE(player_hand.remove_card(to_remove->get_id(), removed_card, err)); - expected_hand = {cards[1][0], cards[3][0], cards[7][0]}; - EXPECT_EQ(nullptr, removed_card); - EXPECT_EQ(expected_hand, player_hand.get_cards()); -} - -// Removing the final card from a hand must succeed -TEST_F(HandTest, RemoveAllCards) { - player_hand.add_card(cards[1][0], err); - - card* to_remove = cards[1][0]; - card* removed_card = nullptr; - EXPECT_TRUE(player_hand.remove_card(to_remove->get_id(), removed_card, err)); - std::vector<card*> expected_hand = {}; - EXPECT_EQ(to_remove, removed_card); - EXPECT_EQ(expected_hand, player_hand.get_cards()); -} - -// Removing several cards of different values from a hand of seven cards must succeed -TEST_F(HandTest, RemoveManyCards) { - player_hand.add_card(cards[1][0], err); - player_hand.add_card(cards[1][1], err); - player_hand.add_card(cards[1][2], err); - player_hand.add_card(cards[3][0], err); - player_hand.add_card(cards[3][1], err); - player_hand.add_card(cards[7][0], err); - - card* to_remove = cards[1][0]; - card* removed_card = nullptr; - EXPECT_TRUE(player_hand.remove_card(to_remove->get_id(), removed_card, err)); - std::vector<card*> expected_hand = {cards[1][1], cards[1][2], cards[3][0], - cards[3][1], cards[7][0]}; - EXPECT_EQ(to_remove, removed_card); - ASSERT_EQ(expected_hand, player_hand.get_cards()); - - to_remove = cards[3][0]; - removed_card = nullptr; - EXPECT_TRUE(player_hand.remove_card(to_remove->get_id(), removed_card, err)); - expected_hand = {cards[1][1], cards[1][2], cards[3][1], cards[7][0]}; - EXPECT_EQ(to_remove, removed_card); - ASSERT_EQ(expected_hand, player_hand.get_cards()); - - to_remove = cards[7][0]; - removed_card = nullptr; - EXPECT_TRUE(player_hand.remove_card(to_remove->get_id(), removed_card, err)); - expected_hand = {cards[1][1], cards[1][2], cards[3][1]}; - EXPECT_EQ(to_remove, removed_card); - EXPECT_EQ(expected_hand, player_hand.get_cards()); -} - -// Removing several cards of the same value from a hand of seven cards must succeed -TEST_F(HandTest, RemoveManyDuplicateCards) { - player_hand.add_card(cards[1][0], err); - player_hand.add_card(cards[1][1], err); - player_hand.add_card(cards[1][2], err); - player_hand.add_card(cards[3][0], err); - player_hand.add_card(cards[3][1], err); - player_hand.add_card(cards[7][0], err); - - card* to_remove = cards[3][0]; - card* removed_card = nullptr; - EXPECT_TRUE(player_hand.remove_card(to_remove->get_id(), removed_card, err)); - std::vector<card*> expected_hand = {cards[1][0], cards[1][1], cards[1][2], - cards[3][1], cards[7][0]}; - EXPECT_EQ(to_remove, removed_card); - ASSERT_EQ(expected_hand, player_hand.get_cards()); + mydeck.draw_cards(player1, 60, err); - to_remove = cards[3][1]; - removed_card = nullptr; - EXPECT_TRUE(player_hand.remove_card(to_remove->get_id(), removed_card, err)); - expected_hand = {cards[1][0], cards[1][1], cards[1][2], cards[7][0]}; - EXPECT_EQ(to_remove, removed_card); - EXPECT_EQ(expected_hand, player_hand.get_cards()); -} + mydeck.setup_round(); -// The score of a hand with a single card of value one must be equal to 1 -TEST_F(HandTest, ScoreOneCard) { - player_hand.add_card(cards[1][0], err); - EXPECT_EQ(1, player_hand.get_score()); -} - -// The score of a hand with a single Wizard card must be equal to 10 -TEST_F(HandTest, ScoreWizard) { - player_hand.add_card(cards[7][0], err); - EXPECT_EQ(10, player_hand.get_score()); -} + ASSERT_EQ(mydeck.get_number_of_remaining_cards(), 60); -// The score of an empty hand must be zero -TEST_F(HandTest, ScoreNoCards) { - EXPECT_EQ(0, player_hand.get_score()); -} -// Each addition of a card must increase the score by that card's value -TEST_F(HandTest, ScoreManyCards) { - player_hand.add_card(cards[1][0], err); - ASSERT_EQ(1, player_hand.get_score()); - player_hand.add_card(cards[3][0], err); - ASSERT_EQ(4, player_hand.get_score()); - player_hand.add_card(cards[7][0], err); - EXPECT_EQ(14, player_hand.get_score()); } -// Each addition of a card must increase the score by that card's value even -// if several cards have the same value -TEST_F(HandTest, ScoreManyCardsWithDuplicates) { - player_hand.add_card(cards[1][0], err); - ASSERT_EQ(1, player_hand.get_score()); - player_hand.add_card(cards[1][1], err); - ASSERT_EQ(1, player_hand.get_score()); - player_hand.add_card(cards[1][2], err); - ASSERT_EQ(1, player_hand.get_score()); - player_hand.add_card(cards[3][0], err); - ASSERT_EQ(4, player_hand.get_score()); - player_hand.add_card(cards[3][1], err); - ASSERT_EQ(4, player_hand.get_score()); - player_hand.add_card(cards[7][0], err); - EXPECT_EQ(14, player_hand.get_score()); -} +// Serialization and subsequent deserialization must yield the same object +TEST(CardTest, SerializationEquality) { + deck deck_send; + rapidjson::Document* json_send = deck_send().to_json(); + std::string message = json_utils::to_string(json_send); + delete json_send; -// A hand of one card must have count 1 -TEST_F(HandTest, CountOneCard) { - player_hand.add_card(cards[1][0], err); - EXPECT_EQ(1, player_hand.get_nof_cards()); -} + rapidjson::Document json_recv = rapidjson::Document(rapidjson::kObjectType); + json_recv.Parse(message.c_str()); + deck* deck_receive = deck::from_json(json_recv); -// An empty hand must have count 0 -TEST_F(HandTest, CountNoCards) { - EXPECT_EQ(0, player_hand.get_nof_cards()); + EXPECT_EQ(deck_send.get_id(), deck_receive->get_id()); + EXPECT_EQ(deck_send.get_number_of_remaining_cards(), deck_receive->get_number_of_remaining_cards()); + delete deck_receive; } -// Each addition of a card must increase the count by 1 -TEST_F(HandTest, CountManyCards) { - player_hand.add_card(cards[1][0], err); - ASSERT_EQ(1, player_hand.get_nof_cards()); - player_hand.add_card(cards[3][0], err); - ASSERT_EQ(2, player_hand.get_nof_cards()); - player_hand.add_card(cards[7][0], err); - EXPECT_EQ(3, player_hand.get_nof_cards()); +// Deserializing an invalid string must throw a WizardException +TEST(CardTest, SerializationException) { + rapidjson::Document json = rapidjson::Document(rapidjson::kObjectType); + json.Parse("not json"); + EXPECT_THROW(deck::from_json(json), WizardException); } -// Each addition of a card must increase the count by 1 even if several cards -// have the same value -TEST_F(HandTest, CountManyCardsWithDuplicates) { - player_hand.add_card(cards[1][0], err); - ASSERT_EQ(1, player_hand.get_nof_cards()); - player_hand.add_card(cards[1][1], err); - ASSERT_EQ(2, player_hand.get_nof_cards()); - player_hand.add_card(cards[1][2], err); - ASSERT_EQ(3, player_hand.get_nof_cards()); - player_hand.add_card(cards[3][0], err); - ASSERT_EQ(4, player_hand.get_nof_cards()); - player_hand.add_card(cards[3][1], err); - ASSERT_EQ(5, player_hand.get_nof_cards()); - player_hand.add_card(cards[7][0], err); - EXPECT_EQ(6, player_hand.get_nof_cards()); -}