/* Copyright © 2010, 2011, 2012 Vladimír Vondruš This file is part of Magnum. Magnum is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3 only, as published by the Free Software Foundation. Magnum is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License version 3 for more details. */ #include #include #include #include "Math/Vector4.h" struct Vec4 { float x, y, z, w; }; namespace Magnum { namespace Math { namespace Implementation { template<> struct VectorConverter<4, float, Vec4> { inline constexpr static Vector<4, Float> from(const Vec4& other) { return {other.x, other.y, other.z, other.w}; } inline constexpr static Vec4 to(const Vector<4, Float>& other) { return {other[0], other[1], other[2], other[3]}; } }; } namespace Test { class Vector4Test: public Corrade::TestSuite::Tester { public: Vector4Test(); void construct(); void constructDefault(); void constructOneValue(); void constructParts(); void constructConversion(); void constructCopy(); void convert(); void access(); void threeComponent(); void twoComponent(); void debug(); void configuration(); }; typedef Math::Vector4 Vector4; typedef Math::Vector4 Vector4i; typedef Math::Vector3 Vector3; typedef Math::Vector2 Vector2; Vector4Test::Vector4Test() { addTests({&Vector4Test::construct, &Vector4Test::constructDefault, &Vector4Test::constructOneValue, &Vector4Test::constructParts, &Vector4Test::constructConversion, &Vector4Test::constructCopy, &Vector4Test::convert, &Vector4Test::access, &Vector4Test::threeComponent, &Vector4Test::twoComponent, &Vector4Test::debug, &Vector4Test::configuration}); } void Vector4Test::construct() { constexpr Vector4 a(1.0f, -2.5f, 3.0f, 4.1f); CORRADE_COMPARE(a, (Vector<4, Float>(1.0f, -2.5f, 3.0f, 4.1f))); } void Vector4Test::constructDefault() { constexpr Vector4 a; CORRADE_COMPARE(a, Vector4(0.0f, 0.0f, 0.0f, 0.0f)); } void Vector4Test::constructOneValue() { #ifndef CORRADE_GCC46_COMPATIBILITY constexpr Vector4 a(4.3f); #else Vector4 a(4.3f); /* Not constexpr under GCC < 4.7 */ #endif CORRADE_COMPARE(a, Vector4(4.3f, 4.3f, 4.3f, 4.3f)); } void Vector4Test::constructParts() { constexpr Vector3 a(1.0f, 2.0f, 3.0f); constexpr Vector4 b(a, 4.0f); CORRADE_COMPARE(b, Vector4(1.0f, 2.0f, 3.0f, 4.0f)); } void Vector4Test::constructConversion() { constexpr Vector4 a(1.0f, -2.5f, 3.0f, 4.1f); #ifndef CORRADE_GCC46_COMPATIBILITY constexpr Vector4i b(a); #else Vector4i b(a); /* Not constexpr under GCC < 4.7 */ #endif CORRADE_COMPARE(b, Vector4i(1, -2, 3, 4)); } void Vector4Test::constructCopy() { constexpr Vector4 a(1.0f, -2.5f, 3.0f, 4.1f); constexpr Vector4 b(a); CORRADE_COMPARE(b, Vector4(1.0f, -2.5f, 3.0f, 4.1f)); } void Vector4Test::convert() { Vec4 a{1.5f, 2.0f, -3.5f, -0.5f}; Vector4 b(1.5f, 2.0f, -3.5f, -0.5f); CORRADE_COMPARE(Vector4(a), b); CORRADE_COMPARE(Vec4(b).x, a.x); CORRADE_COMPARE(Vec4(b).y, a.y); CORRADE_COMPARE(Vec4(b).z, a.z); CORRADE_COMPARE(Vec4(b).w, a.w); } void Vector4Test::access() { Vector4 vec(1.0f, -2.0f, 5.0f, 0.5f); CORRADE_COMPARE(vec.x(), 1.0f); CORRADE_COMPARE(vec.y(), -2.0f); CORRADE_COMPARE(vec.z(), 5.0f); CORRADE_COMPARE(vec.w(), 0.5f); constexpr Vector4 cvec(1.0f, -2.0f, 5.0f, 0.5f); constexpr Float x = cvec.x(); constexpr Float y = cvec.y(); constexpr Float z = cvec.z(); constexpr Float w = cvec.w(); CORRADE_COMPARE(x, 1.0f); CORRADE_COMPARE(y, -2.0f); CORRADE_COMPARE(z, 5.0f); CORRADE_COMPARE(w, 0.5f); } void Vector4Test::threeComponent() { Vector4 a(1.0f, 2.0f, 3.0f, 4.0f); CORRADE_COMPARE(a.xyz(), Vector3(1.0f, 2.0f, 3.0f)); constexpr Vector4 b(1.0f, 2.0f, 3.0f, 4.0f); constexpr Vector3 c = b.xyz(); constexpr Float d = b.xyz().y(); CORRADE_COMPARE(c, Vector3(1.0f, 2.0f, 3.0f)); CORRADE_COMPARE(d, 2.0f); } void Vector4Test::twoComponent() { Vector4 a(1.0f, 2.0f, 3.0f, 4.0f); CORRADE_COMPARE(a.xy(), Vector2(1.0f, 2.0f)); constexpr Vector4 b(1.0f, 2.0f, 3.0f, 4.0f); constexpr Vector2 c = b.xy(); constexpr Float d = b.xy().x(); CORRADE_COMPARE(c, Vector2(1.0f, 2.0f)); CORRADE_COMPARE(d, 1.0f); } void Vector4Test::debug() { std::ostringstream o; Debug(&o) << Vector4(0.5f, 15.0f, 1.0f, 1.0f); CORRADE_COMPARE(o.str(), "Vector(0.5, 15, 1, 1)\n"); } void Vector4Test::configuration() { Corrade::Utility::Configuration c; Vector4 vec(3.0f, 3.125f, 9.0f, 9.55f); std::string value("3 3.125 9 9.55"); c.setValue("vector", vec); CORRADE_COMPARE(c.value("vector"), value); CORRADE_COMPARE(c.value("vector"), vec); } }}} CORRADE_TEST_MAIN(Magnum::Math::Test::Vector4Test)