campaign_loader_test.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include "game/map/campaign_definition.h"
  2. #include "game/map/campaign_loader.h"
  3. #include <QTemporaryFile>
  4. #include <gtest/gtest.h>
  5. using namespace Game::Campaign;
  6. class CampaignLoaderTest : public ::testing::Test {
  7. protected:
  8. void SetUp() override {}
  9. auto createTestCampaign() -> QString {
  10. return R"({
  11. "id": "test_campaign",
  12. "title": "Test Campaign",
  13. "description": "A test campaign for unit testing",
  14. "missions": [
  15. {
  16. "mission_id": "mission_1",
  17. "order_index": 0,
  18. "intro_text": "Welcome to mission 1",
  19. "outro_text": "Mission 1 completed"
  20. },
  21. {
  22. "mission_id": "mission_2",
  23. "order_index": 1,
  24. "intro_text": "Welcome to mission 2",
  25. "outro_text": "Mission 2 completed",
  26. "difficulty_modifier": 1.2
  27. }
  28. ]
  29. })";
  30. }
  31. };
  32. TEST_F(CampaignLoaderTest, LoadsValidCampaign) {
  33. QTemporaryFile temp_file;
  34. ASSERT_TRUE(temp_file.open());
  35. temp_file.write(createTestCampaign().toUtf8());
  36. temp_file.flush();
  37. CampaignDefinition campaign;
  38. QString error;
  39. bool result =
  40. CampaignLoader::loadFromJsonFile(temp_file.fileName(), campaign, &error);
  41. EXPECT_TRUE(result) << "Error: " << error.toStdString();
  42. EXPECT_EQ(campaign.id, "test_campaign");
  43. EXPECT_EQ(campaign.title, "Test Campaign");
  44. EXPECT_EQ(campaign.description, "A test campaign for unit testing");
  45. }
  46. TEST_F(CampaignLoaderTest, ParsesMissions) {
  47. QTemporaryFile temp_file;
  48. ASSERT_TRUE(temp_file.open());
  49. temp_file.write(createTestCampaign().toUtf8());
  50. temp_file.flush();
  51. CampaignDefinition campaign;
  52. QString error;
  53. ASSERT_TRUE(
  54. CampaignLoader::loadFromJsonFile(temp_file.fileName(), campaign, &error));
  55. ASSERT_EQ(campaign.missions.size(), 2);
  56. EXPECT_EQ(campaign.missions[0].mission_id, "mission_1");
  57. EXPECT_EQ(campaign.missions[0].order_index, 0);
  58. EXPECT_TRUE(campaign.missions[0].intro_text.has_value());
  59. EXPECT_EQ(*campaign.missions[0].intro_text, "Welcome to mission 1");
  60. EXPECT_TRUE(campaign.missions[0].outro_text.has_value());
  61. EXPECT_EQ(*campaign.missions[0].outro_text, "Mission 1 completed");
  62. EXPECT_EQ(campaign.missions[1].mission_id, "mission_2");
  63. EXPECT_EQ(campaign.missions[1].order_index, 1);
  64. EXPECT_TRUE(campaign.missions[1].difficulty_modifier.has_value());
  65. EXPECT_FLOAT_EQ(*campaign.missions[1].difficulty_modifier, 1.2F);
  66. }
  67. TEST_F(CampaignLoaderTest, FailsOnInvalidJSON) {
  68. QTemporaryFile temp_file;
  69. ASSERT_TRUE(temp_file.open());
  70. temp_file.write("{ invalid json }");
  71. temp_file.flush();
  72. CampaignDefinition campaign;
  73. QString error;
  74. bool result =
  75. CampaignLoader::loadFromJsonFile(temp_file.fileName(), campaign, &error);
  76. EXPECT_FALSE(result);
  77. EXPECT_FALSE(error.isEmpty());
  78. }
  79. TEST_F(CampaignLoaderTest, FailsOnNonexistentFile) {
  80. CampaignDefinition campaign;
  81. QString error;
  82. bool result = CampaignLoader::loadFromJsonFile("/nonexistent/file.json",
  83. campaign, &error);
  84. EXPECT_FALSE(result);
  85. EXPECT_FALSE(error.isEmpty());
  86. }
  87. TEST_F(CampaignLoaderTest, HandlesEmptyMissions) {
  88. QString json = R"({
  89. "id": "empty_campaign",
  90. "title": "Empty Campaign",
  91. "description": "Campaign with no missions",
  92. "missions": []
  93. })";
  94. QTemporaryFile temp_file;
  95. ASSERT_TRUE(temp_file.open());
  96. temp_file.write(json.toUtf8());
  97. temp_file.flush();
  98. CampaignDefinition campaign;
  99. QString error;
  100. ASSERT_TRUE(
  101. CampaignLoader::loadFromJsonFile(temp_file.fileName(), campaign, &error));
  102. EXPECT_EQ(campaign.missions.size(), 0);
  103. }
  104. TEST_F(CampaignLoaderTest, HandlesOptionalFields) {
  105. QString json = R"({
  106. "id": "minimal_campaign",
  107. "title": "Minimal Campaign",
  108. "description": "Campaign with minimal mission data",
  109. "missions": [
  110. {
  111. "mission_id": "mission_1",
  112. "order_index": 0
  113. }
  114. ]
  115. })";
  116. QTemporaryFile temp_file;
  117. ASSERT_TRUE(temp_file.open());
  118. temp_file.write(json.toUtf8());
  119. temp_file.flush();
  120. CampaignDefinition campaign;
  121. QString error;
  122. ASSERT_TRUE(
  123. CampaignLoader::loadFromJsonFile(temp_file.fileName(), campaign, &error));
  124. ASSERT_EQ(campaign.missions.size(), 1);
  125. EXPECT_EQ(campaign.missions[0].mission_id, "mission_1");
  126. EXPECT_FALSE(campaign.missions[0].intro_text.has_value());
  127. EXPECT_FALSE(campaign.missions[0].outro_text.has_value());
  128. EXPECT_FALSE(campaign.missions[0].difficulty_modifier.has_value());
  129. }