/***************************************************************************
* test_GVector.cpp - Test vector class *
* ----------------------------------------------------------------------- *
* copyright (C) 2006-2013 by Juergen Knoedlseder *
* ----------------------------------------------------------------------- *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see . *
* *
***************************************************************************/
/**
* @file test_GVector.cpp
* @brief Testing of vector class implementation
* @author Juergen Knoedlseder
*/
/* __ Includes ___________________________________________________________ */
#include
#include "test_GVector.hpp"
/* __ Namespaces _________________________________________________________ */
/* __ Globals ____________________________________________________________ */
/* __ Debug definitions __________________________________________________ */
/***********************************************************************//**
* @brief Set parameters and tests
***************************************************************************/
void TestGVector::set(void){
// Test name
name("GVector");
// Set parameters
m_num = 5;
// Define vectors
define_vectors();
// Append tests
append(static_cast(&TestGVector::allocation), "Vector allocation");
append(static_cast(&TestGVector::assign), "Assign values");
append(static_cast(&TestGVector::arithmetics), "Assignment and arithmetics");
append(static_cast(&TestGVector::comparison), "Comparison");
return;
}
/***********************************************************************//**
* @brief Clone test suite
*
* @return Pointer to deep copy of test suite.
***************************************************************************/
TestGVector* TestGVector::clone(void) const
{
// Clone test suite
return new TestGVector(*this);
}
/***********************************************************************//**
* @brief Define vectors
***************************************************************************/
void TestGVector::define_vectors(void){
// Allocate and initialise vectors
m_test = GVector(m_num);
m_result = GVector(m_num);
m_smaller = GVector(m_num+1);
m_bigger = GVector(m_num+1);
for (int i = 0; i < m_num; ++i) {
m_test[i] = (i+1) * 1.1;
}
for (int i = 0; i < m_num-1; ++i) {
m_smaller[i] = (i+1) * 1.1;
}
for (int i = 0; i < m_num+1; ++i) {
m_bigger[i] = (i+1) * 1.1;
}
// Return
return;
}
/***********************************************************************//**
* @brief Vector allocation
***************************************************************************/
void TestGVector::allocation(void){
// Test void constructor
test_try("Void constructor");
try {
GVector vector;
test_try_success();
}
catch (std::exception &e) {
test_try_failure(e);
}
// Test zero vector allocation
test_try("Number constructor");
try {
GVector vector(0);
test_try_success();
}
catch (std::exception &e) {
test_try_failure(e);
}
// Test non-zero allocation
test_try("Number constructor");
try {
GVector vector(10);
test_try_success();
}
catch (std::exception &e) {
test_try_failure(e);
}
// Test value constructors
test_try("Value constructors");
try {
// One element
GVector vector1(3.0);
test_value(vector1[0], 3.0);
test_assert(vector1.size() == 1, "Expected vector size 1.");
// Two elements
GVector vector2(2.0, 5.0);
test_value(vector2[0], 2.0);
test_value(vector2[1], 5.0);
test_assert(vector2.size() == 2, "Expected vector size 2.");
// Three elements
GVector vector3(7.0, 8.0, 9.0);
test_value(vector3[0], 7.0);
test_value(vector3[1], 8.0);
test_value(vector3[2], 9.0);
test_assert(vector3.size() == 3, "Expected vector size 3.");
test_try_success();
}
catch (std::exception &e) {
test_try_failure(e);
}
// Test copy constructor
test_try("Copy constructor");
try {
GVector vector = m_test;
test_assert(vector == m_test, vector.print() + " instead of " + m_test.print());
test_try_success();
}
catch (std::exception &e) {
test_try_failure(e);
}
// Return
return;
}
/***********************************************************************//**
* @brief Vector assignment
***************************************************************************/
void TestGVector::assign(void){
// Test value assignment
GVector test3(3);
double ref = std::acos(-1.0);
test3[1] = ref;
test_value(test3[0], 0.0);
test_value(test3[1], ref);
test_value(test3[2], 0.0);
test_assert(test3.size() == 3, "Expected vector size 3.");
#if defined(G_RANGE_CHECK)
test_try("Test out of range access");
try {
test3[3];
test_try_failure();
}
catch (GException::out_of_range &e) {
test_try_success();
}
catch (std::exception &e) {
test_try_failure(e);
}
#endif
// Test vector assignment
m_result = m_test;
test_assert(m_result == m_test, "m_result == m_test");
m_result = m_bigger;
test_assert(m_result==m_bigger,"m_result == m_bigger");
test_assert(m_result.size()==m_bigger.size(),"m_result.size() == m_bigger.size()");
// Return
return;
}
/***********************************************************************//**
* @brief Assignment and arithmetics
***************************************************************************/
void TestGVector::arithmetics(void){
m_result = m_test;
m_result += m_test;
// GVector += GVector
test_assert(m_result[0]==m_test[0]*2&&
m_result[1]==m_test[1]*2&&
m_result[2]==m_test[2]*2&&
m_result[3]==m_test[3]*2&&
m_result[4]==m_test[4]*2,"GVector += GVector");
// GVector += 2.0
m_result = m_test;
m_result += 2.0;
test_value(m_result[0],m_test[0]+2,1e-6,"GVector += 2.0 (1)");
test_value(m_result[0],m_test[0]+2,1e-6,"GVector += 2.0 (2)");
test_value(m_result[0],m_test[0]+2,1e-6,"GVector += 2.0 (3)");
test_value(m_result[0],m_test[0]+2,1e-6,"GVector += 2.0 (4)");
// GVector -= GVector
m_result = m_test;
m_result -= m_test;
test_assert(m_result[0]==0&&
m_result[1]==0&&
m_result[2]==0&&
m_result[3]==0&&
m_result[4]==0,"GVector -= GVector");
// GVector -= 2.0
m_result = m_test;
m_result -= 2.0;
test_assert(m_result[0]==m_test[0]-2&&
m_result[1]==m_test[1]-2&&
m_result[2]==m_test[2]-2&&
m_result[3]==m_test[3]-2&&
m_result[4]==m_test[4]-2,"GVector -= 2.0");
// GVector *= 2.0
m_result = m_test;
m_result *= 2.0;
test_assert(m_result[0]==m_test[0]*2&&
m_result[1]==m_test[1]*2&&
m_result[2]==m_test[2]*2&&
m_result[3]==m_test[3]*2&&
m_result[4]==m_test[4]*2,"GVector *= 2.0");
// GVector /= 2.0
m_result = m_test;
m_result /= 2.0;
test_assert(m_result[0]==m_test[0]/2&&
m_result[1]==m_test[1]/2&&
m_result[2]==m_test[2]/2&&
m_result[3]==m_test[3]/2&&
m_result[4]==m_test[4]/2,"GVector /= 2.0");
// GVector = -GVector
m_result = -m_test;
test_assert(m_result[0]== -m_test[0]&&
m_result[1]==-m_test[1]&&
m_result[2]==-m_test[2]&&
m_result[3]==-m_test[3]&&
m_result[4]==-m_test[4],"GVector = -GVector");
// Devide by zero
m_result = m_test;
m_result /= 0.0;
test_assert(m_result.print()=="(inf, inf, inf, inf, inf)"||m_result.print()=="(Inf, Inf, Inf, Inf, Inf)","Devide by zero",m_result.print());
// GVector + GVector
m_result = m_test + m_test;
test_assert(m_result[0]==m_test[0]*2&&
m_result[1]==m_test[1]*2&&
m_result[2]==m_test[2]*2&&
m_result[3]==m_test[3]*2&&
m_result[4]==m_test[4]*2,"GVector + GVector");
// GVector + 2.0
m_result = m_test + 2.0;
test_value(m_result[0],m_test[0]+2,1e-6,"GVector + 2.0 (1)");
test_value(m_result[0],m_test[0]+2,1e-6,"GVector + 2.0 (2)");
test_value(m_result[0],m_test[0]+2,1e-6,"GVector + 2.0 (3)");
test_value(m_result[0],m_test[0]+2,1e-6,"GVector + 2.0 (4)");
// GVector + 2
m_result = m_test + 2;
test_value(m_result[0],m_test[0]+2,1e-6,"GVector + 2 (1)");
test_value(m_result[0],m_test[0]+2,1e-6,"GVector + 2 (2)");
test_value(m_result[0],m_test[0]+2,1e-6,"GVector + 2 (3)");
test_value(m_result[0],m_test[0]+2,1e-6,"GVector + 2 (4)");
//
m_result = 2.0 + m_test;
test_value(m_result[0],m_test[0]+2,1e-6,"2.0 + GVector (1)");
test_value(m_result[0],m_test[0]+2,1e-6,"2.0 + GVector (2)");
test_value(m_result[0],m_test[0]+2,1e-6,"2.0 + GVector (3)");
test_value(m_result[0],m_test[0]+2,1e-6,"2.0 + GVector (4)");
// 2 + GVector
m_result = 2 + m_test;
test_value(m_result[0],m_test[0]+2,1e-6,"2 + GVector (1)");
test_value(m_result[0],m_test[0]+2,1e-6,"2 + GVector (2)");
test_value(m_result[0],m_test[0]+2,1e-6,"2 + GVector (3)");
test_value(m_result[0],m_test[0]+2,1e-6,"2 + GVector (4)");
// GVector - GVector
m_result = m_test - m_test;
test_assert(m_result[0]==0&&
m_result[1]==0&&
m_result[2]==0&&
m_result[3]==0&&
m_result[4]==0,"GVector - GVector");
// GVector - 2.0
m_result = m_test - 2.0;
test_assert(m_result[0]==m_test[0]-2&&
m_result[1]==m_test[1]-2&&
m_result[2]==m_test[2]-2&&
m_result[3]==m_test[3]-2&&
m_result[4]==m_test[4]-2,"GVector - 2.0");
// 2.0 - GVector
m_result = 2.0 - m_test;
test_assert(m_result[0]==2-m_test[0]&&
m_result[1]==2-m_test[1]&&
m_result[2]==2-m_test[2]&&
m_result[3]==2-m_test[3]&&
m_result[4]==2-m_test[4],"2.0 - GVector");
// Scalar (or dot) product GVector * GVector
test_value( m_test[0]*m_test[0]+
m_test[1]*m_test[1]+
m_test[2]*m_test[2]+
m_test[3]*m_test[3]+
m_test[4]*m_test[4],
m_test * m_test,
1e-6,"Scalar (or dot) product GVector * GVector");
// GVector * 2.0
m_result = m_test * 2.0;
test_assert(m_result[0]==m_test[0]*2&&
m_result[1]==m_test[1]*2&&
m_result[2]==m_test[2]*2&&
m_result[3]==m_test[3]*2&&
m_result[4]==m_test[4]*2,"GVector * 2.0");
// 2.0 * GVector
m_result = 2.0 * m_test;
test_assert(m_result[0]==m_test[0]*2&&
m_result[1]==m_test[1]*2&&
m_result[2]==m_test[2]*2&&
m_result[3]==m_test[3]*2&&
m_result[4]==m_test[4]*2,"2.0 * GVector");
// |GVector| (vector norm))
test_value(sqrt( m_test[0]*m_test[0]+
m_test[1]*m_test[1]+
m_test[2]*m_test[2]+
m_test[3]*m_test[3]+
m_test[4]*m_test[4]),
norm(m_test),
1e-6,
"|GVector| (vector norm)");
// min(GVector)
test_assert(min(m_test)==1.1,"min(GVector)");
// max(GVector)
test_assert(max(m_test)==5.5,"max(GVector)");
// sum(GVector)
test_value(m_test[0]+m_test[1]+m_test[2]+m_test[3]+m_test[4],sum(m_test),1e-6,"sum(GVector)");
// acos(GVector/10.0)
test_assert(acos(m_test/10.0).print()=="(1.46057, 1.34898, 1.23449, 1.1152, 0.988432)","acos(GVector/10.0)");
// acosh(GVector)
test_assert(acosh(m_test).print()=="(0.443568, 1.42542, 1.86328, 2.16158, 2.38953)","acosh(GVector)");
// asin(GVector/10.0)
test_assert(asin(m_test/10.0).print()=="(0.110223, 0.221814, 0.336304, 0.455599, 0.582364)","asin(GVector/10.0)");
// asinh(GVector/10.0)
test_assert(asinh(m_test/10.0).print()=="(0.109779, 0.218263, 0.324286, 0.426913, 0.52548)","asinh(GVector/10.0)");
// atan(GVector/10.0)
test_assert(atan(m_test/10.0).print()=="(0.10956, 0.21655, 0.318748, 0.414507, 0.502843)","atan(GVector/10.0)");
// atanh(GVector/10.0)
test_assert(atanh(m_test/10.0).print()=="(0.110447, 0.223656, 0.342828, 0.472231, 0.618381)","atanh(GVector/10.0)");
// cos(GVector)
test_assert(cos(m_test).print()=="(0.453596, -0.588501, -0.98748, -0.307333, 0.70867)","cos(GVector)");
// cosh(GVector)
test_assert(cosh(m_test).print()=="(1.66852, 4.56791, 13.5748, 40.7316, 122.348)","cosh(GVector)");
// exp(GVector)
test_assert(exp(m_test).print()=="(3.00417, 9.02501, 27.1126, 81.4509, 244.692)","exp(GVector)");
// abs(cos(m_test))
test_assert(abs(cos(m_test)).print()=="(0.453596, 0.588501, 0.98748, 0.307333, 0.70867)","abs(cos(m_test))");
// log(GVector)
test_assert(log(m_test).print()=="(0.0953102, 0.788457, 1.19392, 1.4816, 1.70475)","log(GVector)");
// log10(GVector)
test_assert(log10(m_test).print()=="(0.0413927, 0.342423, 0.518514, 0.643453, 0.740363)","log10(GVector)");
// sin(GVector)
test_assert(sin(m_test).print()=="(0.891207, 0.808496, -0.157746, -0.951602, -0.70554)","sin(GVector)");
// sinh(GVector)
test_assert(sinh(m_test).print()=="(1.33565, 4.45711, 13.5379, 40.7193, 122.344)","sinh(GVector)");
// sqrt(GVector)
test_assert(sqrt(m_test).print()=="(1.04881, 1.48324, 1.81659, 2.09762, 2.34521)","sqrt(GVector)");
// tan(GVector)
test_assert(tan(m_test).print()=="(1.96476, -1.37382, 0.159746, 3.09632, -0.995584)","tan(GVector)");
// tanh(GVector)
test_assert(tanh(m_test).print()=="(0.800499, 0.975743, 0.997283, 0.999699, 0.999967)","tanh(GVector)");
// Incompatible size GVector + GVector
test_try("Incompatible size GVector + GVector:");
try {
m_result = m_test + m_bigger;
test_try_failure();
}
catch (GException::vector_mismatch &e) {
test_try_success();
}
catch (std::exception &e) {
test_try_failure(e);
}
// cross(a,b) (using 5-dim vectors)
test_try("cross(a,b) (using 5-dim vectors)");
try {
cross(m_test,m_test);
test_try_failure();
}
catch (GException::vector_bad_cross_dim &e) {
test_try_success();
}
catch (std::exception &e) {
test_try_failure(e);
}
//cross(a,b) (using vectors with different dimension)
test_try("cross(a,b) (using vectors with different dimension)");
try {
cross(m_test,m_bigger);
test_try_failure();
}
catch (GException::vector_mismatch &e) {
test_try_success();
}
catch (std::exception &e) {
test_try_failure(e);
}
//cross(a,b) (using 3-dim vectors)
test_try("cross(a,b) (using 3-dim vectors)");
try {
GVector test_cross_a(3);
GVector test_cross_b(3);
test_cross_a[0] = 1.0;
test_cross_b[1] = 1.0;
//Test if cross == (0,0,1)
test_assert(cross(test_cross_a, test_cross_b)[0]==0&&cross(test_cross_a, test_cross_b)[1]==0&&cross(test_cross_a, test_cross_b)[2]==1,"Check cross(a,b) value");
test_try_success();
}
catch (std::exception &e) {
test_try_failure(e);
}
}
/***********************************************************************//**
* @brief Comparison
***************************************************************************/
void TestGVector::comparison(void){
// GVector == GVector
test_assert((m_test == m_test),"GVector == GVector");
// GVector == GVector(0)
GVector test7(m_num);
test_assert(!(m_test == test7),"GVector == GVector(0)");
//GVector == GVector (m_bigger)
test_assert(!(m_test == m_bigger),"GVector == GVector (m_bigger)");
// GVector != GVector
test_assert(!(m_test != m_test),"GVector != GVector");
// GVector != GVector(0)
test_assert((m_test != test7),"GVector != GVector(0)");
// GVector != GVector (m_bigger)
test_assert((m_test != m_bigger),"GVector != GVector (m_bigger)");
}
/***********************************************************************//**
* @brief Main test entry point
***************************************************************************/
int main(void)
{
// Allocate test suite container
GTestSuites testsuites("GVector");
// Initially assume that we pass all tests
bool was_successful=true;
// Create a test suite
TestGVector test;
// Append to the container
testsuites.append(test);
// Run
was_successful=testsuites.run();
// Save xml report
testsuites.save("reports/GVector.xml");
// Return
return was_successful ? 0:1;
}