tuple_test.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /*
  2. * DoRayMe - a quick and dirty Raytracer
  3. * Tuples unit tests
  4. *
  5. * Created by Manoël Trapier
  6. * Copyright (c) 2020 986-Studio.
  7. *
  8. */
  9. #include <tuple.h>
  10. #include <math.h>
  11. #include <gtest/gtest.h>
  12. TEST(TupleTest, Tuple_With_w_equal_1_and_is_point)
  13. {
  14. Tuple a = Tuple(4.3, -4.2, 3.1, 1.0);
  15. ASSERT_EQ(a.x, 4.3);
  16. ASSERT_EQ(a.y, -4.2);
  17. ASSERT_EQ(a.z, 3.1);
  18. ASSERT_EQ(a.w, 1.0);
  19. ASSERT_TRUE(a.isPoint());
  20. ASSERT_FALSE(a.isVector());
  21. }
  22. TEST(TupleTest, Tuple_With_w_equal_0_and_is_vector)
  23. {
  24. Tuple a = Tuple(4.3, -4.2, 3.1, 0.0);
  25. ASSERT_EQ(a.x, 4.3);
  26. ASSERT_EQ(a.y, -4.2);
  27. ASSERT_EQ(a.z, 3.1);
  28. ASSERT_EQ(a.w, 0.0);
  29. ASSERT_FALSE(a.isPoint());
  30. ASSERT_TRUE(a.isVector());
  31. }
  32. TEST(TupleTest, Point_create_tuples_with_w_equal_1)
  33. {
  34. Tuple a = Point(4, -4, 3);
  35. ASSERT_EQ(a, Tuple(4, -4, 3, 1));
  36. }
  37. TEST(TupleTest, Vector_create_tuples_with_w_equal_0)
  38. {
  39. Tuple a = Vector(4, -4, 3);
  40. ASSERT_EQ(a, Tuple(4, -4, 3, 0));
  41. }
  42. TEST(TupleTest, Adding_two_tuples)
  43. {
  44. Tuple a1 = Tuple(3, -2, 5, 1);
  45. Tuple a2 = Tuple(-2, 3, 1, 0);
  46. ASSERT_EQ(a1 + a2, Tuple(1, 1, 6, 1));
  47. }
  48. TEST(TupleTest, Substracting_two_points)
  49. {
  50. Point p1 = Point(3, 2, 1);
  51. Point p2 = Point(5, 6, 7);
  52. ASSERT_EQ(p1 - p2, Vector(-2, -4, -6));
  53. }
  54. TEST(TupleTest, Substracting_a_vector_from_a_point)
  55. {
  56. Point p = Point(3, 2, 1);
  57. Vector v = Vector(5, 6, 7);
  58. ASSERT_EQ(p - v, Point(-2, -4, -6));
  59. }
  60. TEST(TupleTest, Substracting_two_vectors)
  61. {
  62. Vector v1 = Vector(3, 2, 1);
  63. Vector v2 = Vector(5, 6, 7);
  64. ASSERT_EQ(v1 - v2, Vector(-2, -4, -6));
  65. }
  66. TEST(TupleTest, Substracting_a_vector_from_zero_vector)
  67. {
  68. Vector zero = Vector(0, 0, 0);
  69. Vector v = Vector(1, -2, 3);
  70. ASSERT_EQ(zero - v, Vector(-1, 2, -3));
  71. }
  72. TEST(TupleTest, Negating_a_tuple)
  73. {
  74. Tuple a = Tuple(1, -2, 3, -4);
  75. ASSERT_EQ(-a, Tuple(-1, 2, -3, 4));
  76. }
  77. TEST(TupleTest, Multiplying_a_tuple_by_a_scalar)
  78. {
  79. Tuple a = Tuple(1, -2, 3, -4);
  80. ASSERT_EQ(a * 3.5, Tuple(3.5, -7, 10.5, -14));
  81. }
  82. TEST(TupleTest, Multiplying_a_tuple_by_a_fraction)
  83. {
  84. Tuple a = Tuple(1, -2, 3, -4);
  85. ASSERT_EQ(a * 0.5, Tuple(0.5, -1, 1.5, -2));
  86. }
  87. TEST(TupleTest, Dividing_a_tuple_by_a_scalar)
  88. {
  89. Tuple a = Tuple(1, -2, 3, -4);
  90. ASSERT_EQ(a / 2, Tuple(0.5, -1, 1.5, -2));
  91. }
  92. TEST(TupleTest, Computing_the_magnitude_of_vector_1_0_0)
  93. {
  94. Vector v = Vector(1, 0, 0);
  95. ASSERT_EQ(v.magnitude(), 1);
  96. }
  97. TEST(TupleTest, Computing_the_magnitude_of_vector_0_1_0)
  98. {
  99. Vector v = Vector(0, 1, 0);
  100. ASSERT_EQ(v.magnitude(), 1);
  101. }
  102. TEST(TupleTest, Computing_the_magnitude_of_vector_0_0_1)
  103. {
  104. Vector v = Vector(0, 0, 1);
  105. ASSERT_EQ(v.magnitude(), 1);
  106. }
  107. TEST(TupleTest, Computing_the_magnitude_of_vector_1_2_3)
  108. {
  109. Vector v = Vector(1, 2, 3);
  110. ASSERT_EQ(v.magnitude(), sqrt(14));
  111. }
  112. TEST(TupleTest, Computing_the_magnitude_of_vector_n1_n2_n3)
  113. {
  114. Vector v = Vector(-1, -2, -3);
  115. ASSERT_EQ(v.magnitude(), sqrt(14));
  116. }
  117. TEST(TupleTest, Nomilise_vector_4_0_0_give_1_0_0)
  118. {
  119. Vector v = Vector(4, 0, 0);
  120. ASSERT_EQ(v.normalise(), Vector(1, 0, 0));
  121. }
  122. TEST(TupleTest, Nomilise_vector_1_2_3)
  123. {
  124. Vector v = Vector(1, 2, 3);
  125. ASSERT_EQ(v.normalise(), Vector(1 / sqrt(14), 2 / sqrt(14), 3 / sqrt(14)));
  126. }
  127. TEST(TupleTest, Dot_product_of_two_tuples)
  128. {
  129. Vector a = Vector(1, 2, 3);
  130. Vector b = Vector(2, 3, 4);
  131. ASSERT_EQ(a.dot(b), 20);
  132. }
  133. TEST(TupleTest, Cross_product_of_two_vector)
  134. {
  135. Vector a = Vector(1, 2, 3);
  136. Vector b = Vector(2, 3, 4);
  137. ASSERT_EQ(a.cross(b), Vector(-1, 2, -1));
  138. ASSERT_EQ(b.cross(a), Vector(1, -2, 1));
  139. }
  140. TEST(TupleTest, Reflecting_a_vector_approaching_at_45)
  141. {
  142. Vector v = Vector(1, -1, 0); /* Vector */
  143. Vector n = Vector(0, 1, 0); /* Normal */
  144. Tuple r = v.reflect(n);
  145. ASSERT_EQ(r, Vector(1, 1, 0));
  146. }
  147. TEST(TupleTest, Reflecting_a_vector_off_a_slanted_surface)
  148. {
  149. Vector v = Vector(0, -1, 0); /* Vector */
  150. Vector n = Vector(sqrt(2)/2, sqrt(2)/2, 0); /* Normal */
  151. Tuple r = v.reflect(n);
  152. ASSERT_EQ(r, Vector(1, 0, 0));
  153. }