MathTests.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. module Tests;
  2. import Core.Math;
  3. import Core.Test;
  4. constexpr float eps = 0.0001f;
  5. static void testInterpolate() {
  6. Core::testFloat(7.5f, Core::interpolate(5.0f, 10.0f, 0.5f), eps);
  7. Core::testFloat(-2.0, Core::interpolate(-10.0f, 10.0f, 0.4f), eps);
  8. Core::testFloat(10.0f, Core::interpolate(-3.0f, 10.0f, 1.0f), eps);
  9. Core::testFloat(7.0f, Core::interpolate(7.0f, 10.0f, 0.0f), eps);
  10. Core::testFloat(6.0f, Core::interpolate(0.0f, 10.0f, 0.6f), eps);
  11. }
  12. static void testIsPowerOf2() {
  13. Core::testTrue(Core::isPowerOf2(1));
  14. Core::testTrue(Core::isPowerOf2(2));
  15. Core::testFalse(Core::isPowerOf2(3));
  16. Core::testTrue(Core::isPowerOf2(4));
  17. Core::testFalse(Core::isPowerOf2(5));
  18. Core::testFalse(Core::isPowerOf2(6));
  19. Core::testFalse(Core::isPowerOf2(7));
  20. Core::testTrue(Core::isPowerOf2(8));
  21. Core::testFalse(Core::isPowerOf2(9));
  22. Core::testFalse(Core::isPowerOf2(10));
  23. for(int i = 16; i < 30'000; i *= 2) {
  24. Core::testTrue(Core::isPowerOf2(i));
  25. Core::testFalse(Core::isPowerOf2(i + 1));
  26. Core::testFalse(Core::isPowerOf2(i + 2));
  27. Core::testFalse(Core::isPowerOf2(i + 3));
  28. }
  29. }
  30. static void testRoundUpLog2() {
  31. Core::test(0, Core::roundUpLog2(-5));
  32. Core::test(0, Core::roundUpLog2(0));
  33. Core::test(1, Core::roundUpLog2(1));
  34. Core::test(1, Core::roundUpLog2(2));
  35. Core::test(2, Core::roundUpLog2(3));
  36. Core::test(2, Core::roundUpLog2(4));
  37. Core::test(3, Core::roundUpLog2(5));
  38. Core::test(4, Core::roundUpLog2(10));
  39. Core::test(5, Core::roundUpLog2(20));
  40. Core::test(16, Core::roundUpLog2(35'345));
  41. Core::test(31, Core::roundUpLog2(0x7FFF'FFFF));
  42. }
  43. static void testMin() {
  44. Core::test(-5, Core::min(-5));
  45. Core::test(-10, Core::min(-5, 4, 3, 2, -10));
  46. Core::test(4, Core::min(5, 20, 4, 30));
  47. }
  48. static void testMax() {
  49. Core::test(-5, Core::max(-5));
  50. Core::test(4, Core::max(-5, 4, 3, 2, -10));
  51. Core::test(30, Core::max(5, 20, 4, 30));
  52. }
  53. static void testClamp() {
  54. Core::test(5, Core::clamp(1, 5, 10));
  55. Core::test(7, Core::clamp(7, 5, 10));
  56. Core::test(10, Core::clamp(20, 5, 10));
  57. Core::test(5, Core::clamp(1, 10, 5));
  58. Core::test(7, Core::clamp(7, 10, 5));
  59. Core::test(10, Core::clamp(20, 10, 5));
  60. }
  61. static void testRadianToDegree() {
  62. Core::testFloat(45.0f, Core::radianToDegree(Core::PI * 0.25f), eps);
  63. Core::testFloat(90.0f, Core::radianToDegree(Core::PI * 0.5f), eps);
  64. Core::testFloat(180.0f, Core::radianToDegree(Core::PI), eps);
  65. Core::testFloat(360.0f, Core::radianToDegree(Core::PI * 2.0f), eps);
  66. }
  67. static void testDegreeToRadian() {
  68. Core::testFloat(Core::PI * 0.25f, Core::degreeToRadian(45.0f), eps);
  69. Core::testFloat(Core::PI * 0.5f, Core::degreeToRadian(90.0f), eps);
  70. Core::testFloat(Core::PI, Core::degreeToRadian(180.0f), eps);
  71. Core::testFloat(Core::PI * 2.0f, Core::degreeToRadian(360.0f), eps);
  72. }
  73. void testMath() {
  74. testInterpolate();
  75. testIsPowerOf2();
  76. testRoundUpLog2();
  77. testMin();
  78. testMax();
  79. testClamp();
  80. testRadianToDegree();
  81. testDegreeToRadian();
  82. }