From 455105351c59f934359309e8b777617c45d5892d Mon Sep 17 00:00:00 2001 From: jorenchik Date: Fri, 12 Apr 2024 21:24:30 +0300 Subject: [PATCH] feat: white box tests --- src/modules/player.cc | 2 + src/modules/player.hh | 1 + src/modules/role.cc | 3 ++ src/modules/role.hh | 1 + src/test_validation.cc | 115 +++++++++++++++++++++++++++++++++++++++-- 5 files changed, 119 insertions(+), 3 deletions(-) diff --git a/src/modules/player.cc b/src/modules/player.cc index 6f98124..bd4acf1 100644 --- a/src/modules/player.cc +++ b/src/modules/player.cc @@ -4,6 +4,8 @@ #include +Player::Player() {} + Player::Player(uint32_t id, std::string username, Role role, PlayerStatus status): id(id), username(username), diff --git a/src/modules/player.hh b/src/modules/player.hh index 7d9e09c..af29fd0 100644 --- a/src/modules/player.hh +++ b/src/modules/player.hh @@ -18,5 +18,6 @@ struct Player { PlayerStatus status; Player(uint32_t id, std::string username, Role role, PlayerStatus status); + Player(); bool operator==(const Player &other) const; }; diff --git a/src/modules/role.cc b/src/modules/role.cc index 5b3e1a9..5b42a5a 100644 --- a/src/modules/role.cc +++ b/src/modules/role.cc @@ -3,6 +3,9 @@ #include #include +Role::Role(){ +} + Role::Role(std::initializer_list actions): Role(std::vector(actions)) { } diff --git a/src/modules/role.hh b/src/modules/role.hh index 4483c40..e43c184 100644 --- a/src/modules/role.hh +++ b/src/modules/role.hh @@ -9,4 +9,5 @@ struct Role { std::vector actions; explicit Role(std::vector actions); Role(std::initializer_list actions); + Role(); }; diff --git a/src/test_validation.cc b/src/test_validation.cc index b79b28f..02a032a 100644 --- a/src/test_validation.cc +++ b/src/test_validation.cc @@ -1,9 +1,118 @@ -#include "gtest/gtest.h" +#include "modules/role.hh" +#include "modules/room.hh" +#include "validation.hh" -TEST(ExampleTest, Example) { - EXPECT_EQ(1, 1); +#include "gtest/gtest.h" +#include + +struct TestFixtures { + static const Action kill; + static const Action heal; + static const Action vote; + static Role role1; + static Event event1; + static Event event2; + static Event event3; + static std::vector relatedEvents; + static Player player1; + static Player player2; + static Room room1; +}; + +const Action TestFixtures::kill = Action("kill", true); +const Action TestFixtures::heal = Action("heal", true); +const Action TestFixtures::vote = Action("vote", true); +Role TestFixtures::role1 = Role({vote, kill, heal}); +Event TestFixtures::event1 = Event("Event 1", 1710087355, 1, true, {}, {}); +Event TestFixtures::event2 = Event("Event 2", 1710087363, 1, true, {kill}, {}); +Event TestFixtures::event3 = Event("Event 3", 1710087369, 1, true, {}, {kill}); +std::vector TestFixtures::relatedEvents = std::vector({event2, event3}); +Player TestFixtures::player1 = Player(69, "player1", role1, PlayerStatus::Alive); +Player TestFixtures::player2 = Player(420, "player2", role1, PlayerStatus::Alive); +Room TestFixtures::room1 = + Room(1, "Room 1", 1710087364, RoomStatus::InProgress, std::vector {player1, player2}); + +TEST(ValidateActionBranchDecisionTests, ReachesNoActorReturn) { + ValidationStatus status = validate_action( + nullptr, &TestFixtures::kill, &TestFixtures::room1, &TestFixtures::relatedEvents, &TestFixtures::player2); + ASSERT_EQ(ValidationStatus::NoActor, status); } +TEST(ValidateActionBranchDecisionTests, ReachesNoActionReturn) { + ValidationStatus status = validate_action( + &TestFixtures::player1, nullptr, &TestFixtures::room1, &TestFixtures::relatedEvents, &TestFixtures::player2); + ASSERT_EQ(ValidationStatus::NoAction, status); +} + +TEST(ValidateActionBranchDecisionTests, ReachesNoRoomReturn) { + ValidationStatus status = validate_action( + &TestFixtures::player1, &TestFixtures::kill, nullptr, &TestFixtures::relatedEvents, &TestFixtures::player2); + ASSERT_EQ(ValidationStatus::NoRoom, status); +} + +TEST(ValidateActionBranchDecisionTests, ReachesNoRelatedEventsReturn) { + ValidationStatus status = validate_action( + &TestFixtures::player1, &TestFixtures::kill, &TestFixtures::room1, nullptr, &TestFixtures::player2); + ASSERT_EQ(ValidationStatus::NoRelatedEvents, status); +} + +TEST(ValidateActionBranchDecisionTests, ReachesNotInTheRoomReturn) { + Room emptyRoom = Room(2, "Room 4", 1710087394, RoomStatus::InProgress, {}); + ValidationStatus status = validate_action( + &TestFixtures::player1, &TestFixtures::kill, &emptyRoom, &TestFixtures::relatedEvents, &TestFixtures::player2); + ASSERT_EQ(ValidationStatus::PlayerNotInRoom, status); +} + +TEST(ValidateActionBranchDecisionTests, ReachesNoTargetReturn) { + ValidationStatus status = validate_action( + &TestFixtures::player1, &TestFixtures::kill, &TestFixtures::room1, &TestFixtures::relatedEvents, nullptr); + ASSERT_EQ(ValidationStatus::NoTargetPlayerSpecified, status); +} + +TEST(ValidateActionBranchDecisionTests, ReachesGameNotInProgressReturn) { + Room roomNotInProgress = + Room(2, "Room 5", 1710087394, RoomStatus::Ended, {TestFixtures::player1, TestFixtures::player2}); + ValidationStatus status = validate_action(&TestFixtures::player1, + &TestFixtures::kill, + &roomNotInProgress, + &TestFixtures::relatedEvents, + &TestFixtures::player2); + ASSERT_EQ(ValidationStatus::RoomNotInProgress, status); +} + +TEST(ValidateActionBranchDecisionTests, ReachesActionProhibitedReturn) { + std::vector noAllowingEvent = std::vector(); + ValidationStatus status = validate_action( + &TestFixtures::player1, &TestFixtures::kill, &TestFixtures::room1, &noAllowingEvent, &TestFixtures::player2); + ASSERT_EQ(ValidationStatus::ActionProhibited, status); +} + +TEST(ValidateActionBranchDecisionTests, ReachesActionDoesntBelongToTheRoleReturn) { + Role roleWithNoMatchingAction = Role({TestFixtures::vote, TestFixtures::heal}); + Player player1 = Player(69, "player1", roleWithNoMatchingAction, PlayerStatus::Alive); + ValidationStatus status = validate_action( + &player1, &TestFixtures::kill, &TestFixtures::room1, &TestFixtures::relatedEvents, &TestFixtures::player2); + ASSERT_EQ(ValidationStatus::ActionDoesNotBelongToRole, status); +} + +TEST(ValidateActionBranchDecisionTests, ReachesNoTopLevelReturn) { + ValidationStatus status = validate_action(&TestFixtures::player1, + &TestFixtures::kill, + &TestFixtures::room1, + &TestFixtures::relatedEvents, + &TestFixtures::player2); + ASSERT_EQ(ValidationStatus::ActionValid, status); +} + +// TEST(ValidateActionBranchDecisionTests, ReachesNoRoleReturn) { +// TestFixtures &fixtures = TestFixtures::getInstance(); +// Role role = Role(); +// ValidationStatus status s validate_action( +// &fixtures.player1, &fixtures.kill, &fixtures.room1, &fixtures.relatedEvents, &fixtures.player2); +// std::cout << ValidationStatusUtils::to_string(status) << std::endl; +// ASSERT_EQ(ValidationStatus::NoRole, status); +// } + int main(int argc, char *argv[]) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();