mission_loader_test.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include "game/map/mission_definition.h"
  2. #include "game/map/mission_loader.h"
  3. #include <QTemporaryFile>
  4. #include <gtest/gtest.h>
  5. using namespace Game::Mission;
  6. class MissionLoaderTest : public ::testing::Test {
  7. protected:
  8. void SetUp() override {}
  9. auto createTestMission() -> QString {
  10. return R"({
  11. "id": "test_mission",
  12. "title": "Test Mission",
  13. "summary": "A test mission for unit testing",
  14. "map_path": ":/assets/maps/map_forest.json",
  15. "player_setup": {
  16. "nation": "roman_republic",
  17. "faction": "roman",
  18. "color": "red",
  19. "starting_units": [
  20. {
  21. "type": "spearman",
  22. "count": 10,
  23. "position": {"x": 60, "z": 60}
  24. }
  25. ],
  26. "starting_buildings": [
  27. {
  28. "type": "barracks",
  29. "position": {"x": 60, "z": 60},
  30. "max_population": 200
  31. }
  32. ],
  33. "starting_resources": {
  34. "gold": 1000,
  35. "food": 500
  36. }
  37. },
  38. "ai_setups": [
  39. {
  40. "id": "enemy_1",
  41. "nation": "carthage",
  42. "faction": "carthaginian",
  43. "color": "blue",
  44. "difficulty": "medium",
  45. "personality": {
  46. "aggression": 0.7,
  47. "defense": 0.3,
  48. "harassment": 0.5
  49. },
  50. "starting_units": [],
  51. "starting_buildings": [],
  52. "waves": [
  53. {
  54. "timing": 120.0,
  55. "composition": [
  56. {"type": "swordsman", "count": 8}
  57. ],
  58. "entry_point": {"x": 190, "z": 190}
  59. }
  60. ]
  61. }
  62. ],
  63. "victory_conditions": [
  64. {
  65. "type": "survive_duration",
  66. "duration": 600.0,
  67. "description": "Survive for 10 minutes"
  68. }
  69. ],
  70. "defeat_conditions": [
  71. {
  72. "type": "lose_structure",
  73. "structure_type": "barracks",
  74. "description": "Do not lose your barracks"
  75. }
  76. ],
  77. "events": []
  78. })";
  79. }
  80. };
  81. TEST_F(MissionLoaderTest, LoadsValidMission) {
  82. QTemporaryFile temp_file;
  83. ASSERT_TRUE(temp_file.open());
  84. temp_file.write(createTestMission().toUtf8());
  85. temp_file.flush();
  86. MissionDefinition mission;
  87. QString error;
  88. bool result =
  89. MissionLoader::loadFromJsonFile(temp_file.fileName(), mission, &error);
  90. EXPECT_TRUE(result) << "Error: " << error.toStdString();
  91. EXPECT_EQ(mission.id, "test_mission");
  92. EXPECT_EQ(mission.title, "Test Mission");
  93. EXPECT_EQ(mission.summary, "A test mission for unit testing");
  94. EXPECT_EQ(mission.map_path, ":/assets/maps/map_forest.json");
  95. }
  96. TEST_F(MissionLoaderTest, ParsesPlayerSetup) {
  97. QTemporaryFile temp_file;
  98. ASSERT_TRUE(temp_file.open());
  99. temp_file.write(createTestMission().toUtf8());
  100. temp_file.flush();
  101. MissionDefinition mission;
  102. QString error;
  103. ASSERT_TRUE(
  104. MissionLoader::loadFromJsonFile(temp_file.fileName(), mission, &error));
  105. EXPECT_EQ(mission.player_setup.nation, "roman_republic");
  106. EXPECT_EQ(mission.player_setup.faction, "roman");
  107. EXPECT_EQ(mission.player_setup.color, "red");
  108. EXPECT_EQ(mission.player_setup.starting_units.size(), 1);
  109. EXPECT_EQ(mission.player_setup.starting_buildings.size(), 1);
  110. EXPECT_EQ(mission.player_setup.starting_resources.gold, 1000);
  111. EXPECT_EQ(mission.player_setup.starting_resources.food, 500);
  112. }
  113. TEST_F(MissionLoaderTest, ParsesAISetups) {
  114. QTemporaryFile temp_file;
  115. ASSERT_TRUE(temp_file.open());
  116. temp_file.write(createTestMission().toUtf8());
  117. temp_file.flush();
  118. MissionDefinition mission;
  119. QString error;
  120. ASSERT_TRUE(
  121. MissionLoader::loadFromJsonFile(temp_file.fileName(), mission, &error));
  122. ASSERT_EQ(mission.ai_setups.size(), 1);
  123. EXPECT_EQ(mission.ai_setups[0].id, "enemy_1");
  124. EXPECT_EQ(mission.ai_setups[0].nation, "carthage");
  125. EXPECT_EQ(mission.ai_setups[0].difficulty, "medium");
  126. EXPECT_FLOAT_EQ(mission.ai_setups[0].personality.aggression, 0.7F);
  127. EXPECT_EQ(mission.ai_setups[0].waves.size(), 1);
  128. }
  129. TEST_F(MissionLoaderTest, ParsesVictoryConditions) {
  130. QTemporaryFile temp_file;
  131. ASSERT_TRUE(temp_file.open());
  132. temp_file.write(createTestMission().toUtf8());
  133. temp_file.flush();
  134. MissionDefinition mission;
  135. QString error;
  136. ASSERT_TRUE(
  137. MissionLoader::loadFromJsonFile(temp_file.fileName(), mission, &error));
  138. ASSERT_EQ(mission.victory_conditions.size(), 1);
  139. EXPECT_EQ(mission.victory_conditions[0].type, "survive_duration");
  140. EXPECT_TRUE(mission.victory_conditions[0].duration.has_value());
  141. EXPECT_FLOAT_EQ(*mission.victory_conditions[0].duration, 600.0F);
  142. }
  143. TEST_F(MissionLoaderTest, ParsesDefeatConditions) {
  144. QTemporaryFile temp_file;
  145. ASSERT_TRUE(temp_file.open());
  146. temp_file.write(createTestMission().toUtf8());
  147. temp_file.flush();
  148. MissionDefinition mission;
  149. QString error;
  150. ASSERT_TRUE(
  151. MissionLoader::loadFromJsonFile(temp_file.fileName(), mission, &error));
  152. ASSERT_EQ(mission.defeat_conditions.size(), 1);
  153. EXPECT_EQ(mission.defeat_conditions[0].type, "lose_structure");
  154. EXPECT_TRUE(mission.defeat_conditions[0].structure_type.has_value());
  155. EXPECT_EQ(*mission.defeat_conditions[0].structure_type, "barracks");
  156. }
  157. TEST_F(MissionLoaderTest, FailsOnInvalidJSON) {
  158. QTemporaryFile temp_file;
  159. ASSERT_TRUE(temp_file.open());
  160. temp_file.write("{ invalid json }");
  161. temp_file.flush();
  162. MissionDefinition mission;
  163. QString error;
  164. bool result =
  165. MissionLoader::loadFromJsonFile(temp_file.fileName(), mission, &error);
  166. EXPECT_FALSE(result);
  167. EXPECT_FALSE(error.isEmpty());
  168. }
  169. TEST_F(MissionLoaderTest, FailsOnNonexistentFile) {
  170. MissionDefinition mission;
  171. QString error;
  172. bool result = MissionLoader::loadFromJsonFile("/nonexistent/file.json",
  173. mission, &error);
  174. EXPECT_FALSE(result);
  175. EXPECT_FALSE(error.isEmpty());
  176. }