Browse Source

Math: test Dual subclass implementation macro.

Not sure why I did not do this already.
pull/114/merge
Vladimír Vondruš 11 years ago
parent
commit
1becbae4ec
  1. 66
      src/Magnum/Math/Test/DualTest.cpp

66
src/Magnum/Math/Test/DualTest.cpp

@ -49,11 +49,15 @@ struct DualTest: Corrade::TestSuite::Tester {
void conjugated();
void sqrt();
void subclassTypes();
void subclass();
void debug();
};
typedef Math::Dual<Float> Dual;
typedef Math::Dual<Vector2<Float>> DualVector2;
typedef Math::Vector2<Float> Vector2;
typedef Math::Dual<Vector2> DualVector2;
DualTest::DualTest() {
addTests({&DualTest::construct,
@ -71,6 +75,9 @@ DualTest::DualTest() {
&DualTest::conjugated,
&DualTest::sqrt,
&DualTest::subclassTypes,
&DualTest::subclass,
&DualTest::debug});
}
@ -156,6 +163,63 @@ void DualTest::sqrt() {
CORRADE_COMPARE(Math::sqrt(Dual(16.0f, 2.0f)), Dual(4.0f, 0.25f));
}
namespace {
template<class T> class BasicDualVec2: public Math::Dual<Math::Vector2<T>> {
public:
/* MSVC 2015 can't handle {} here */
template<class ...U> constexpr BasicDualVec2(U&&... args): Math::Dual<Math::Vector2<T>>(args...) {}
MAGNUM_DUAL_SUBCLASS_IMPLEMENTATION(BasicDualVec2, Math::Vector2)
};
typedef BasicDualVec2<Float> DualVec2;
}
void DualTest::subclassTypes() {
const DualVec2 a;
CORRADE_VERIFY((std::is_same<decltype(-a), DualVec2>::value));
CORRADE_VERIFY((std::is_same<decltype(a + a), DualVec2>::value));
CORRADE_VERIFY((std::is_same<decltype(a - a), DualVec2>::value));
CORRADE_VERIFY((std::is_same<decltype(a*a), DualVec2>::value));
CORRADE_VERIFY((std::is_same<decltype(a/a), DualVec2>::value));
DualVec2 b;
CORRADE_VERIFY((std::is_same<decltype(b += a), DualVec2&>::value));
CORRADE_VERIFY((std::is_same<decltype(b -= a), DualVec2&>::value));
const Dual c;
CORRADE_VERIFY((std::is_same<decltype(a*c), DualVec2>::value));
//CORRADE_VERIFY((std::is_same<decltype(c*a), DualVec2>::value)); does not compile yet
CORRADE_VERIFY((std::is_same<decltype(a/c), DualVec2>::value));
//CORRADE_VERIFY((std::is_same<decltype(c/a), DualVec2>::value)); does not compile yet
}
void DualTest::subclass() {
const DualVec2 a{Vector2{1.5f, 2.0f}, Vector2{-4.0f, 1.3f}};
const DualVec2 b{Vector2{3.0f, -1.2f}, Vector2{ 0.2f, -1.0f}};
const DualVec2 c{Vector2{4.5f, 0.8f}, Vector2{-3.8f, 0.3f}};
const DualVec2 d{Vector2{4.5f, -2.4f}, Vector2{-11.7f, -3.56f}};
CORRADE_COMPARE(-a, (DualVec2{Vector2{-1.5f, -2.0f}, Vector2{4.0f, -1.3f}}));
CORRADE_COMPARE(a + b, c);
CORRADE_COMPARE(c - b, a);
CORRADE_COMPARE(a*b, d);
CORRADE_COMPARE(d/b, a);
/* No need to test in-place operators as the other ones are implemented
using them */
const Dual e{-2.0f, 0.5f};
const DualVec2 f{Vector2{-3.0f, -4.0f}, Vector2{8.75f, -1.6f}};
const DualVec2 g{Vector2{-2.0f/1.5f, -1.0f}, Vector2{-7.25f/2.25f, 3.6f/4.0f}};
CORRADE_COMPARE(a*e, f);
//CORRADE_COMPARE(e*a, f); does not compile yet
CORRADE_COMPARE(f/e, a);
//CORRADE_COMPARE(e/a, g); does not compile yet
}
void DualTest::debug() {
std::ostringstream o;

Loading…
Cancel
Save