mirror of
https://github.com/BlackMATov/vmath.hpp.git
synced 2025-12-14 12:28:58 +07:00
rename unit test approx classes
This commit is contained in:
@@ -120,11 +120,11 @@ TEST_CASE("vmath/ext") {
|
||||
}
|
||||
|
||||
SUBCASE("matrix translate") {
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * translate(float2{1.f,2.f}) == approx3(3.f,5.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * translate(translate(float2{1.f,2.f}), float2{1.f,2.f}) == approx3(4.f,7.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * translate(float2{1.f,2.f}) == uapprox3(3.f,5.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * translate(translate(float2{1.f,2.f}), float2{1.f,2.f}) == uapprox3(4.f,7.f,1.f));
|
||||
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * translate(float3{1.f,2.f,3.f}) == approx4(3.f,5.f,7.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * translate(translate(float3{1.f,2.f,3.f}), float3{1.f,2.f,3.f}) == approx4(4.f,7.f,10.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * translate(float3{1.f,2.f,3.f}) == uapprox4(3.f,5.f,7.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * translate(translate(float3{1.f,2.f,3.f}), float3{1.f,2.f,3.f}) == uapprox4(4.f,7.f,10.f,1.f));
|
||||
}
|
||||
|
||||
SUBCASE("matrix rotate") {
|
||||
@@ -132,47 +132,47 @@ TEST_CASE("vmath/ext") {
|
||||
constexpr float pi_2 = radians(90.f);
|
||||
constexpr float pi_4 = radians(45.f);
|
||||
|
||||
REQUIRE(float4(0.f,1.f,0.f,1.f) * rotate_x(pi_2) == approx4(0.f,0.f,1.f,1.f));
|
||||
REQUIRE(float4(0.f,0.f,1.f,1.f) * rotate_y(pi_2) == approx4(1.f,0.f,0.f,1.f));
|
||||
REQUIRE(float4(1.f,0.f,0.f,1.f) * rotate_z(pi_2) == approx4(0.f,1.f,0.f,1.f));
|
||||
REQUIRE(float4(0.f,1.f,0.f,1.f) * rotate_x(pi_2) == uapprox4(0.f,0.f,1.f,1.f));
|
||||
REQUIRE(float4(0.f,0.f,1.f,1.f) * rotate_y(pi_2) == uapprox4(1.f,0.f,0.f,1.f));
|
||||
REQUIRE(float4(1.f,0.f,0.f,1.f) * rotate_z(pi_2) == uapprox4(0.f,1.f,0.f,1.f));
|
||||
|
||||
REQUIRE(float4(0.f,1.f,0.f,1.f) * rotate_x(rotate_x(pi_4),pi_4) == approx4(0.f,0.f,1.f,1.f));
|
||||
REQUIRE(float4(0.f,0.f,1.f,1.f) * rotate_y(rotate_y(pi_4),pi_4) == approx4(1.f,0.f,0.f,1.f));
|
||||
REQUIRE(float4(1.f,0.f,0.f,1.f) * rotate_z(rotate_z(pi_4),pi_4) == approx4(0.f,1.f,0.f,1.f));
|
||||
REQUIRE(float4(0.f,1.f,0.f,1.f) * rotate_x(rotate_x(pi_4),pi_4) == uapprox4(0.f,0.f,1.f,1.f));
|
||||
REQUIRE(float4(0.f,0.f,1.f,1.f) * rotate_y(rotate_y(pi_4),pi_4) == uapprox4(1.f,0.f,0.f,1.f));
|
||||
REQUIRE(float4(1.f,0.f,0.f,1.f) * rotate_z(rotate_z(pi_4),pi_4) == uapprox4(0.f,1.f,0.f,1.f));
|
||||
|
||||
REQUIRE(float3(2.f,3.f,1.f) * rotate(pi) == approx3(-2.f,-3.f,1.f));
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(pi,{0.f,0.f,1.f}) == approx4(-2.f,-3.f,4.f,1.f));
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(pi,float3{0.f,0.f,1.f}) == approx4(-2.f,-3.f,4.f,1.f));
|
||||
REQUIRE(float3(2.f,3.f,1.f) * rotate(pi) == uapprox3(-2.f,-3.f,1.f));
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(pi,{0.f,0.f,1.f}) == uapprox4(-2.f,-3.f,4.f,1.f));
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(pi,float3{0.f,0.f,1.f}) == uapprox4(-2.f,-3.f,4.f,1.f));
|
||||
|
||||
REQUIRE(float3(2.f,3.f,1.f) * rotate(rotate(pi_2),pi_2) == approx3(-2.f,-3.f,1.f));
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(rotate(pi_2,{0.f,0.f,1.f}),pi_2,{0.f,0.f,1.f}) == approx4(-2.f,-3.f,4.f,1.f));
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(rotate(pi_2,float3{0.f,0.f,1.f}),pi_2,float3{0.f,0.f,1.f}) == approx4(-2.f,-3.f,4.f,1.f));
|
||||
REQUIRE(float3(2.f,3.f,1.f) * rotate(rotate(pi_2),pi_2) == uapprox3(-2.f,-3.f,1.f));
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(rotate(pi_2,{0.f,0.f,1.f}),pi_2,{0.f,0.f,1.f}) == uapprox4(-2.f,-3.f,4.f,1.f));
|
||||
REQUIRE(float4(2.f,3.f,4.f,1.f) * rotate(rotate(pi_2,float3{0.f,0.f,1.f}),pi_2,float3{0.f,0.f,1.f}) == uapprox4(-2.f,-3.f,4.f,1.f));
|
||||
}
|
||||
|
||||
SUBCASE("matrix scale") {
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * scale(float2{2.f,3.f}) == approx3(4.f,9.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(float3{2.f,3.f,4.f}) == approx4(4.f,9.f,16.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(float3{2.f,3.f,4.f}) == approx4(4.f,9.f,16.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * scale(float2{2.f,3.f}) == uapprox3(4.f,9.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(float3{2.f,3.f,4.f}) == uapprox4(4.f,9.f,16.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(float3{2.f,3.f,4.f}) == uapprox4(4.f,9.f,16.f,1.f));
|
||||
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * scale(scale(float2{2.f,2.f}), {2.f,3.f}) == approx3(8.f,18.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(scale(float3{2.f,2.f,2.f}), {2.f,3.f,4.f}) == approx4(8.f,18.f,32.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(scale(float3{2.f,2.f,2.f}), float3{2.f,3.f,4.f}) == approx4(8.f,18.f,32.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * scale(scale(float2{2.f,2.f}), {2.f,3.f}) == uapprox3(8.f,18.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(scale(float3{2.f,2.f,2.f}), {2.f,3.f,4.f}) == uapprox4(8.f,18.f,32.f,1.f));
|
||||
STATIC_REQUIRE(float4(2.f,3.f,4.f,1.f) * scale(scale(float3{2.f,2.f,2.f}), float3{2.f,3.f,4.f}) == uapprox4(8.f,18.f,32.f,1.f));
|
||||
}
|
||||
|
||||
SUBCASE("matrix shear") {
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_x(0.f) == approx3(2.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_x(1.f) == approx3(5.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_x(shear_x(1.f),1.f) == approx3(8.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_x(0.f) == uapprox3(2.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_x(1.f) == uapprox3(5.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_x(shear_x(1.f),1.f) == uapprox3(8.f,3.f,1.f));
|
||||
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_y(0.f) == approx3(2.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_y(1.f) == approx3(2.f,5.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_y(shear_y(1.f),1.f) == approx3(2.f,7.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_y(0.f) == uapprox3(2.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_y(1.f) == uapprox3(2.f,5.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear_y(shear_y(1.f),1.f) == uapprox3(2.f,7.f,1.f));
|
||||
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear(float2(0.f,0.f)) == approx3(2.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear(float2(1.f,0.f)) == approx3(5.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear(float2(0.f,1.f)) == approx3(2.f,5.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear(shear(float2(1.f,0.f)),float2(1.f,0.f)) == approx3(8.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear(shear(float2(0.f,1.f)),float2(0.f,1.f)) == approx3(2.f,7.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear(float2(0.f,0.f)) == uapprox3(2.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear(float2(1.f,0.f)) == uapprox3(5.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear(float2(0.f,1.f)) == uapprox3(2.f,5.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear(shear(float2(1.f,0.f)),float2(1.f,0.f)) == uapprox3(8.f,3.f,1.f));
|
||||
STATIC_REQUIRE(float3(2.f,3.f,1.f) * shear(shear(float2(0.f,1.f)),float2(0.f,1.f)) == uapprox3(2.f,7.f,1.f));
|
||||
}
|
||||
|
||||
SUBCASE("matrix look_at") {
|
||||
@@ -191,24 +191,24 @@ TEST_CASE("vmath/ext") {
|
||||
}
|
||||
|
||||
SUBCASE("vector angle") {
|
||||
REQUIRE(angle(float2(2.f,0.f), float2(0.f,1.f)) == approx(radians(90.f)));
|
||||
REQUIRE(angle(float2(0.f,3.f), float2(1.f,0.f)) == approx(radians(90.f)));
|
||||
REQUIRE(angle(float2(0.5f,0.f), float2(-1.f,0.f)) == approx(radians(180.f)));
|
||||
REQUIRE(angle(float2(-0.2f,0.f), float2(1.f,0.f)) == approx(radians(180.f)));
|
||||
REQUIRE(angle(float3(0.f,2.f,0.f), float3(0.f,0.f,1.f)) == approx(radians(90.f)));
|
||||
REQUIRE(angle(float3(0.f,0.f,3.f), float3(0.f,1.f,0.f)) == approx(radians(90.f)));
|
||||
REQUIRE(angle(float2(2.f,0.f), float2(0.f,1.f)) == uapprox(radians(90.f)));
|
||||
REQUIRE(angle(float2(0.f,3.f), float2(1.f,0.f)) == uapprox(radians(90.f)));
|
||||
REQUIRE(angle(float2(0.5f,0.f), float2(-1.f,0.f)) == uapprox(radians(180.f)));
|
||||
REQUIRE(angle(float2(-0.2f,0.f), float2(1.f,0.f)) == uapprox(radians(180.f)));
|
||||
REQUIRE(angle(float3(0.f,2.f,0.f), float3(0.f,0.f,1.f)) == uapprox(radians(90.f)));
|
||||
REQUIRE(angle(float3(0.f,0.f,3.f), float3(0.f,1.f,0.f)) == uapprox(radians(90.f)));
|
||||
}
|
||||
|
||||
SUBCASE("vector rotate") {
|
||||
REQUIRE(rotate(float2(2.f,0.f), radians(90.f)) == approx2(0.f,2.f));
|
||||
REQUIRE(rotate(float2(1.5f,0.f), radians(-90.f)) == approx2(0.f,-1.5f));
|
||||
REQUIRE(rotate(float2(2.f,0.f), radians(90.f)) == uapprox2(0.f,2.f));
|
||||
REQUIRE(rotate(float2(1.5f,0.f), radians(-90.f)) == uapprox2(0.f,-1.5f));
|
||||
|
||||
REQUIRE(rotate(float3(1.5f,0.f,0.f), radians(90.f), float3(0,0,1)) == approx3(0.f,1.5f,0.f));
|
||||
REQUIRE(rotate(float4(1.5f,0.f,0.f,1.f), radians(90.f), float3(0,0,1)) == approx4(0.f,1.5f,0.f,1.f));
|
||||
REQUIRE(rotate(float3(1.5f,0.f,0.f), radians(90.f), float3(0,0,1)) == uapprox3(0.f,1.5f,0.f));
|
||||
REQUIRE(rotate(float4(1.5f,0.f,0.f,1.f), radians(90.f), float3(0,0,1)) == uapprox4(0.f,1.5f,0.f,1.f));
|
||||
}
|
||||
|
||||
SUBCASE("vector project") {
|
||||
REQUIRE(project(float2(2.f, 2.f), float2(0.f, 1.f)) == approx2(0.f, 2.f));
|
||||
REQUIRE(project(float3(2.f, 2.f, 2.f), float3(0.f, 0.f, 1.f)) == approx3(0.f, 0.f, 2.f));
|
||||
REQUIRE(project(float2(2.f, 2.f), float2(0.f, 1.f)) == uapprox2(0.f, 2.f));
|
||||
REQUIRE(project(float3(2.f, 2.f, 2.f), float3(0.f, 0.f, 1.f)) == uapprox3(0.f, 0.f, 2.f));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,8 +15,8 @@ namespace
|
||||
|
||||
TEST_CASE("vmath/fun") {
|
||||
SUBCASE("Angle and Trigonometry Functions") {
|
||||
STATIC_REQUIRE(radians(degrees(12.13f)) == approx(12.13f));
|
||||
STATIC_REQUIRE(degrees(radians(12.13f)) == approx(12.13f));
|
||||
STATIC_REQUIRE(radians(degrees(12.13f)) == uapprox(12.13f));
|
||||
STATIC_REQUIRE(degrees(radians(12.13f)) == uapprox(12.13f));
|
||||
|
||||
(void)sin(0.f);
|
||||
(void)cos(0.f);
|
||||
@@ -38,8 +38,8 @@ TEST_CASE("vmath/fun") {
|
||||
{
|
||||
float out_s{}, out_c{};
|
||||
sincos(15.f, &out_s, &out_c);
|
||||
REQUIRE(out_s == approx(sin(15.f)));
|
||||
REQUIRE(out_c == approx(cos(15.f)));
|
||||
REQUIRE(out_s == uapprox(sin(15.f)));
|
||||
REQUIRE(out_c == uapprox(cos(15.f)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,90 +56,90 @@ TEST_CASE("vmath/fun") {
|
||||
SUBCASE("Common Functions") {
|
||||
STATIC_REQUIRE(vmath_hpp::abs(1) == 1);
|
||||
STATIC_REQUIRE(vmath_hpp::abs(-1) == 1);
|
||||
STATIC_REQUIRE(vmath_hpp::abs(1.f) == approx(1.f));
|
||||
STATIC_REQUIRE(vmath_hpp::abs(-1.f) == approx(1.f));
|
||||
STATIC_REQUIRE(vmath_hpp::abs(1.f) == uapprox(1.f));
|
||||
STATIC_REQUIRE(vmath_hpp::abs(-1.f) == uapprox(1.f));
|
||||
|
||||
STATIC_REQUIRE(sign(2) == 1);
|
||||
STATIC_REQUIRE(sign(-2) == -1);
|
||||
STATIC_REQUIRE(sign(0) == 0);
|
||||
STATIC_REQUIRE(sign(2.f) == approx(1.f));
|
||||
STATIC_REQUIRE(sign(-2.f) == approx(-1.f));
|
||||
STATIC_REQUIRE(sign(0.f) == approx(0.f));
|
||||
STATIC_REQUIRE(sign(2.f) == uapprox(1.f));
|
||||
STATIC_REQUIRE(sign(-2.f) == uapprox(-1.f));
|
||||
STATIC_REQUIRE(sign(0.f) == uapprox(0.f));
|
||||
|
||||
STATIC_REQUIRE(reciprocal(2.f) == approx(0.5f));
|
||||
STATIC_REQUIRE(reciprocal(4.f) == approx(0.25f));
|
||||
STATIC_REQUIRE(reciprocal(2.f) == uapprox(0.5f));
|
||||
STATIC_REQUIRE(reciprocal(4.f) == uapprox(0.25f));
|
||||
|
||||
REQUIRE(floor(1.7f) == approx(1.f));
|
||||
REQUIRE(trunc(1.7f) == approx(1.f));
|
||||
REQUIRE(round(1.7f) == approx(2.f));
|
||||
REQUIRE(ceil(1.7f) == approx(2.f));
|
||||
REQUIRE(floor(1.7f) == uapprox(1.f));
|
||||
REQUIRE(trunc(1.7f) == uapprox(1.f));
|
||||
REQUIRE(round(1.7f) == uapprox(2.f));
|
||||
REQUIRE(ceil(1.7f) == uapprox(2.f));
|
||||
|
||||
REQUIRE(fract(1.7f) == approx(0.7f));
|
||||
REQUIRE(fract(-2.3f) == approx(0.7f));
|
||||
REQUIRE(fract(1.7f) == uapprox(0.7f));
|
||||
REQUIRE(fract(-2.3f) == uapprox(0.7f));
|
||||
|
||||
REQUIRE(fmod(1.7f, 1.2f) == approx(0.5f));
|
||||
REQUIRE(fmod(1.7f, 1.2f) == uapprox(0.5f));
|
||||
|
||||
{
|
||||
float out_i{};
|
||||
REQUIRE(modf(1.7f, &out_i) == approx(0.7f));
|
||||
REQUIRE(out_i == approx(1.f));
|
||||
REQUIRE(modf(1.7f, &out_i) == uapprox(0.7f));
|
||||
REQUIRE(out_i == uapprox(1.f));
|
||||
}
|
||||
|
||||
STATIC_REQUIRE(min(0.f, 1.f) == approx(0.f));
|
||||
STATIC_REQUIRE(min(3.f, 2.f, 1.f) == approx(1.f));
|
||||
STATIC_REQUIRE(min(4.f, 3.f, 2.f, 1.f) == approx(1.f));
|
||||
STATIC_REQUIRE(min(0.f, 1.f) == uapprox(0.f));
|
||||
STATIC_REQUIRE(min(3.f, 2.f, 1.f) == uapprox(1.f));
|
||||
STATIC_REQUIRE(min(4.f, 3.f, 2.f, 1.f) == uapprox(1.f));
|
||||
|
||||
STATIC_REQUIRE(max(0.f, 1.f) == approx(1.f));
|
||||
STATIC_REQUIRE(max(3.f, 2.f, 1.f) == approx(3.f));
|
||||
STATIC_REQUIRE(max(4.f, 3.f, 2.f, 1.f) == approx(4.f));
|
||||
STATIC_REQUIRE(max(0.f, 1.f) == uapprox(1.f));
|
||||
STATIC_REQUIRE(max(3.f, 2.f, 1.f) == uapprox(3.f));
|
||||
STATIC_REQUIRE(max(4.f, 3.f, 2.f, 1.f) == uapprox(4.f));
|
||||
|
||||
STATIC_REQUIRE(clamp(1.0f, 2.f, 3.f) == approx(2.0f));
|
||||
STATIC_REQUIRE(clamp(2.5f, 2.f, 3.f) == approx(2.5f));
|
||||
STATIC_REQUIRE(clamp(3.5f, 2.f, 3.f) == approx(3.0f));
|
||||
STATIC_REQUIRE(clamp(1.0f, 2.f, 3.f) == uapprox(2.0f));
|
||||
STATIC_REQUIRE(clamp(2.5f, 2.f, 3.f) == uapprox(2.5f));
|
||||
STATIC_REQUIRE(clamp(3.5f, 2.f, 3.f) == uapprox(3.0f));
|
||||
|
||||
STATIC_REQUIRE(saturate(-0.5f) == approx(0.f));
|
||||
STATIC_REQUIRE(saturate(0.5f) == approx(0.5f));
|
||||
STATIC_REQUIRE(saturate(1.5f) == approx(1.f));
|
||||
STATIC_REQUIRE(saturate(-0.5f) == uapprox(0.f));
|
||||
STATIC_REQUIRE(saturate(0.5f) == uapprox(0.5f));
|
||||
STATIC_REQUIRE(saturate(1.5f) == uapprox(1.f));
|
||||
|
||||
STATIC_REQUIRE(lerp(0.f, 10.f, 0.5f) == approx(5.f));
|
||||
STATIC_REQUIRE(step(0.5f, 0.4f) == approx(0.f));
|
||||
STATIC_REQUIRE(step(0.5f, 0.6f) == approx(1.f));
|
||||
STATIC_REQUIRE(smoothstep(0.f, 1.f, 0.1f) == approx(0.028f));
|
||||
STATIC_REQUIRE(lerp(0.f, 10.f, 0.5f) == uapprox(5.f));
|
||||
STATIC_REQUIRE(step(0.5f, 0.4f) == uapprox(0.f));
|
||||
STATIC_REQUIRE(step(0.5f, 0.6f) == uapprox(1.f));
|
||||
STATIC_REQUIRE(smoothstep(0.f, 1.f, 0.1f) == uapprox(0.028f));
|
||||
|
||||
REQUIRE_FALSE(vmath_hpp::isnan(1.f));
|
||||
REQUIRE_FALSE(vmath_hpp::isinf(1.f));
|
||||
REQUIRE(vmath_hpp::isfinite(1.f));
|
||||
|
||||
REQUIRE(fma(2.f, 3.f, 4.f) == approx(10.f));
|
||||
REQUIRE(fma(2.f, 3.f, 4.f) == uapprox(10.f));
|
||||
|
||||
{
|
||||
int out_exp{};
|
||||
REQUIRE(frexp(1.7f, &out_exp) == approx(0.85f));
|
||||
REQUIRE(frexp(1.7f, &out_exp) == uapprox(0.85f));
|
||||
REQUIRE(out_exp == 1);
|
||||
}
|
||||
|
||||
REQUIRE(ldexp(0.85f, 1) == approx(1.7f));
|
||||
REQUIRE(ldexp(0.85f, 1) == uapprox(1.7f));
|
||||
}
|
||||
|
||||
SUBCASE("Geometric Functions") {
|
||||
STATIC_REQUIRE(length(10.f) == approx(10.f));
|
||||
STATIC_REQUIRE(length(-10.f) == approx(10.f));
|
||||
STATIC_REQUIRE(length(10.f) == uapprox(10.f));
|
||||
STATIC_REQUIRE(length(-10.f) == uapprox(10.f));
|
||||
|
||||
STATIC_REQUIRE(length2(10.f) == approx(100.f));
|
||||
STATIC_REQUIRE(length2(-10.f) == approx(100.f));
|
||||
STATIC_REQUIRE(length2(10.f) == uapprox(100.f));
|
||||
STATIC_REQUIRE(length2(-10.f) == uapprox(100.f));
|
||||
|
||||
STATIC_REQUIRE(distance(5.f, 10.f) == approx(5.f));
|
||||
STATIC_REQUIRE(distance(-5.f, -10.f) == approx(5.f));
|
||||
STATIC_REQUIRE(distance(5.f, 10.f) == uapprox(5.f));
|
||||
STATIC_REQUIRE(distance(-5.f, -10.f) == uapprox(5.f));
|
||||
|
||||
STATIC_REQUIRE(distance2(5.f, 10.f) == approx(25.f));
|
||||
STATIC_REQUIRE(distance2(-5.f, -10.f) == approx(25.f));
|
||||
STATIC_REQUIRE(distance2(5.f, 10.f) == uapprox(25.f));
|
||||
STATIC_REQUIRE(distance2(-5.f, -10.f) == uapprox(25.f));
|
||||
|
||||
STATIC_REQUIRE(dot(2.f, 5.f) == approx(10.f));
|
||||
REQUIRE(normalize(0.5f) == approx(1.f));
|
||||
STATIC_REQUIRE(dot(2.f, 5.f) == uapprox(10.f));
|
||||
REQUIRE(normalize(0.5f) == uapprox(1.f));
|
||||
|
||||
STATIC_REQUIRE(faceforward(1.f, 2.f, 3.f) == approx(-1.f));
|
||||
STATIC_REQUIRE(reflect(1.f, 2.f) == approx(-7.f));
|
||||
REQUIRE(refract(1.f, 2.f, 1.f) == approx(-7.f));
|
||||
STATIC_REQUIRE(faceforward(1.f, 2.f, 3.f) == uapprox(-1.f));
|
||||
STATIC_REQUIRE(reflect(1.f, 2.f) == uapprox(-7.f));
|
||||
REQUIRE(refract(1.f, 2.f, 1.f) == uapprox(-7.f));
|
||||
}
|
||||
|
||||
SUBCASE("Relational Functions") {
|
||||
|
||||
@@ -120,7 +120,7 @@ TEST_CASE("vmath/mat_fun") {
|
||||
{
|
||||
int4 v{0, 0, 0, 1};
|
||||
REQUIRE(&v == &(v *= translate(int3{1,2,3})));
|
||||
REQUIRE(v == approx4(1,2,3,1));
|
||||
REQUIRE(v == uapprox4(1,2,3,1));
|
||||
}
|
||||
{
|
||||
int3 v{1, 2, 3};
|
||||
@@ -283,7 +283,7 @@ TEST_CASE("vmath/mat_fun") {
|
||||
STATIC_REQUIRE(all(approximately(
|
||||
unit4_z<float> * m1 * rm1,
|
||||
unit4_z<float>,
|
||||
approx_epsilon_v<float>)));
|
||||
uapprox_epsilon_v<float>)));
|
||||
}
|
||||
|
||||
{
|
||||
@@ -293,7 +293,7 @@ TEST_CASE("vmath/mat_fun") {
|
||||
REQUIRE(all(approximately(
|
||||
unit4_z<float> * m2 * rm2,
|
||||
unit4_z<float>,
|
||||
approx_epsilon_v<float>)));
|
||||
uapprox_epsilon_v<float>)));
|
||||
}
|
||||
|
||||
{
|
||||
@@ -303,7 +303,7 @@ TEST_CASE("vmath/mat_fun") {
|
||||
REQUIRE(all(approximately(
|
||||
unit3_z<float> * m3 * rm3,
|
||||
unit3_z<float>,
|
||||
approx_epsilon_v<float>)));
|
||||
uapprox_epsilon_v<float>)));
|
||||
}
|
||||
|
||||
{
|
||||
@@ -313,7 +313,7 @@ TEST_CASE("vmath/mat_fun") {
|
||||
REQUIRE(all(approximately(
|
||||
unit2_y<float> * m4 * rm4,
|
||||
unit2_y<float>,
|
||||
approx_epsilon_v<float>)));
|
||||
uapprox_epsilon_v<float>)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,58 +13,58 @@ namespace vmath_tests
|
||||
using namespace vmath_hpp;
|
||||
|
||||
template < typename T >
|
||||
struct approx_epsilon;
|
||||
struct uapprox_epsilon;
|
||||
|
||||
template <>
|
||||
struct approx_epsilon<int> {
|
||||
struct uapprox_epsilon<int> {
|
||||
static constexpr int value = 0;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct approx_epsilon<float> {
|
||||
struct uapprox_epsilon<float> {
|
||||
static constexpr float value = FLT_EPSILON * 100;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct approx_epsilon<double> {
|
||||
struct uapprox_epsilon<double> {
|
||||
static constexpr float value = DBL_EPSILON * 100;
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
inline constexpr T approx_epsilon_v = approx_epsilon<T>::value;
|
||||
inline constexpr T uapprox_epsilon_v = uapprox_epsilon<T>::value;
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
template < typename T >
|
||||
struct approx {
|
||||
struct uapprox {
|
||||
T value;
|
||||
explicit constexpr approx(T v) : value(v) {}
|
||||
explicit constexpr uapprox(T v) : value(v) {}
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
struct approx2 {
|
||||
struct uapprox2 {
|
||||
vec<T, 2> value;
|
||||
constexpr explicit approx2(T v) : value(v) {}
|
||||
constexpr explicit approx2(T x, T y) : value(x, y) {}
|
||||
constexpr explicit approx2(const vec<T, 2>& v) : value(v) {}
|
||||
constexpr explicit uapprox2(T v) : value(v) {}
|
||||
constexpr explicit uapprox2(T x, T y) : value(x, y) {}
|
||||
constexpr explicit uapprox2(const vec<T, 2>& v) : value(v) {}
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
struct approx3 {
|
||||
struct uapprox3 {
|
||||
vec<T, 3> value;
|
||||
constexpr explicit approx3(T v) : value(v) {}
|
||||
constexpr explicit approx3(T x, T y, T z) : value(x, y, z) {}
|
||||
constexpr explicit approx3(const vec<T, 3>& v) : value(v) {}
|
||||
constexpr explicit uapprox3(T v) : value(v) {}
|
||||
constexpr explicit uapprox3(T x, T y, T z) : value(x, y, z) {}
|
||||
constexpr explicit uapprox3(const vec<T, 3>& v) : value(v) {}
|
||||
};
|
||||
|
||||
template < typename T >
|
||||
struct approx4 {
|
||||
struct uapprox4 {
|
||||
vec<T, 4> value;
|
||||
constexpr explicit approx4(T v) : value(v) {}
|
||||
constexpr explicit approx4(T x, T y, T z, T w) : value(x, y, z, w) {}
|
||||
constexpr explicit approx4(const vec<T, 4>& v) : value(v) {}
|
||||
constexpr explicit uapprox4(T v) : value(v) {}
|
||||
constexpr explicit uapprox4(T x, T y, T z, T w) : value(x, y, z, w) {}
|
||||
constexpr explicit uapprox4(const vec<T, 4>& v) : value(v) {}
|
||||
};
|
||||
|
||||
//
|
||||
@@ -72,22 +72,22 @@ namespace vmath_tests
|
||||
//
|
||||
|
||||
template < typename T >
|
||||
constexpr bool operator==(const T& l, const approx<T>& r) {
|
||||
return approximately(l, r.value, approx_epsilon_v<T>);
|
||||
constexpr bool operator==(const T& l, const uapprox<T>& r) {
|
||||
return approximately(l, r.value, uapprox_epsilon_v<T>);
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr bool operator==(const vec<T, 2>& l, const approx2<T>& r) {
|
||||
return all(approximately(l, r.value, approx_epsilon_v<T>));
|
||||
constexpr bool operator==(const vec<T, 2>& l, const uapprox2<T>& r) {
|
||||
return all(approximately(l, r.value, uapprox_epsilon_v<T>));
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr bool operator==(const vec<T, 3>& l, const approx3<T>& r) {
|
||||
return all(approximately(l, r.value, approx_epsilon_v<T>));
|
||||
constexpr bool operator==(const vec<T, 3>& l, const uapprox3<T>& r) {
|
||||
return all(approximately(l, r.value, uapprox_epsilon_v<T>));
|
||||
}
|
||||
|
||||
template < typename T >
|
||||
constexpr bool operator==(const vec<T, 4>& l, const approx4<T>& r) {
|
||||
return all(approximately(l, r.value, approx_epsilon_v<T>));
|
||||
constexpr bool operator==(const vec<T, 4>& l, const uapprox4<T>& r) {
|
||||
return all(approximately(l, r.value, uapprox_epsilon_v<T>));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,8 +148,8 @@ TEST_CASE("vmath/vec_fun") {
|
||||
}
|
||||
|
||||
SUBCASE("Angle and Trigonometry Functions") {
|
||||
STATIC_REQUIRE(radians(degrees(float2(12.13f))) == approx2(12.13f));
|
||||
STATIC_REQUIRE(degrees(radians(float2(12.13f))) == approx2(12.13f));
|
||||
STATIC_REQUIRE(radians(degrees(float2(12.13f))) == uapprox2(12.13f));
|
||||
STATIC_REQUIRE(degrees(radians(float2(12.13f))) == uapprox2(12.13f));
|
||||
|
||||
(void)sin(float2(1.f));
|
||||
(void)cos(float2(1.f));
|
||||
@@ -171,8 +171,8 @@ TEST_CASE("vmath/vec_fun") {
|
||||
{
|
||||
float2 out_ss{}, out_cs{};
|
||||
sincos(float2(10.f,15.f), &out_ss, &out_cs);
|
||||
REQUIRE(out_ss == approx2(sin(10.f), sin(15.f)));
|
||||
REQUIRE(out_cs == approx2(cos(10.f), cos(15.f)));
|
||||
REQUIRE(out_ss == uapprox2(sin(10.f), sin(15.f)));
|
||||
REQUIRE(out_cs == uapprox2(cos(10.f), cos(15.f)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -187,9 +187,9 @@ TEST_CASE("vmath/vec_fun") {
|
||||
}
|
||||
|
||||
SUBCASE("Common Functions") {
|
||||
STATIC_REQUIRE(abs(float2(1.f, -1.f)) == approx2(1.f,1.f));
|
||||
STATIC_REQUIRE(sign(float3(1.f, -1.f, 0.f)) == approx3(1.f,-1.f,0.f));
|
||||
STATIC_REQUIRE(reciprocal(float2(2.f, 4.f)) == approx2(0.5f,0.25f));
|
||||
STATIC_REQUIRE(abs(float2(1.f, -1.f)) == uapprox2(1.f,1.f));
|
||||
STATIC_REQUIRE(sign(float3(1.f, -1.f, 0.f)) == uapprox3(1.f,-1.f,0.f));
|
||||
STATIC_REQUIRE(reciprocal(float2(2.f, 4.f)) == uapprox2(0.5f,0.25f));
|
||||
|
||||
(void)floor(float2(1.f, -1.f));
|
||||
(void)trunc(float2(1.f, -1.f));
|
||||
@@ -197,13 +197,13 @@ TEST_CASE("vmath/vec_fun") {
|
||||
(void)ceil(float2(1.f, -1.f));
|
||||
(void)fract(float2(1.f, -1.f));
|
||||
|
||||
REQUIRE(fmod(float2(1.7f), 1.2f) == approx2(0.5f));
|
||||
REQUIRE(fmod(float2(1.7f), float2(1.2f)) == approx2(0.5f));
|
||||
REQUIRE(fmod(float2(1.7f), 1.2f) == uapprox2(0.5f));
|
||||
REQUIRE(fmod(float2(1.7f), float2(1.2f)) == uapprox2(0.5f));
|
||||
|
||||
{
|
||||
float2 out_i{};
|
||||
REQUIRE(modf(float2(1.7f), &out_i) == approx2(0.7f));
|
||||
REQUIRE(out_i.x == approx(1.f));
|
||||
REQUIRE(modf(float2(1.7f), &out_i) == uapprox2(0.7f));
|
||||
REQUIRE(out_i.x == uapprox(1.f));
|
||||
}
|
||||
|
||||
STATIC_REQUIRE(min(int2(1,2)) == 1);
|
||||
@@ -217,55 +217,55 @@ TEST_CASE("vmath/vec_fun") {
|
||||
STATIC_REQUIRE(clamp(int2(1,2), 0, 1) == int2(1,1));
|
||||
STATIC_REQUIRE(clamp(int2(1,2), int2(0), int2(1)) == int2(1,1));
|
||||
|
||||
STATIC_REQUIRE(saturate(float3(-1.f,0.5,1.5f)) == approx3(0.f,0.5f,1.f));
|
||||
STATIC_REQUIRE(saturate(float3(-1.f,0.5,1.5f)) == uapprox3(0.f,0.5f,1.f));
|
||||
|
||||
STATIC_REQUIRE(lerp(float2(0.f), float2(10.f), 0.5f) == approx2(5.f));
|
||||
STATIC_REQUIRE(lerp(float2(0.f), float2(10.f), float2(0.5f)) == approx2(5.f));
|
||||
STATIC_REQUIRE(lerp(float2(0.f), float2(10.f), 0.5f) == uapprox2(5.f));
|
||||
STATIC_REQUIRE(lerp(float2(0.f), float2(10.f), float2(0.5f)) == uapprox2(5.f));
|
||||
|
||||
STATIC_REQUIRE(step(0.5f, float2(0.4f)) == approx2(0.f));
|
||||
STATIC_REQUIRE(step(0.5f, float2(0.6f)) == approx2(1.f));
|
||||
STATIC_REQUIRE(step(float2(0.5f), float2(0.4f)) == approx2(0.f));
|
||||
STATIC_REQUIRE(step(float2(0.5f), float2(0.6f)) == approx2(1.f));
|
||||
STATIC_REQUIRE(step(0.5f, float2(0.4f)) == uapprox2(0.f));
|
||||
STATIC_REQUIRE(step(0.5f, float2(0.6f)) == uapprox2(1.f));
|
||||
STATIC_REQUIRE(step(float2(0.5f), float2(0.4f)) == uapprox2(0.f));
|
||||
STATIC_REQUIRE(step(float2(0.5f), float2(0.6f)) == uapprox2(1.f));
|
||||
|
||||
STATIC_REQUIRE(smoothstep(0.f, 1.f, float2(0.1f)) == approx2(0.028f));
|
||||
STATIC_REQUIRE(smoothstep(float2(0.f), float2(1.f), float2(0.1f)) == approx2(0.028f));
|
||||
STATIC_REQUIRE(smoothstep(0.f, 1.f, float2(0.1f)) == uapprox2(0.028f));
|
||||
STATIC_REQUIRE(smoothstep(float2(0.f), float2(1.f), float2(0.1f)) == uapprox2(0.028f));
|
||||
|
||||
REQUIRE_FALSE(isnan(float2(1.f)).x);
|
||||
REQUIRE_FALSE(isinf(float2(1.f)).x);
|
||||
REQUIRE(isfinite(float2(1.f)).x);
|
||||
|
||||
REQUIRE_FALSE(fma(float2(2.f), float2(3.f), float2(4.f)).x == approx(12.f));
|
||||
REQUIRE_FALSE(fma(float2(2.f), float2(3.f), float2(4.f)).x == uapprox(12.f));
|
||||
|
||||
{
|
||||
int2 out_exp{};
|
||||
REQUIRE(frexp(float2(1.7f), &out_exp).x == approx(0.85f));
|
||||
REQUIRE(frexp(float2(1.7f), &out_exp).x == uapprox(0.85f));
|
||||
REQUIRE(out_exp == int2(1));
|
||||
}
|
||||
|
||||
REQUIRE(ldexp(float2(0.85f), int2(1)).x == approx(1.7f));
|
||||
REQUIRE(ldexp(float2(0.85f), int2(1)).x == uapprox(1.7f));
|
||||
}
|
||||
|
||||
SUBCASE("Geometric Functions") {
|
||||
REQUIRE(length(float2(10.f,0.f)) == approx(10.f));
|
||||
REQUIRE(length(float2(-10.f,0.f)) == approx(10.f));
|
||||
REQUIRE(length(float2(10.f,0.f)) == uapprox(10.f));
|
||||
REQUIRE(length(float2(-10.f,0.f)) == uapprox(10.f));
|
||||
|
||||
STATIC_REQUIRE(length2(float2(10.f,0.f)) == approx(100.f));
|
||||
STATIC_REQUIRE(length2(float2(-10.f,0.f)) == approx(100.f));
|
||||
STATIC_REQUIRE(length2(float2(10.f,0.f)) == uapprox(100.f));
|
||||
STATIC_REQUIRE(length2(float2(-10.f,0.f)) == uapprox(100.f));
|
||||
|
||||
REQUIRE(distance(float2(5.f,0.f), float2(10.f,0.f)) == approx(5.f));
|
||||
REQUIRE(distance(float2(-5.f,0.f), float2(-10.f,0.f)) == approx(5.f));
|
||||
REQUIRE(distance(float2(5.f,0.f), float2(10.f,0.f)) == uapprox(5.f));
|
||||
REQUIRE(distance(float2(-5.f,0.f), float2(-10.f,0.f)) == uapprox(5.f));
|
||||
|
||||
STATIC_REQUIRE(distance2(float2(5.f,0.f), float2(10.f,0.f)) == approx(25.f));
|
||||
STATIC_REQUIRE(distance2(float2(-5.f,0.f), float2(-10.f,0.f)) == approx(25.f));
|
||||
STATIC_REQUIRE(distance2(float2(5.f,0.f), float2(10.f,0.f)) == uapprox(25.f));
|
||||
STATIC_REQUIRE(distance2(float2(-5.f,0.f), float2(-10.f,0.f)) == uapprox(25.f));
|
||||
|
||||
STATIC_REQUIRE(dot(int2(1,2),int2(3,4)) == 11);
|
||||
STATIC_REQUIRE(cross(int2(1,0),int2(0,1)) == 1);
|
||||
STATIC_REQUIRE(cross(int3(1,0,0),int3(0,1,0)) == int3(0,0,1));
|
||||
REQUIRE(normalize(float2(0.5f,0.f)).x == approx(1.f));
|
||||
REQUIRE(normalize(float2(0.5f,0.f)).x == uapprox(1.f));
|
||||
|
||||
STATIC_REQUIRE(faceforward(float2(1.f), float2(2.f), float2(3.f)).x == approx(-1.f));
|
||||
STATIC_REQUIRE(reflect(float2(1.f), float2(2.f)).x == approx(-15.f));
|
||||
REQUIRE(refract(float2(1.f), float2(2.f), 1.f).x == approx(-15.f));
|
||||
STATIC_REQUIRE(faceforward(float2(1.f), float2(2.f), float2(3.f)).x == uapprox(-1.f));
|
||||
STATIC_REQUIRE(reflect(float2(1.f), float2(2.f)).x == uapprox(-15.f));
|
||||
REQUIRE(refract(float2(1.f), float2(2.f), 1.f).x == uapprox(-15.f));
|
||||
}
|
||||
|
||||
SUBCASE("Relational Functions") {
|
||||
|
||||
Reference in New Issue
Block a user