blob: 63c5a95b8a570c0505c676c0771bb9331d34bba2 [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: TestMatrixEval.h,v 1.1 2004/04/24 11:55:15 opetzold Exp $
*/
#ifndef TVMET_TEST_MATRIX_EVAL_H
#define TVMET_TEST_MATRIX_EVAL_H
#include <cppunit/extensions/HelperMacros.h>
#include <tvmet/Matrix.h>
#include <cassert>
template <class T>
class TestMatrixEval : public CppUnit::TestFixture
{
CPPUNIT_TEST_SUITE( TestMatrixEval );
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::Matrix<T, 3, 3> matrix_type;
public:
TestMatrixEval()
: mOne(1), mZero(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:
matrix_type m1;
matrix_type mBig; /**< matrix bigger than m1 */
const matrix_type mOne;
const matrix_type mZero;
};
/*****************************************************************************
* Implementation Part I (cppunit part)
****************************************************************************/
template <class T>
void TestMatrixEval<T>::setUp () {
m1 = 1,4,7,
2,5,8,
3,6,9;
mBig = 10,40,70,
20,50,80,
30,60,90;
}
template <class T>
void TestMatrixEval<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
TestMatrixEval<T>::Greater() {
// all test are element wise !
assert( all_elements(mBig > m1) );
}
template <class T>
void
TestMatrixEval<T>::Less() {
// all test are element wise !
assert( all_elements(m1 < mBig) );
}
template <class T>
void
TestMatrixEval<T>::GreaterOrEqual() {
// all test are element wise !
assert( all_elements(mBig >= m1) );
assert( all_elements(m1 >= m1) );
assert( all_elements(mBig >= mBig) );
assert( all_elements(mOne >= T(1)) );
assert( all_elements(mZero>= T(0)) );
}
template <class T>
void
TestMatrixEval<T>::LessOrEqual() {
// all test are element wise !
assert( all_elements(m1 <= mBig) );
assert( all_elements(m1 <= m1) );
assert( all_elements(mBig <= mBig) );
assert( all_elements(mOne <= T(1)) );
assert( all_elements(mZero<= T(0)) );
}
template <class T>
void
TestMatrixEval<T>::Equal() {
// all test are element wise !
assert( all_elements(m1 == m1) );
assert( all_elements(mBig == mBig) );
assert( all_elements(mOne == T(1)) );
assert( all_elements(mZero == T(0)) );
}
template <class T>
void
TestMatrixEval<T>::NotEqual() {
// all test are element wise !
assert( all_elements(m1 != mBig) );
}
template <class T>
void
TestMatrixEval<T>::LogicalAnd() {
// TODO: implement
}
template <class T>
void
TestMatrixEval<T>::LogicalOr() {
// TODO: implement
}
/*****************************************************************************
* Implementation Part III
* test on generell and eval functions
****************************************************************************/
template <class T>
void
TestMatrixEval<T>::AllElements() {
// true cases
CPPUNIT_ASSERT( all_elements(mBig > T(0)) );
CPPUNIT_ASSERT( all_elements(mBig >= T(1)) );
CPPUNIT_ASSERT( all_elements(mBig < T(1000)) );
CPPUNIT_ASSERT( all_elements(mBig <= T(1000)) );
CPPUNIT_ASSERT( all_elements(T(0) < mBig) ); // possible, I newer would write it
CPPUNIT_ASSERT( all_elements(T(1000) > mBig) ); // possible, I newer would write it
CPPUNIT_ASSERT( all_elements(mOne == T(1)) );
CPPUNIT_ASSERT( all_elements(mZero == T(0)) );
CPPUNIT_ASSERT( all_elements(mBig != T(1000)) );
// false cases
CPPUNIT_ASSERT( !all_elements(mBig < T(0)) );
}
template <class T>
void
TestMatrixEval<T>::AnyElements() {
// true cases
CPPUNIT_ASSERT( any_elements(mBig > T(0)) );
CPPUNIT_ASSERT( any_elements(mBig >= T(1)) );
CPPUNIT_ASSERT( any_elements(mBig < T(1000)) );
CPPUNIT_ASSERT( any_elements(mBig <= T(1000)) );
CPPUNIT_ASSERT( any_elements(T(2) < m1) ); // possible, I newer would write it
CPPUNIT_ASSERT( any_elements(T(2) > m1) ); // possible, I newer would write it
CPPUNIT_ASSERT( any_elements(mOne == T(1)) );
CPPUNIT_ASSERT( any_elements(mZero == T(0)) );
CPPUNIT_ASSERT( any_elements(mBig != T(1000)) );
// false cases
CPPUNIT_ASSERT( !any_elements(mBig < T(2)) );
CPPUNIT_ASSERT( !any_elements(mOne == T(0)) );
CPPUNIT_ASSERT( !any_elements(mZero == T(1)) );
}
template <class T>
void
TestMatrixEval<T>::Eval3() {
matrix_type v;
T a(1); // scalar
// XprMatrix<E1, Rows, Cols> ? Matrix<T2, Rows, Cols> : Matrix<T3, Rows, Cols>
v = eval( m1 < mBig, m1, mBig);
CPPUNIT_ASSERT( all_elements(v == m1) );
v = eval( m1 > mBig, m1, mBig);
CPPUNIT_ASSERT( all_elements(v == mBig) );
// XprMatrix<E1, Rows, Cols> ? Matrix<T2, Rows, Cols> : XprMatrix<E3, Rows, Cols>
v = eval( m1 < mBig, m1, a*mBig);
CPPUNIT_ASSERT( all_elements(v == m1) );
v = eval( m1 > mBig, m1, a*mBig);
CPPUNIT_ASSERT( all_elements(v == mBig) );
// XprMatrix<E1, Rows, Cols> ? XprMatrix<E2, Rows, Cols> : Matrix<T3, Rows, Cols>
v = eval( m1 < mBig, a*m1, mBig);
CPPUNIT_ASSERT( all_elements(v == m1) );
v = eval( m1 > mBig, a*m1, mBig);
CPPUNIT_ASSERT( all_elements(v == mBig) );
// XprMatrix<E1, Rows, Cols> ? XprMatrix<E2, Rows, Cols> : XprMatrix<E3, Rows, Cols>
v = eval( m1 < mBig, a*m1, a*mBig);
CPPUNIT_ASSERT( all_elements(v == m1) );
v = eval( m1 > mBig, a*m1, a*mBig);
CPPUNIT_ASSERT( all_elements(v == mBig) );
}
template <class T>
void
TestMatrixEval<T>::EvalPod3() {
matrix_type v;
T a(1); // scalar
// XprMatrix<E, Rows, Cols> ? POD1 : POD2
v = eval( m1 < mBig, T(0), T(1));
CPPUNIT_ASSERT( all_elements(v == T(0)) );
v = eval( m1 > mBig, T(0), T(1));
CPPUNIT_ASSERT( all_elements(v == T(1)) );
// XprMatrix<E1, Rows, Cols> ? POD : XprMatrix<E3, Rows, Cols>
v = eval( m1 < mBig, 1, a*mBig);
CPPUNIT_ASSERT( all_elements(v == mOne) );
v = eval( m1 > mBig, 1, a*mBig);
CPPUNIT_ASSERT( all_elements(v == mBig) );
// XprMatrix<E1, Rows, Cols> ? XprMatrix<E2, Rows, Cols> : POD
v = eval( m1 < mBig, a*m1, T(1));
CPPUNIT_ASSERT( all_elements(v == m1) );
v = eval( m1 > mBig, a*m1, T(1));
CPPUNIT_ASSERT( all_elements(v == mOne) );
}
#endif // TVMET_TEST_MATRIX_EVAL_H
// Local Variables:
// mode:C++
// End: