#include "osml_tests.h" #include TEST(constructors, quaternion) { quaternion_t identity = quaternion_identity(); CHECK(identity.w == 1.0f); CHECK(identity.x == 0.0f); CHECK(identity.y == 0.0f); CHECK(identity.z == 0.0f); quaternion_t one_two_three_four = quaternion(1.0f, 2.0f, 3.0f, 4.0f); CHECK(one_two_three_four.w == 1.0f); CHECK(one_two_three_four.x == 2.0f); CHECK(one_two_three_four.y == 3.0f); CHECK(one_two_three_four.z == 4.0f); quaternion_t sqrt_half_sqrt_half_zero_zero = quaternion_from_angle_around_axis(OSML_HALF_PI, vector3(2.0f, 0.0f, 0.0f)); CHECK(sqrt_half_sqrt_half_zero_zero.w == osml_sqrtf(0.5f)); CHECK(sqrt_half_sqrt_half_zero_zero.x == osml_sqrtf(0.5f)); CHECK(sqrt_half_sqrt_half_zero_zero.y == 0.0f); CHECK(sqrt_half_sqrt_half_zero_zero.z == 0.0f); } TEST(quaternion_add, quaternion) { quaternion_t one_two_three_four = quaternion(1.0f, 2.0f, 3.0f, 4.0f); quaternion_t five_six_seven_eight = quaternion(5.0f, 6.0f, 7.0f, 8.0f); quaternion_t six_eight_ten_twelve = quaternion_add(one_two_three_four, five_six_seven_eight); CHECK(six_eight_ten_twelve.w == 6.0f); CHECK(six_eight_ten_twelve.x == 8.0f); CHECK(six_eight_ten_twelve.y == 10.0f); CHECK(six_eight_ten_twelve.z == 12.0f); } TEST(quaternion_subtract, quaternion) { quaternion_t one_two_three_four = quaternion(1.0f, 2.0f, 3.0f, 4.0f); quaternion_t five_six_seven_eight = quaternion(5.0f, 6.0f, 7.0f, 8.0f); quaternion_t four_four_four_four = quaternion_subtract(five_six_seven_eight, one_two_three_four); CHECK(four_four_four_four.w == 4.0f); CHECK(four_four_four_four.x == 4.0f); CHECK(four_four_four_four.y == 4.0f); CHECK(four_four_four_four.z == 4.0f); } TEST(quaternion_scale, quaternion) { quaternion_t one_two_three_four = quaternion(1.0f, 2.0f, 3.0f, 4.0f); quaternion_t two_four_six_eight = quaternion_scale(one_two_three_four, 2.0f); CHECK(two_four_six_eight.w == 2.0f); CHECK(two_four_six_eight.x == 4.0f); CHECK(two_four_six_eight.y == 6.0f); CHECK(two_four_six_eight.z == 8.0f); } TEST(quaternion_dot_product, quaternion) { quaternion_t one_two_three_four = quaternion(1.0f, 2.0f, 3.0f, 4.0f); quaternion_t five_six_seven_eight = quaternion(5.0f, 6.0f, 7.0f, 8.0f); float seventy = quaternion_dot_product(one_two_three_four, five_six_seven_eight); CHECK(seventy == 70.0f); } TEST(quaternion_normalized, quaternion) { quaternion_t one_one_one_one = quaternion(1.0f, 1.0f, 1.0f, 1.0f); quaternion_t half_half_half_half = quaternion_normalized(one_one_one_one); CHECK(half_half_half_half.w == 0.5f); CHECK(half_half_half_half.x == 0.5f); CHECK(half_half_half_half.y == 0.5f); CHECK(half_half_half_half.z == 0.5f); } TEST(quaternion_inverse, quaternion) { quaternion_t one_two_three_four = quaternion(1.0f, 2.0f, 3.0f, 4.0f); quaternion_t one_minus_two_minus_three_minus_four = quaternion_inverse(one_two_three_four); CHECK_FLOATS_APPROXIMATELY_EQUAL( 1.0f / 30.0f, one_minus_two_minus_three_minus_four.w); CHECK_FLOATS_APPROXIMATELY_EQUAL(-2.0f / 30.0f, one_minus_two_minus_three_minus_four.x); CHECK_FLOATS_APPROXIMATELY_EQUAL(-3.0f / 30.0f, one_minus_two_minus_three_minus_four.y); CHECK_FLOATS_APPROXIMATELY_EQUAL(-4.0f / 30.0f, one_minus_two_minus_three_minus_four.z); } TEST(quaternion_product, quaternion) { quaternion_t ninety_degrees_around_positive_x = quaternion_from_angle_around_axis(OSML_HALF_PI, vector3(2.0f, 0.0f, 0.0f)); quaternion_t one_hundred_eighty_degrees_around_positive_x = quaternion_product(ninety_degrees_around_positive_x, ninety_degrees_around_positive_x); CHECK_FLOATS_APPROXIMATELY_EQUAL(0.0f, one_hundred_eighty_degrees_around_positive_x.w); CHECK_FLOATS_APPROXIMATELY_EQUAL(1.0f, one_hundred_eighty_degrees_around_positive_x.x); CHECK_FLOATS_APPROXIMATELY_EQUAL(0.0f, one_hundred_eighty_degrees_around_positive_x.y); CHECK_FLOATS_APPROXIMATELY_EQUAL(0.0f, one_hundred_eighty_degrees_around_positive_x.z); }