blob: 8beee50b63933ea0227ad63dfe1bfa74f8027c58 [file]
/*
* Tiny Vector Matrix Library
* Dense Vector Matrix Libary of Tiny size using Expression Templates
*
* Copyright (C) 2001 - 2003 Olaf Petzold <opetzold@users.sourceforge.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* $Id: TestVectorEval.h,v 1.1 2004/04/24 11:55:15 opetzold Exp $
*/
#ifndef TVMET_TEST_VECTOR_EVAL_H
#define TVMET_TEST_VECTOR_EVAL_H
#include <cppunit/extensions/HelperMacros.h>
#include <tvmet/Vector.h>
#include <cassert>
template <class T>
class TestVectorEval : public CppUnit::TestFixture
{
// basic tests
CPPUNIT_TEST_SUITE( TestVectorEval );
CPPUNIT_TEST( Greater );
CPPUNIT_TEST( Less );
CPPUNIT_TEST( GreaterOrEqual );
CPPUNIT_TEST( LessOrEqual );
CPPUNIT_TEST( Equal );
CPPUNIT_TEST( NotEqual );
CPPUNIT_TEST( LogicalAnd );
CPPUNIT_TEST( LogicalOr );
// others
CPPUNIT_TEST( AllElements );
CPPUNIT_TEST( AnyElements );
CPPUNIT_TEST( Eval3 );
CPPUNIT_TEST( EvalPod3 );
CPPUNIT_TEST_SUITE_END();
private:
typedef tvmet::Vector<T, 3> vector_type;
public:
TestVectorEval()
: vOne(1), vZero(0) { }
public: // cppunit interface
/** cppunit hook for fixture set up. */
void setUp();
/** cppunit hook for fixture tear down. */
void tearDown();
protected:
void Greater();
void Less();
void GreaterOrEqual();
void LessOrEqual();
void Equal();
void NotEqual();
void LogicalAnd();
void LogicalOr();
void AllElements();
void AnyElements();
void Eval3();
void EvalPod3();
private:
vector_type v1;
vector_type vBig; /**< vector bigger than v1 */
const vector_type vOne;
const vector_type vZero;
};
/*****************************************************************************
* Implementation Part I (cppunit part)
****************************************************************************/
template <class T>
void TestVectorEval<T>::setUp () {
v1 = 1,2,3;
vBig = 10,20,30;
}
template <class T>
void TestVectorEval<T>::tearDown() { }
/*****************************************************************************
* Implementation Part II
* these are elemental - therefore we use std::assert
****************************************************************************/
/*
* on SelfTest, we have the guarantee, that the container holds the
* expected values. Now check comparing operation using tvmet's
* eval function. This is the basic for all further test since it's
* the way we check the correctness. The other way would be element wise
* compare as in SelfTest, urgh...
*/
template <class T>
void
TestVectorEval<T>::Greater() {
// all test are element wise !
assert( all_elements(vBig > v1) );
}
template <class T>
void
TestVectorEval<T>::Less() {
// all test are element wise !
assert( all_elements(v1 < vBig) );
}
template <class T>
void
TestVectorEval<T>::GreaterOrEqual() {
// all test are element wise !
assert( all_elements(vBig >= v1) );
assert( all_elements(v1 >= v1) );
assert( all_elements(vBig >= vBig) );
assert( all_elements(vOne >= T(1)) );
assert( all_elements(vZero>= T(0)) );
}
template <class T>
void
TestVectorEval<T>::LessOrEqual() {
// all test are element wise !
assert( all_elements(v1 <= vBig) );
assert( all_elements(v1 <= v1) );
assert( all_elements(vBig <= vBig) );
assert( all_elements(vOne <= T(1)) );
assert( all_elements(vZero<= T(0)) );
}
template <class T>
void
TestVectorEval<T>::Equal() {
// all test are element wise !
assert( all_elements(v1 == v1) );
assert( all_elements(vBig == vBig) );
assert( all_elements(vOne == 1) );
assert( all_elements(vZero == T(0)) );
}
template <class T>
void
TestVectorEval<T>::NotEqual() {
// all test are element wise !
assert( all_elements(v1 != vBig) );
}
template <class T>
void
TestVectorEval<T>::LogicalAnd() {
// TODO: implement
}
template <class T>
void
TestVectorEval<T>::LogicalOr() {
// TODO: implement
}
/*****************************************************************************
* Implementation Part III
* test on generell and eval functions
****************************************************************************/
template <class T>
void
TestVectorEval<T>::AllElements() {
// true cases
CPPUNIT_ASSERT( all_elements(vBig > T(0)) );
CPPUNIT_ASSERT( all_elements(vBig >= T(1)) );
CPPUNIT_ASSERT( all_elements(vBig < T(1000)) );
CPPUNIT_ASSERT( all_elements(vBig <= T(1000)) );
CPPUNIT_ASSERT( all_elements(T(0) < vBig) ); // possible, I newer would write it
CPPUNIT_ASSERT( all_elements(T(1000) > vBig) ); // possible, I newer would write it
CPPUNIT_ASSERT( all_elements(vOne == T(1)) );
CPPUNIT_ASSERT( all_elements(vZero == T(0)) );
CPPUNIT_ASSERT( all_elements(vBig != T(1000)) );
// false cases
CPPUNIT_ASSERT( !all_elements(vBig < T(0)) );
}
template <class T>
void
TestVectorEval<T>::AnyElements() {
// true cases
CPPUNIT_ASSERT( any_elements(vBig > T(0)) );
CPPUNIT_ASSERT( any_elements(vBig >= T(1)) );
CPPUNIT_ASSERT( any_elements(vBig < T(1000)) );
CPPUNIT_ASSERT( any_elements(vBig <= T(1000)) );
CPPUNIT_ASSERT( any_elements(T(2) < v1) ); // possible, I newer would write it
CPPUNIT_ASSERT( any_elements(T(2) > v1) ); // possible, I newer would write it
CPPUNIT_ASSERT( any_elements(vOne == T(1)) );
CPPUNIT_ASSERT( any_elements(vZero == T(0)) );
CPPUNIT_ASSERT( any_elements(vBig != T(1000)) );
// false cases
CPPUNIT_ASSERT( !any_elements(vBig < T(2)) );
CPPUNIT_ASSERT( !any_elements(vOne == T(0)) );
CPPUNIT_ASSERT( !any_elements(vZero == T(1)) );
}
template <class T>
void
TestVectorEval<T>::Eval3() {
vector_type v;
T a(1); // scalar
// XprVector<E1, Sz> ? Vector<T2, Sz> : Vector<T3, Sz>
v = eval( v1 < vBig, v1, vBig);
CPPUNIT_ASSERT( all_elements(v == v1) );
v = eval( v1 > vBig, v1, vBig);
CPPUNIT_ASSERT( all_elements(v == vBig) );
// XprVector<E1, Sz> ? Vector<T2, Sz> : XprVector<E3, Sz>
v = eval( v1 < vBig, v1, a*vBig);
CPPUNIT_ASSERT( all_elements(v == v1) );
v = eval( v1 > vBig, v1, a*vBig);
CPPUNIT_ASSERT( all_elements(v == vBig) );
// XprVector<E1, Sz> ? XprVector<E2, Sz> : Vector<T3, Sz>
v = eval( v1 < vBig, a*v1, vBig);
CPPUNIT_ASSERT( all_elements(v == v1) );
v = eval( v1 > vBig, a*v1, vBig);
CPPUNIT_ASSERT( all_elements(v == vBig) );
// XprVector<E1, Sz> ? XprVector<E2, Sz> : XprVector<E3, Sz>
v = eval( v1 < vBig, a*v1, a*vBig);
CPPUNIT_ASSERT( all_elements(v == v1) );
v = eval( v1 > vBig, a*v1, a*vBig);
CPPUNIT_ASSERT( all_elements(v == vBig) );
}
template <class T>
void
TestVectorEval<T>::EvalPod3() {
vector_type v;
T a(1); // scalar
// XprVector<E, Sz> ? POD1 : POD2
v = eval( v1 < vBig, T(0), T(1));
CPPUNIT_ASSERT( all_elements(v == T(0)) );
v = eval( v1 > vBig, T(0), T(1));
CPPUNIT_ASSERT( all_elements(v == T(1)) );
// XprVector<E1, Sz> ? POD : XprVector<E3, Sz>
v = eval( v1 < vBig, 1, a*vBig);
CPPUNIT_ASSERT( all_elements(v == vOne) );
v = eval( v1 > vBig, 1, a*vBig);
CPPUNIT_ASSERT( all_elements(v == vBig) );
// XprVector<E1, Sz> ? XprVector<E2, Sz> : POD
v = eval( v1 < vBig, a*v1, T(1));
CPPUNIT_ASSERT( all_elements(v == v1) );
v = eval( v1 > vBig, a*v1, T(1));
CPPUNIT_ASSERT( all_elements(v == vOne) );
}
#endif // TVMET_TEST_VECTOR_EVAL_H
// Local Variables:
// mode:C++
// End: