From 41e812ced6e1db240a7499c180c417a4c2c5a618 Mon Sep 17 00:00:00 2001 From: Dipesh Kafle Date: Mon, 22 Mar 2021 16:31:10 +0545 Subject: [PATCH 1/3] Fixed bug in transfer_state and added tests for it The bug was due to not updating num_bots ,num_towers,num_enemy_towers,num_enemy_bots and num_flags in transfer_state::convertToPlayerState function. Because of it, state.num_bots wouldnt be the same as state.bots.size() in game. Similar thing happened for towers and flag --- .../include/player_wrapper/transfer_state.h | 7 +++ src/state/include/state/player_state.h | 2 +- test/CMakeLists.txt | 3 +- test/player_wrapper/transfer_state_test.cpp | 49 +++++++++++++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 test/player_wrapper/transfer_state_test.cpp diff --git a/src/player_wrapper/include/player_wrapper/transfer_state.h b/src/player_wrapper/include/player_wrapper/transfer_state.h index a5a9e048..b4bdd0cf 100644 --- a/src/player_wrapper/include/player_wrapper/transfer_state.h +++ b/src/player_wrapper/include/player_wrapper/transfer_state.h @@ -76,6 +76,13 @@ ConvertToPlayerState(const transfer_state::State &ts) { // Copy score std::copy(ts.scores.begin(), ts.scores.end(), ps.scores.begin()); + // Copy Sizes + ps.num_bots = ps.bots.size(); + ps.num_enemy_bots = ps.enemy_bots.size(); + ps.num_towers = ps.towers.size(); + ps.num_enemy_towers = ps.enemy_towers.size(); + ps.num_flags = ps.flag_offsets.size(); + return ps; } diff --git a/src/state/include/state/player_state.h b/src/state/include/state/player_state.h index 2ad45820..d37c179a 100644 --- a/src/state/include/state/player_state.h +++ b/src/state/include/state/player_state.h @@ -224,7 +224,7 @@ struct State { array scores; State() - : map(), bots(Constants::Actor::MAX_NUM_BOTS), + : map(), num_flags(0), bots(Constants::Actor::MAX_NUM_BOTS), enemy_bots(Constants::Actor::MAX_NUM_BOTS), num_bots(Constants::Actor::MAX_NUM_BOTS), num_enemy_bots(Constants::Actor::MAX_NUM_BOTS), diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index cf9dc5b9..36f1498b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -18,7 +18,8 @@ set(SOURCE_FILES state/state_test.cpp llvm_pass/llvm_pass_test.cpp drivers/timer_test.cpp - drivers/main_driver_test.cpp) + drivers/main_driver_test.cpp + player_wrapper/transfer_state_test.cpp) if(NOT BUILD_PROJECT STREQUAL "all") include(${CMAKE_INSTALL_PREFIX}/lib/physics_config.cmake) diff --git a/test/player_wrapper/transfer_state_test.cpp b/test/player_wrapper/transfer_state_test.cpp new file mode 100644 index 00000000..b6cb6c16 --- /dev/null +++ b/test/player_wrapper/transfer_state_test.cpp @@ -0,0 +1,49 @@ +#include "player_wrapper/transfer_state.h" +#include "state/player_state.h" +#include "gtest/gtest.h" + +using namespace std; +using namespace testing; +using namespace transfer_state; + +class TransferStateTest : public Test { + public: + transfer_state::State ts; + player_state::State ps; + + TransferStateTest() : ts(), ps() { + ts.num_bots = 10; + ts.num_enemy_bots = 20; + ts.num_towers = 30; + ps.num_bots = 50; + ps.bots.assign(ps.num_bots, player_state::Bot()); + ps.num_enemy_bots = 30; + ps.enemy_bots.assign(ps.num_enemy_bots, player_state::Bot()); + } +}; + +TEST_F(TransferStateTest, convertToPlayerStateTest) { + auto new_ps = ConvertToPlayerState(ts); + + // non default values, changed in TransferStateTest constructor + EXPECT_EQ(new_ps.num_bots, ts.num_bots); // must equal 10 + EXPECT_EQ(new_ps.num_enemy_bots, ts.num_enemy_bots); // must equal 20 + EXPECT_EQ(new_ps.num_towers, ts.num_towers); // must equal 30 + + // default values + EXPECT_EQ(new_ps.num_enemy_towers, ts.num_enemy_towers); + EXPECT_EQ(new_ps.num_flags, ts.num_flags); +} + +TEST_F(TransferStateTest, convertToTransferStateTest) { + auto new_ts = ConvertToTransferState(ps); + + // non default values, changed in TransferStateTest constructor + EXPECT_EQ(new_ts.num_bots, ps.num_bots); // equals 50 + EXPECT_EQ(new_ts.num_enemy_bots, ps.num_enemy_bots); // equals 30 + + // default values + EXPECT_EQ(new_ts.num_towers, ps.num_towers); + EXPECT_EQ(new_ts.num_enemy_towers, ps.num_enemy_towers); + EXPECT_EQ(new_ts.num_flags, ps.num_flags); +} From 6e1c964cb93b4066f37db1139a4bd5b49290aa1e Mon Sep 17 00:00:00 2001 From: Dipesh Kafle Date: Tue, 23 Mar 2021 14:07:53 +0545 Subject: [PATCH 2/3] Tests for flag_offsets,map and scores in transfer_state_test --- test/player_wrapper/transfer_state_test.cpp | 80 +++++++++++++++++++-- 1 file changed, 76 insertions(+), 4 deletions(-) diff --git a/test/player_wrapper/transfer_state_test.cpp b/test/player_wrapper/transfer_state_test.cpp index b6cb6c16..bf9e24b3 100644 --- a/test/player_wrapper/transfer_state_test.cpp +++ b/test/player_wrapper/transfer_state_test.cpp @@ -6,6 +6,10 @@ using namespace std; using namespace testing; using namespace transfer_state; +const auto L = player_state::TerrainType::LAND; +const auto W = player_state::TerrainType::WATER; +const auto F = player_state::TerrainType::FLAG; + class TransferStateTest : public Test { public: transfer_state::State ts; @@ -15,35 +19,103 @@ class TransferStateTest : public Test { ts.num_bots = 10; ts.num_enemy_bots = 20; ts.num_towers = 30; + ts.scores = {1000, 2000}; + ps.num_bots = 50; ps.bots.assign(ps.num_bots, player_state::Bot()); ps.num_enemy_bots = 30; ps.enemy_bots.assign(ps.num_enemy_bots, player_state::Bot()); + ps.scores = {100, 200}; + + // Creating a basic map and player state + vector> map = {{L, L, L, L, L}, + {L, W, F, W, L}, + {L, F, F, F, L}, + {L, W, F, W, L}, + {L, L, L, L, L}}; + + // Creating a map of type MapElement from terrain + for (size_t x = 0; x < MAP_SIZE; ++x) { + for (size_t y = 0; y < MAP_SIZE; ++y) { + ts.map[x][y].setTerrain(W); + ps.map[x][y].setTerrain(W); + } + } + + for (int x = 0; x < 5; ++x) { + for (int y = 0; y < 5; ++y) { + ts.map[x][y].setTerrain(map[x][y]); + ps.map[x][y].setTerrain(map[x][y]); + if (map[x][y] == F) { + // updating flag offsets + ps.flag_offsets.push_back(DoubleVec2D(x, y)); + ts.flag_offsets[ts.num_flags] = DoubleVec2D(x, y); + ts.num_flags++; + ps.num_flags++; + } + } + } + } + + // had to templatize this because ps.scores is array while + // ts.scores is array + template + pair pairFromScores(const array &scores) { + return make_pair(scores[0], scores[1]); + } + + bool mapEquality( + const array, Map::MAP_SIZE> &map1, + const array, Map::MAP_SIZE> &map2) { + for (auto i = 0u; i < Map::MAP_SIZE; i++) { + for (auto j = 0u; j < Map::MAP_SIZE; j++) { + if (map1[i][j].type != map2[i][j].type) { + return false; + } + } + } + return true; + } + + bool flagOffsetsEquality( + const vector &ps_flags, + const array &ts_flags) { + for (auto i = 0u; i < ps_flags.size(); i++) { + if (ps_flags[i] != ts_flags[i]) + return false; + } + return true; } }; -TEST_F(TransferStateTest, convertToPlayerStateTest) { +TEST_F(TransferStateTest, ConvertToPlayerStateTest) { auto new_ps = ConvertToPlayerState(ts); // non default values, changed in TransferStateTest constructor EXPECT_EQ(new_ps.num_bots, ts.num_bots); // must equal 10 EXPECT_EQ(new_ps.num_enemy_bots, ts.num_enemy_bots); // must equal 20 EXPECT_EQ(new_ps.num_towers, ts.num_towers); // must equal 30 + EXPECT_EQ(pairFromScores(new_ps.scores), pairFromScores(ts.scores)); + EXPECT_EQ(mapEquality(new_ps.map, ts.map), true); + EXPECT_EQ(new_ps.num_flags, ts.num_flags); + EXPECT_EQ(flagOffsetsEquality(new_ps.flag_offsets, ts.flag_offsets), true); // default values EXPECT_EQ(new_ps.num_enemy_towers, ts.num_enemy_towers); - EXPECT_EQ(new_ps.num_flags, ts.num_flags); } -TEST_F(TransferStateTest, convertToTransferStateTest) { +TEST_F(TransferStateTest, ConvertToTransferStateTest) { auto new_ts = ConvertToTransferState(ps); // non default values, changed in TransferStateTest constructor EXPECT_EQ(new_ts.num_bots, ps.num_bots); // equals 50 EXPECT_EQ(new_ts.num_enemy_bots, ps.num_enemy_bots); // equals 30 + EXPECT_EQ(pairFromScores(new_ts.scores), pairFromScores(ps.scores)); + EXPECT_EQ(mapEquality(new_ts.map, ps.map), true); + EXPECT_EQ(new_ts.num_flags, ps.num_flags); + EXPECT_EQ(flagOffsetsEquality(ps.flag_offsets, ts.flag_offsets), true); // default values EXPECT_EQ(new_ts.num_towers, ps.num_towers); EXPECT_EQ(new_ts.num_enemy_towers, ps.num_enemy_towers); - EXPECT_EQ(new_ts.num_flags, ps.num_flags); } From 8994ddc359aaf1f363f56097f3a6f3739923608c Mon Sep 17 00:00:00 2001 From: Dipesh Kafle Date: Tue, 23 Mar 2021 20:50:24 +0545 Subject: [PATCH 3/3] Added equality checks for .bots and .towers in transfer_state_test --- test/player_wrapper/transfer_state_test.cpp | 52 +++++++++++++++------ 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/test/player_wrapper/transfer_state_test.cpp b/test/player_wrapper/transfer_state_test.cpp index bf9e24b3..4866d10b 100644 --- a/test/player_wrapper/transfer_state_test.cpp +++ b/test/player_wrapper/transfer_state_test.cpp @@ -17,14 +17,23 @@ class TransferStateTest : public Test { TransferStateTest() : ts(), ps() { ts.num_bots = 10; + ts.bots[5].blast(); + ts.bots[6].transform(); ts.num_enemy_bots = 20; + ts.enemy_bots[10].blast(); + ts.enemy_bots[11].transform(); ts.num_towers = 30; + ts.towers[29].blast(); ts.scores = {1000, 2000}; ps.num_bots = 50; ps.bots.assign(ps.num_bots, player_state::Bot()); + ps.bots[10].blast(); + ps.bots[20].transform(); ps.num_enemy_bots = 30; ps.enemy_bots.assign(ps.num_enemy_bots, player_state::Bot()); + ps.enemy_bots[7].blast(); + ps.enemy_bots[9].transform(); ps.scores = {100, 200}; // Creating a basic map and player state @@ -77,14 +86,11 @@ class TransferStateTest : public Test { return true; } - bool flagOffsetsEquality( - const vector &ps_flags, - const array &ts_flags) { - for (auto i = 0u; i < ps_flags.size(); i++) { - if (ps_flags[i] != ts_flags[i]) - return false; - } - return true; + template + bool compareVectorAndArray(const vector &vec, const array &arr) { + return all_of( + vec.begin(), vec.end(), + [&arr, i = 0](const T &val) mutable { return val == arr[i++]; }); } }; @@ -92,30 +98,50 @@ TEST_F(TransferStateTest, ConvertToPlayerStateTest) { auto new_ps = ConvertToPlayerState(ts); // non default values, changed in TransferStateTest constructor - EXPECT_EQ(new_ps.num_bots, ts.num_bots); // must equal 10 + EXPECT_EQ(new_ps.num_bots, ts.num_bots); // must equal 10 + EXPECT_EQ(compareVectorAndArray(new_ps.bots, ts.bots), true); + EXPECT_EQ(new_ps.num_enemy_bots, ts.num_enemy_bots); // must equal 20 - EXPECT_EQ(new_ps.num_towers, ts.num_towers); // must equal 30 + EXPECT_EQ(compareVectorAndArray(new_ps.enemy_bots, ts.enemy_bots), true); + + EXPECT_EQ(new_ps.num_towers, ts.num_towers); // must equal 30 + EXPECT_EQ(compareVectorAndArray(new_ps.towers, ts.towers), true); + EXPECT_EQ(pairFromScores(new_ps.scores), pairFromScores(ts.scores)); + EXPECT_EQ(mapEquality(new_ps.map, ts.map), true); + EXPECT_EQ(new_ps.num_flags, ts.num_flags); - EXPECT_EQ(flagOffsetsEquality(new_ps.flag_offsets, ts.flag_offsets), true); + EXPECT_EQ(compareVectorAndArray(new_ps.flag_offsets, ts.flag_offsets), + true); // default values EXPECT_EQ(new_ps.num_enemy_towers, ts.num_enemy_towers); + EXPECT_EQ(compareVectorAndArray(new_ps.enemy_towers, ts.enemy_towers), + true); } TEST_F(TransferStateTest, ConvertToTransferStateTest) { auto new_ts = ConvertToTransferState(ps); // non default values, changed in TransferStateTest constructor - EXPECT_EQ(new_ts.num_bots, ps.num_bots); // equals 50 + EXPECT_EQ(new_ts.num_bots, ps.num_bots); // equals 50 + EXPECT_EQ(compareVectorAndArray(ps.bots, new_ts.bots), true); + EXPECT_EQ(new_ts.num_enemy_bots, ps.num_enemy_bots); // equals 30 + EXPECT_EQ(compareVectorAndArray(ps.enemy_bots, new_ts.enemy_bots), true); + EXPECT_EQ(pairFromScores(new_ts.scores), pairFromScores(ps.scores)); + EXPECT_EQ(mapEquality(new_ts.map, ps.map), true); + EXPECT_EQ(new_ts.num_flags, ps.num_flags); - EXPECT_EQ(flagOffsetsEquality(ps.flag_offsets, ts.flag_offsets), true); + EXPECT_EQ(compareVectorAndArray(ps.flag_offsets, ts.flag_offsets), true); // default values EXPECT_EQ(new_ts.num_towers, ps.num_towers); + EXPECT_EQ(compareVectorAndArray(ps.towers, new_ts.towers), true); EXPECT_EQ(new_ts.num_enemy_towers, ps.num_enemy_towers); + EXPECT_EQ(compareVectorAndArray(ps.enemy_towers, new_ts.enemy_towers), + true); }