rain_manager_test.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. #include "systems/rain_manager.h"
  2. #include <gtest/gtest.h>
  3. using namespace Game::Systems;
  4. using namespace Game::Map;
  5. class RainManagerTest : public ::testing::Test {
  6. protected:
  7. void SetUp() override { rain_manager = std::make_unique<RainManager>(); }
  8. void TearDown() override { rain_manager.reset(); }
  9. std::unique_ptr<RainManager> rain_manager;
  10. };
  11. TEST_F(RainManagerTest, DefaultStateIsDisabled) {
  12. EXPECT_FALSE(rain_manager->is_enabled());
  13. EXPECT_EQ(rain_manager->get_state(), RainState::Clear);
  14. EXPECT_FLOAT_EQ(rain_manager->get_intensity(), 0.0F);
  15. }
  16. TEST_F(RainManagerTest, ConfigureEnablesRain) {
  17. RainSettings settings;
  18. settings.enabled = true;
  19. settings.cycle_duration = 100.0F;
  20. settings.active_duration = 30.0F;
  21. settings.intensity = 0.8F;
  22. settings.fade_duration = 5.0F;
  23. rain_manager->configure(settings, 12345);
  24. EXPECT_TRUE(rain_manager->is_enabled());
  25. EXPECT_FLOAT_EQ(rain_manager->get_cycle_duration(), 100.0F);
  26. }
  27. TEST_F(RainManagerTest, ConfigureWithDisabledRain) {
  28. RainSettings settings;
  29. settings.enabled = false;
  30. rain_manager->configure(settings, 12345);
  31. EXPECT_FALSE(rain_manager->is_enabled());
  32. }
  33. TEST_F(RainManagerTest, UpdateDoesNothingWhenDisabled) {
  34. RainSettings settings;
  35. settings.enabled = false;
  36. rain_manager->configure(settings, 12345);
  37. rain_manager->update(10.0F);
  38. EXPECT_EQ(rain_manager->get_state(), RainState::Clear);
  39. EXPECT_FLOAT_EQ(rain_manager->get_intensity(), 0.0F);
  40. }
  41. TEST_F(RainManagerTest, RainCycleStartsWithFadingIn) {
  42. RainSettings settings;
  43. settings.enabled = true;
  44. settings.cycle_duration = 100.0F;
  45. settings.active_duration = 30.0F;
  46. settings.intensity = 1.0F;
  47. settings.fade_duration = 5.0F;
  48. rain_manager->configure(settings, 0);
  49. rain_manager->update(0.1F);
  50. EXPECT_EQ(rain_manager->get_state(), RainState::FadingIn);
  51. EXPECT_TRUE(rain_manager->is_raining());
  52. }
  53. TEST_F(RainManagerTest, RainTransitionsToActive) {
  54. RainSettings settings;
  55. settings.enabled = true;
  56. settings.cycle_duration = 100.0F;
  57. settings.active_duration = 30.0F;
  58. settings.intensity = 1.0F;
  59. settings.fade_duration = 5.0F;
  60. rain_manager->configure(settings, 0);
  61. rain_manager->update(6.0F);
  62. EXPECT_EQ(rain_manager->get_state(), RainState::Active);
  63. EXPECT_FLOAT_EQ(rain_manager->get_intensity(), 1.0F);
  64. }
  65. TEST_F(RainManagerTest, RainTransitionsToFadingOut) {
  66. RainSettings settings;
  67. settings.enabled = true;
  68. settings.cycle_duration = 100.0F;
  69. settings.active_duration = 30.0F;
  70. settings.intensity = 1.0F;
  71. settings.fade_duration = 5.0F;
  72. rain_manager->configure(settings, 0);
  73. rain_manager->update(26.0F);
  74. EXPECT_EQ(rain_manager->get_state(), RainState::FadingOut);
  75. EXPECT_TRUE(rain_manager->is_raining());
  76. }
  77. TEST_F(RainManagerTest, RainTransitionsToClear) {
  78. RainSettings settings;
  79. settings.enabled = true;
  80. settings.cycle_duration = 100.0F;
  81. settings.active_duration = 30.0F;
  82. settings.intensity = 1.0F;
  83. settings.fade_duration = 5.0F;
  84. rain_manager->configure(settings, 0);
  85. rain_manager->update(35.0F);
  86. EXPECT_EQ(rain_manager->get_state(), RainState::Clear);
  87. EXPECT_FALSE(rain_manager->is_raining());
  88. EXPECT_FLOAT_EQ(rain_manager->get_intensity(), 0.0F);
  89. }
  90. TEST_F(RainManagerTest, RainCycleRepeats) {
  91. RainSettings settings;
  92. settings.enabled = true;
  93. settings.cycle_duration = 100.0F;
  94. settings.active_duration = 30.0F;
  95. settings.intensity = 1.0F;
  96. settings.fade_duration = 5.0F;
  97. rain_manager->configure(settings, 0);
  98. rain_manager->update(101.0F);
  99. EXPECT_EQ(rain_manager->get_state(), RainState::FadingIn);
  100. EXPECT_TRUE(rain_manager->is_raining());
  101. }
  102. TEST_F(RainManagerTest, IntensityGraduallyIncreasesInFadeIn) {
  103. RainSettings settings;
  104. settings.enabled = true;
  105. settings.cycle_duration = 100.0F;
  106. settings.active_duration = 30.0F;
  107. settings.intensity = 1.0F;
  108. settings.fade_duration = 5.0F;
  109. rain_manager->configure(settings, 0);
  110. rain_manager->update(2.5F);
  111. EXPECT_EQ(rain_manager->get_state(), RainState::FadingIn);
  112. EXPECT_GT(rain_manager->get_intensity(), 0.0F);
  113. EXPECT_LT(rain_manager->get_intensity(), 1.0F);
  114. }
  115. TEST_F(RainManagerTest, IntensityGraduallyDecreasesInFadeOut) {
  116. RainSettings settings;
  117. settings.enabled = true;
  118. settings.cycle_duration = 100.0F;
  119. settings.active_duration = 30.0F;
  120. settings.intensity = 1.0F;
  121. settings.fade_duration = 5.0F;
  122. rain_manager->configure(settings, 0);
  123. rain_manager->update(27.0F);
  124. EXPECT_EQ(rain_manager->get_state(), RainState::FadingOut);
  125. rain_manager->update(1.0F);
  126. EXPECT_GT(rain_manager->get_intensity(), 0.0F);
  127. EXPECT_LT(rain_manager->get_intensity(), 1.0F);
  128. }
  129. TEST_F(RainManagerTest, StateChangeCallbackIsCalled) {
  130. RainSettings settings;
  131. settings.enabled = true;
  132. settings.cycle_duration = 100.0F;
  133. settings.active_duration = 30.0F;
  134. settings.intensity = 1.0F;
  135. settings.fade_duration = 5.0F;
  136. int callback_count = 0;
  137. RainState last_state = RainState::Clear;
  138. rain_manager->set_state_change_callback([&](RainState new_state) {
  139. callback_count++;
  140. last_state = new_state;
  141. });
  142. rain_manager->configure(settings, 0);
  143. rain_manager->update(0.1F);
  144. EXPECT_EQ(callback_count, 1);
  145. EXPECT_EQ(last_state, RainState::FadingIn);
  146. }
  147. TEST_F(RainManagerTest, ResetClearsState) {
  148. RainSettings settings;
  149. settings.enabled = true;
  150. settings.cycle_duration = 100.0F;
  151. settings.active_duration = 30.0F;
  152. settings.intensity = 1.0F;
  153. settings.fade_duration = 5.0F;
  154. rain_manager->configure(settings, 0);
  155. rain_manager->update(10.0F);
  156. rain_manager->reset();
  157. EXPECT_EQ(rain_manager->get_state(), RainState::Clear);
  158. EXPECT_FLOAT_EQ(rain_manager->get_intensity(), 0.0F);
  159. }
  160. TEST_F(RainManagerTest, DeterministicTimingWithSeed) {
  161. RainSettings settings;
  162. settings.enabled = true;
  163. settings.cycle_duration = 100.0F;
  164. settings.active_duration = 30.0F;
  165. settings.intensity = 1.0F;
  166. settings.fade_duration = 5.0F;
  167. RainManager manager1;
  168. RainManager manager2;
  169. manager1.configure(settings, 12345);
  170. manager2.configure(settings, 12345);
  171. EXPECT_FLOAT_EQ(manager1.get_cycle_time(), manager2.get_cycle_time());
  172. }
  173. TEST_F(RainManagerTest, WeatherTypeDefaultsToRain) {
  174. RainSettings settings;
  175. settings.enabled = true;
  176. settings.cycle_duration = 100.0F;
  177. settings.active_duration = 30.0F;
  178. settings.intensity = 0.8F;
  179. settings.fade_duration = 5.0F;
  180. rain_manager->configure(settings, 12345);
  181. EXPECT_EQ(rain_manager->get_weather_type(), WeatherType::Rain);
  182. }
  183. TEST_F(RainManagerTest, WeatherTypeCanBeSetToSnow) {
  184. RainSettings settings;
  185. settings.enabled = true;
  186. settings.type = WeatherType::Snow;
  187. settings.cycle_duration = 100.0F;
  188. settings.active_duration = 30.0F;
  189. settings.intensity = 0.8F;
  190. settings.fade_duration = 5.0F;
  191. rain_manager->configure(settings, 12345);
  192. EXPECT_EQ(rain_manager->get_weather_type(), WeatherType::Snow);
  193. }
  194. TEST_F(RainManagerTest, WindStrengthDefaultsToZero) {
  195. RainSettings settings;
  196. settings.enabled = true;
  197. settings.cycle_duration = 100.0F;
  198. settings.active_duration = 30.0F;
  199. settings.intensity = 0.8F;
  200. settings.fade_duration = 5.0F;
  201. rain_manager->configure(settings, 12345);
  202. EXPECT_FLOAT_EQ(rain_manager->get_wind_strength(), 0.0F);
  203. }
  204. TEST_F(RainManagerTest, WindStrengthCanBeConfigured) {
  205. RainSettings settings;
  206. settings.enabled = true;
  207. settings.cycle_duration = 100.0F;
  208. settings.active_duration = 30.0F;
  209. settings.intensity = 0.8F;
  210. settings.fade_duration = 5.0F;
  211. settings.wind_strength = 0.5F;
  212. rain_manager->configure(settings, 12345);
  213. EXPECT_FLOAT_EQ(rain_manager->get_wind_strength(), 0.5F);
  214. }