# nim c -r --verbosity:0 tests\vmathtest > tests\vmathtest.test.txt; dos2unix tests\vmathtest.test.txt; git diff tests\vmathtest.test.txt

include ../src/vmath

randomize(1234)

block:
  echo "# angle stuff"
  echo angleBetween(0.1, 0.2), " should be: ", 0.1

  echo angleBetween(0.1, 0.2 + PI*2), " should be: ", 0.1
  echo angleBetween(0.1, 0.2 - PI*2), " should be: ", 0.1
  echo angleBetween(0.1 + PI*2, 0.2), " should be: ", 0.1
  echo angleBetween(0.1 - PI*2, 0.2), " should be: ", 0.1

  echo angleBetween(0.2, 0.1), " should be: ", -0.1

  echo angleBetween(0.2, 0.1 - PI*2), " should be: ", -0.1
  echo angleBetween(0.2, 0.1 + PI*2), " should be: ", -0.1
  echo angleBetween(0.2 + PI*2, 0.1), " should be: ", -0.1
  echo angleBetween(0.2 - PI*2, 0.1), " should be: ", -0.1

block:
  echo "# basic vector vec2"
  var a = vec2(1, 2)
  var b = vec2(7, 6)
  var n = 13.7
  echo a + b
  echo a - b
  echo a * n
  echo a / n
  a += b
  echo a
  a -= b
  echo a
  a *= n
  echo a
  a /= n
  echo a

block:
  echo "# basic vector vec3"
  var a = vec3(1, 2, 3)
  var b = vec3(7, 6, 5)
  var n = 13.7
  echo a + b
  echo a - b
  echo a * n
  echo a / n
  a += b
  echo a
  a -= b
  echo a
  a *= n
  echo a
  a /= n
  echo a

block:
  echo "# basic vector vec4"
  var a = vec4(1, 2, 3, 4)
  var b = vec4(7, 6, 5, 4)
  var n = 13.7
  echo a + b
  echo a - b
  echo a * n
  echo a / n
  a += b
  echo a
  a -= b
  echo a
  a *= n
  echo a
  a /= n
  echo a

block:
  echo "# basic vector mat4"
  var m1 = mat4(
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1)
  echo m1
  var q1 = m1.quat()
  echo q1
  var m2 = q1.mat4()
  echo m2
  assert m1.close(m2)

block:
  echo "# basic vector mat4 -1"
  var m1 = mat4(
    1, 0, 0, 0,
    0, 0, -1, 0,
    0, 1, 0, 0,
    0, 0, 0, 1)
  echo m1
  var q1 = m1.quat()
  echo q1
  var m2 = q1.mat4()
  echo m2
  assert m1.close(m2)

block:
  echo "# Y 90"
  var m1 = rotate(PI/2, vec3(0, 1, 0))
  echo m1
  var q1 = m1.quat()
  echo q1
  var m2 = q1.mat4()
  echo m2
  assert m1.close(m2)

block:
  echo "# -Y 90"
  var m1 = rotate(PI/2, vec3(0, -1, 0))
  echo m1
  var q1 = m1.quat()
  echo q1
  var m2 = q1.mat4()
  echo m2
  assert m1.close(m2)

block:
  echo "# X 90"
  var m1 = rotate(PI/2, vec3(1, 0, 0))
  echo m1
  var q1 = m1.quat()
  echo q1
  var m2 = q1.mat4()
  echo m2
  echo m1.close(m2)

block:
  echo "# Y 90"
  var m1 = rotate(PI/2, vec3(1, 0, 0))
  echo m1
  var q1 = m1.quat()
  echo q1
  var m2 = q1.mat4()
  echo m2
  echo m1.close(m2)

block:
  echo "# 1,1,1 1.11rad"
  var m1 = rotate(PI*1.11, vec3(1, 1, 1).normalize())
  echo m1
  var q1 = m1.quat()
  echo q1
  var m2 = q1.mat4()
  echo m2
  assert m1.close(m2)

block:
  echo "# 1,1,1 1.11rad"
  var m1 = rotate(PI*1.11, vec3(-1, 1, 1).normalize())
  echo m1
  var q1 = m1.quat()
  echo q1
  var m2 = q1.mat4()
  echo m2
  assert m1.close(m2)

block:
  echo "# 1,1,1 1.11rad"
  var m1 = rotate(PI*1.11, vec3(-1, 0.34, 1.123).normalize())
  echo m1
  var q1 = m1.quat()
  echo q1
  var m2 = q1.mat4()
  echo m2
  assert m1.close(m2)

block:
  echo "# super random"
  for i in 0..100:
    var m1 = rotate(
      PI*rand(2.0),
      vec3(rand(2.0)-0.5, rand(2.0)-0.5, rand(2.0)-0.5).normalize()
    )
    echo m1
    var q1 = m1.quat()
    echo q1
    var m2 = q1.mat4()
    echo m2
    assert m1.close(m2)

block:
  echo "# matrix to quat test"
  # TODO: Fix this test
  # var m1 = mat4(
  #    -0.33089, -0.51266, -0.79227, 0.00000,
  #           0,     -1.0,        0, 0.00000,
  #           0,        0,      1.0, 0.00000,
  #     0.00000,  0.00000,  0.00000, 1.00000)
  # echo m1
  # var q1 = m1.quat()
  # echo q1
  # var m2 = q1.mat4()
  # echo m2
  # assert m1.close(m2)

block:
  echo "# matrix to quat test"
  # TODO: Fix this test
  # var m1 = mat4(
  #   -0.33089, -0.51266, -0.79227, 0.00000,
  #   -0.44681,  0.82460, -0.34697, 0.00000,
  #   -0.83119, -0.23918,  0.50191, 0.00000,
  #     0.00000,  0.00000,  0.00000, 1.00000)

  # echo vec3(  -0.33089, -0.51266, -0.79227).length
  # echo vec3(  -0.44681,  0.82460, -0.34697).length
  # echo vec3(  -0.83119, -0.23918,  0.50191).length

  # echo m1
  # var q1 = m1.quat().normalize()
  # echo q1
  # var m2 = q1.mat4()
  # echo m2
  # assert m1.close(m2)