#include #include #include namespace tp = td::protocol; class Comparator { public: bool operator()(const tp::cdata::End& left, const tp::cdata::End& right) { return true; } bool operator()(const tp::cdata::PlaceTower& left, const tp::cdata::PlaceTower& right) { return left.m_Placer == right.m_Placer && left.m_Position.x == right.m_Position.x && left.m_Position.y == right.m_Position.y && left.m_Type == right.m_Type; } bool operator()(const tp::cdata::PlayerJoin& left, const tp::cdata::PlayerJoin& right) { return left.m_ID == right.m_ID && left.m_Name == right.m_Name; } bool operator()(const tp::cdata::SpawnTroop& left, const tp::cdata::SpawnTroop& right) { return left.m_Level == right.m_Level && left.m_Position.x == right.m_Position.x && left.m_Position.y == right.m_Position.y && left.m_Sender == right.m_Sender && left.m_Type == right.m_Type; } bool operator()(const tp::cdata::TeamChange& left, const tp::cdata::TeamChange& right) { return left.m_NewTeam == right.m_NewTeam && left.m_Player == right.m_Player; } bool operator()(const tp::cdata::UpgradeTower& left, const tp::cdata::UpgradeTower& right) { return left.m_Tower == right.m_Tower && left.m_Upgrade == right.m_Upgrade; } bool operator()(const tp::cdata::UseItem& left, const tp::cdata::UseItem& right) { return left.m_Item == right.m_Item && left.m_Position.x == right.m_Position.x && left.m_Position.y == right.m_Position.y && left.m_User == right.m_User; } }; template static int TestCommand(const Command_T& command) { td::DataBuffer buffer = tp::CommandSerializer::Serialize(command); auto abstractCommand = tp::CommandSerializer::Deserialize(buffer); td_test_assert(abstractCommand); Command_T* command2 = dynamic_cast(abstractCommand.get()); td_test_assert(command2); td_test_assert(command.GetType() == command2->GetType()); return Comparator{}(command.m_Data, command2->m_Data); } #define DeclareCommand(Command, ...) td_test_assert(TestCommand({})); static int TestAllCommands() { td_test_assert(TestCommand({})); td_test_assert(TestCommand({tp::cdata::PlaceTower{ td::TowerType::Necromancer, 8, td::TowerCoords{-50, 69}, }})); td_test_assert(TestCommand({tp::cdata::PlayerJoin{ 4, "Persson", }})); td_test_assert(TestCommand({tp::cdata::SpawnTroop{ td::EntityType::Blaze, 4, td::EntityCoords{td::FpFloat{54}, td::FpFloat{58}}, 2, }})); td_test_assert(TestCommand({tp::cdata::TeamChange{ 7, td::Team::Red, }})); td_test_assert(TestCommand({tp::cdata::UpgradeTower{ 69, 3, }})); td_test_assert(TestCommand({tp::cdata::UseItem{ td::ShopItem::Freeze, 5, td::EntityCoords{td::FpFloat{24}, td::FpFloat{-69}}, }})); DeclareAllCommand() return TD_TEST_SUCCESSFUL; } int main() { return TestAllCommands(); }