vec3_spec.lua 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. local vec3 = require "modules.vec3"
  2. local DBL_EPSILON = require("modules.constants").DBL_EPSILON
  3. local abs, sqrt = math.abs, math.sqrt
  4. describe("vec3:", function()
  5. it("creates an empty vector", function()
  6. local a = vec3()
  7. assert.is.equal(0, a.x)
  8. assert.is.equal(0, a.y)
  9. assert.is.equal(0, a.z)
  10. assert.is_true(a:is_vec3())
  11. assert.is_true(a:is_zero())
  12. end)
  13. it("creates a vector from a number", function()
  14. local a = vec3(3)
  15. assert.is.equal(3, a.x)
  16. assert.is.equal(3, a.y)
  17. assert.is.equal(3, a.z)
  18. end)
  19. it("creates a vector from numbers", function()
  20. local a = vec3(3, 5, 7)
  21. assert.is.equal(3, a.x)
  22. assert.is.equal(5, a.y)
  23. assert.is.equal(7, a.z)
  24. end)
  25. it("creates a vector from a list", function()
  26. local a = vec3 { 3, 5, 7 }
  27. assert.is.equal(3, a.x)
  28. assert.is.equal(5, a.y)
  29. assert.is.equal(7, a.z)
  30. end)
  31. it("creates a vector from a record", function()
  32. local a = vec3 { x=3, y=5, z=7 }
  33. assert.is.equal(3, a.x)
  34. assert.is.equal(5, a.y)
  35. assert.is.equal(7, a.z)
  36. end)
  37. it("clones a vector", function()
  38. local a = vec3(3, 5, 7)
  39. local b = a:clone()
  40. assert.is.equal(a, b)
  41. end)
  42. it("adds a vector to another", function()
  43. local a = vec3(3, 5, 7)
  44. local b = vec3(7, 4, 1)
  45. local c = a:add(b)
  46. local d = a + b
  47. assert.is.equal(10, c.x)
  48. assert.is.equal(9, c.y)
  49. assert.is.equal(8, c.z)
  50. assert.is.equal(c, d)
  51. end)
  52. it("subracts a vector from another", function()
  53. local a = vec3(3, 5, 7)
  54. local b = vec3(7, 4, 1)
  55. local c = a:sub(b)
  56. local d = a - b
  57. assert.is.equal(-4, c.x)
  58. assert.is.equal( 1, c.y)
  59. assert.is.equal( 6, c.z)
  60. assert.is.equal( c, d)
  61. end)
  62. it("multiplies a vector by a scale factor", function()
  63. local a = vec3(3, 5, 7)
  64. local s = 2
  65. local c = a:scale(s)
  66. local d = a * s
  67. assert.is.equal(6, c.x)
  68. assert.is.equal(10, c.y)
  69. assert.is.equal(14, c.z)
  70. assert.is.equal(c, d)
  71. end)
  72. it("divides a vector by another vector", function()
  73. local a = vec3(3, 5, 7)
  74. local s = vec3(2, 2, 2)
  75. local c = a:div(s)
  76. local d = a / s
  77. assert.is.equal(1.5, c.x)
  78. assert.is.equal(2.5, c.y)
  79. assert.is.equal(3.5, c.z)
  80. assert.is.equal(c, d)
  81. end)
  82. it("inverts a vector", function()
  83. local a = vec3(3, -5, 7)
  84. local b = -a
  85. assert.is.equal(-a.x, b.x)
  86. assert.is.equal(-a.y, b.y)
  87. assert.is.equal(-a.z, b.z)
  88. end)
  89. it("gets the length of a vector", function()
  90. local a = vec3(3, 5, 7)
  91. assert.is.equal(sqrt(83), a:len())
  92. end)
  93. it("gets the square length of a vector", function()
  94. local a = vec3(3, 5, 7)
  95. assert.is.equal(83, a:len2())
  96. end)
  97. it("normalizes a vector", function()
  98. local a = vec3(3, 5, 7)
  99. local b = a:normalize()
  100. assert.is_true(abs(b:len()-1) < DBL_EPSILON)
  101. end)
  102. it("trims the length of a vector", function()
  103. local a = vec3(3, 5, 7)
  104. local b = a:trim(0.5)
  105. assert.is_true(abs(b:len()-0.5) < DBL_EPSILON)
  106. end)
  107. it("gets the distance between two vectors", function()
  108. local a = vec3(3, 5, 7)
  109. local b = vec3(7, 4, 1)
  110. local c = a:dist(b)
  111. assert.is.equal(sqrt(53), c)
  112. end)
  113. it("gets the square distance between two vectors", function()
  114. local a = vec3(3, 5, 7)
  115. local b = vec3(7, 4, 1)
  116. local c = a:dist2(b)
  117. assert.is.equal(53, c)
  118. end)
  119. it("crosses two vectors", function()
  120. local a = vec3(3, 5, 7)
  121. local b = vec3(7, 4, 1)
  122. local c = a:cross(b)
  123. assert.is.equal(-23, c.x)
  124. assert.is.equal( 46, c.y)
  125. assert.is.equal(-23, c.z)
  126. end)
  127. it("dots two vectors", function()
  128. local a = vec3(3, 5, 7)
  129. local b = vec3(7, 4, 1)
  130. local c = a:dot(b)
  131. assert.is.equal(48, c)
  132. end)
  133. it("interpolates between two vectors", function()
  134. local a = vec3(3, 5, 7)
  135. local b = vec3(7, 4, 1)
  136. local s = 0.1
  137. local c = a:lerp(b, s)
  138. assert.is.equal(3.4, c.x)
  139. assert.is.equal(4.9, c.y)
  140. assert.is.equal(6.4, c.z)
  141. end)
  142. it("unpacks a vector", function()
  143. local a = vec3(3, 5, 7)
  144. local x, y, z = a:unpack()
  145. assert.is.equal(3, x)
  146. assert.is.equal(5, y)
  147. assert.is.equal(7, z)
  148. end)
  149. it("rotates a vector", function()
  150. local a = vec3(3, 5, 7)
  151. local b = a:rotate( math.pi, vec3.unit_z)
  152. local c = b:rotate(-math.pi, vec3.unit_z)
  153. assert.is_not.equal(a, b)
  154. assert.is.equal(7, b.z)
  155. assert.is.equal(a, c)
  156. end)
  157. it("cannot rotate a vector without a valis axis", function()
  158. local a = vec3(3, 5, 7)
  159. local b = a:rotate(math.pi, 0)
  160. assert.is_equal(a, b)
  161. end)
  162. it("gets a perpendicular vector", function()
  163. local a = vec3(3, 5, 7)
  164. local b = a:perpendicular()
  165. assert.is.equal(-5, b.x)
  166. assert.is.equal( 3, b.y)
  167. assert.is.equal( 0, b.z)
  168. end)
  169. it("gets a string representation of a vector", function()
  170. local a = vec3()
  171. local b = a:to_string()
  172. assert.is.equal("(+0.000,+0.000,+0.000)", b)
  173. end)
  174. end)