ScreenFadeState.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /*
  2. * Copyright (C) 2022 The V-Gears Team
  3. *
  4. * This file is part of V-Gears
  5. *
  6. * V-Gears is free software: you can redistribute it and/or modify it under
  7. * terms of the GNU General Public License as published by the Free Software
  8. * Foundation, version 3.0 (GPLv3) of the License.
  9. *
  10. * V-Gears is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. */
  15. #include <boost/test/unit_test.hpp>
  16. #include "core/ScreenFadeState.h"
  17. BOOST_AUTO_TEST_CASE(TestScreenFadeStateSpeedToSeconds){
  18. BOOST_CHECK_CLOSE(ScreenFadeState::SpeedToSeconds(1), 8.0f, 0.01f);
  19. BOOST_CHECK_CLOSE(ScreenFadeState::SpeedToSeconds(2), 4.0f, 0.01f);
  20. BOOST_CHECK_CLOSE(ScreenFadeState::SpeedToSeconds(4), 2.0f, 0.01f);
  21. BOOST_CHECK_CLOSE(ScreenFadeState::SpeedToSeconds(8), 1.0f, 0.01f);
  22. BOOST_CHECK_CLOSE(ScreenFadeState::SpeedToSeconds(16), 0.5f, 0.01f);
  23. BOOST_CHECK_CLOSE(ScreenFadeState::SpeedToSeconds(32), 0.25f, 0.01f);
  24. // A speed that is not positive is instant.
  25. BOOST_CHECK_EQUAL(ScreenFadeState::SpeedToSeconds(0), 0.0f);
  26. BOOST_CHECK_EQUAL(ScreenFadeState::SpeedToSeconds(-3), 0.0f);
  27. }
  28. BOOST_AUTO_TEST_CASE(TestScreenFadeStateNothingByDefault){
  29. ScreenFadeState fade;
  30. BOOST_CHECK(!fade.IsFading());
  31. BOOST_CHECK(!fade.IsVisible());
  32. BOOST_CHECK_EQUAL(fade.GetBlend(), ScreenFadeState::BLEND_NONE);
  33. BOOST_CHECK(!fade.Advance(1.0f));
  34. }
  35. BOOST_AUTO_TEST_CASE(TestScreenFadeStateRedFlashAddsAndGoesBack){
  36. // FADE type 5: the colour is added, and goes down to nothing. It's the red flash.
  37. ScreenFadeState fade;
  38. BOOST_REQUIRE(fade.StartFade(5, 255, 0, 0, 8));
  39. BOOST_CHECK(fade.IsFading());
  40. BOOST_CHECK(fade.IsVisible());
  41. BOOST_CHECK_EQUAL(fade.GetBlend(), ScreenFadeState::BLEND_ADD);
  42. BOOST_CHECK_CLOSE(fade.GetColour().r, 1.0f, 0.01f);
  43. BOOST_CHECK_SMALL(fade.GetColour().g, 0.0001f);
  44. BOOST_CHECK(!fade.Advance(0.5f));
  45. BOOST_CHECK_CLOSE(fade.GetColour().r, 0.5f, 0.01f);
  46. // It ends once, and then the field is shown again.
  47. BOOST_CHECK(fade.Advance(0.5f));
  48. BOOST_CHECK(!fade.IsFading());
  49. BOOST_CHECK(!fade.IsVisible());
  50. BOOST_CHECK_EQUAL(fade.GetBlend(), ScreenFadeState::BLEND_NONE);
  51. BOOST_CHECK(!fade.Advance(1.0f));
  52. }
  53. BOOST_AUTO_TEST_CASE(TestScreenFadeStateFadeToColourHoldsIt){
  54. // FADE type 10: the colour is added for the time of the fade, and stays.
  55. ScreenFadeState fade;
  56. BOOST_REQUIRE(fade.StartFade(10, 40, 80, 120, 16));
  57. BOOST_CHECK(fade.Advance(0.5f));
  58. BOOST_CHECK(!fade.IsFading());
  59. BOOST_CHECK(fade.IsVisible());
  60. BOOST_CHECK_EQUAL(fade.GetBlend(), ScreenFadeState::BLEND_ADD);
  61. BOOST_CHECK_CLOSE(fade.GetColour().b, 120.0f / 255.0f, 0.01f);
  62. // Type 9 is the same, but it goes back to the field.
  63. BOOST_REQUIRE(fade.StartFade(9, 40, 80, 120, 16));
  64. BOOST_CHECK(fade.Advance(0.5f));
  65. BOOST_CHECK(!fade.IsVisible());
  66. }
  67. BOOST_AUTO_TEST_CASE(TestScreenFadeStateSubtractiveTypes){
  68. // Type 2 goes from nothing to the inverse of the colour times four, and holds it.
  69. ScreenFadeState fade;
  70. BOOST_REQUIRE(fade.StartFade(2, 255, 255, 255, 8));
  71. BOOST_CHECK_EQUAL(fade.GetBlend(), ScreenFadeState::BLEND_SUBTRACT);
  72. BOOST_CHECK(fade.Advance(1.0f));
  73. // White inverted is black: nothing is subtracted.
  74. BOOST_CHECK_SMALL(fade.GetColour().r, 0.0001f);
  75. // Black inverted four times is brighter than the maximum: it is limited, and takes it all.
  76. BOOST_REQUIRE(fade.StartFade(2, 0, 0, 0, 8));
  77. BOOST_CHECK(fade.Advance(1.0f));
  78. BOOST_CHECK_CLOSE(fade.GetColour().r, 1.0f, 0.01f);
  79. BOOST_CHECK(fade.IsVisible());
  80. // Type 1 goes the other way, and ends with the field.
  81. BOOST_REQUIRE(fade.StartFade(1, 0, 0, 0, 8));
  82. BOOST_CHECK_CLOSE(fade.GetColour().r, 1.0f, 0.01f);
  83. BOOST_CHECK(fade.Advance(1.0f));
  84. BOOST_CHECK(!fade.IsVisible());
  85. }
  86. BOOST_AUTO_TEST_CASE(TestScreenFadeStateInstantBlackAndNormalFade){
  87. // Type 4 makes the screen black at once, and nobody has to wait for it.
  88. ScreenFadeState fade;
  89. BOOST_REQUIRE(fade.StartFade(4, 12, 34, 56, 8));
  90. BOOST_CHECK(!fade.IsFading());
  91. BOOST_CHECK(fade.IsVisible());
  92. BOOST_CHECK_EQUAL(fade.GetBlend(), ScreenFadeState::BLEND_NORMAL);
  93. BOOST_CHECK_CLOSE(fade.GetAlpha(), 1.0f, 0.01f);
  94. BOOST_CHECK_SMALL(fade.GetColour().r, 0.0001f);
  95. // Type 6 covers the field with the colour little by little, and keeps it.
  96. BOOST_REQUIRE(fade.StartFade(6, 255, 255, 255, 8));
  97. BOOST_CHECK_EQUAL(fade.GetBlend(), ScreenFadeState::BLEND_NORMAL);
  98. BOOST_CHECK_SMALL(fade.GetAlpha(), 0.0001f);
  99. fade.Advance(0.5f);
  100. BOOST_CHECK_CLOSE(fade.GetAlpha(), 0.5f, 0.01f);
  101. BOOST_CHECK(fade.Advance(0.5f));
  102. BOOST_CHECK(fade.IsVisible());
  103. BOOST_CHECK_CLOSE(fade.GetAlpha(), 1.0f, 0.01f);
  104. }
  105. BOOST_AUTO_TEST_CASE(TestScreenFadeStateNFade){
  106. // NFADE type 11 adds the colour in 30 frames, which is a second, and keeps it.
  107. ScreenFadeState fade;
  108. BOOST_REQUIRE(fade.StartNFade(11, 200, 100, 0, 30));
  109. BOOST_CHECK_EQUAL(fade.GetBlend(), ScreenFadeState::BLEND_ADD);
  110. BOOST_CHECK_SMALL(fade.GetColour().r, 0.0001f);
  111. BOOST_CHECK(!fade.Advance(0.5f));
  112. BOOST_CHECK_CLOSE(fade.GetColour().r, 0.5f * 200.0f / 255.0f, 0.01f);
  113. BOOST_CHECK(fade.Advance(0.5f));
  114. BOOST_CHECK(fade.IsVisible());
  115. BOOST_CHECK_CLOSE(fade.GetColour().r, 200.0f / 255.0f, 0.01f);
  116. // Type 12 does the same, taking the colour from the field.
  117. BOOST_REQUIRE(fade.StartNFade(12, 200, 100, 0, 30));
  118. BOOST_CHECK_EQUAL(fade.GetBlend(), ScreenFadeState::BLEND_SUBTRACT);
  119. // Type 0 clears whatever there is.
  120. BOOST_REQUIRE(fade.StartNFade(0, 0, 0, 0, 0));
  121. BOOST_CHECK(!fade.IsVisible());
  122. BOOST_CHECK(!fade.IsFading());
  123. }
  124. BOOST_AUTO_TEST_CASE(TestScreenFadeStateUnknownTypesAndReplacement){
  125. ScreenFadeState fade;
  126. // Unknown types change nothing.
  127. BOOST_CHECK(!fade.StartFade(3, 255, 0, 0, 8));
  128. BOOST_CHECK(!fade.StartFade(99, 255, 0, 0, 8));
  129. BOOST_CHECK(!fade.StartNFade(5, 255, 0, 0, 8));
  130. BOOST_CHECK(!fade.IsVisible());
  131. // A new fade replaces the one that is running.
  132. BOOST_REQUIRE(fade.StartFade(5, 255, 0, 0, 8));
  133. fade.Advance(0.5f);
  134. BOOST_REQUIRE(fade.StartFade(10, 0, 255, 0, 8));
  135. BOOST_CHECK_EQUAL(fade.GetBlend(), ScreenFadeState::BLEND_ADD);
  136. BOOST_CHECK_SMALL(fade.GetColour().r, 0.0001f);
  137. BOOST_CHECK_CLOSE(fade.GetColour().g, 1.0f, 0.01f);
  138. // An unknown type doesn't stop the one that is running.
  139. BOOST_CHECK(!fade.StartFade(3, 0, 0, 0, 8));
  140. BOOST_CHECK(fade.IsFading());
  141. fade.Reset();
  142. BOOST_CHECK(!fade.IsVisible());
  143. BOOST_CHECK(!fade.IsFading());
  144. }