/*
* Project: MoleCuilder
* Description: creates and alters molecular systems
* Copyright (C) 2012 University of Bonn. All rights reserved.
*
*
* This file is part of MoleCuilder.
*
* MoleCuilder 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 2 of the License, or
* (at your option) any later version.
*
* MoleCuilder 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 MoleCuilder. If not, see .
*/
/*
* FragmentUnitTest.cpp
*
* Created on: Aug 09, 2012
* Author: heber
*/
// include config.h
#ifdef HAVE_CONFIG_H
#include
#endif
using namespace std;
#include
#include
#include
#include "FragmentUnitTest.hpp"
#include
#include
#include
#include
#include "CodePatterns/Assert.hpp"
#ifdef HAVE_TESTRUNNER
#include "UnitTestMain.hpp"
#endif /*HAVE_TESTRUNNER*/
using namespace boost::assign;
/********************************************** Test classes **************************************/
// Registers the fixture into the 'registry'
CPPUNIT_TEST_SUITE_REGISTRATION( FragmentTest );
void FragmentTest::setUp()
{
// failing asserts should be thrown
ASSERT_DO(Assert::Throw);
Fragment::position_t pos(3,0.);
positions += pos;
pos[0] = 1.;
positions += pos;
pos[1] = 1.;
positions += pos;
pos[2] = 1.;
positions += pos;
charges += 1., 2., 3., 4.;
CPPUNIT_ASSERT_EQUAL( (size_t)3, pos.size() );
CPPUNIT_ASSERT( positions.size() == charges.size() );
fragment = new Fragment(positions, charges);
}
void FragmentTest::tearDown()
{
delete fragment;
}
/** UnitTest for isPositionEqual()
*/
void FragmentTest::isPositionEqual_Test()
{
// same position
for (Fragment::positions_t::const_iterator iter = positions.begin();
iter != positions.end(); ++iter)
CPPUNIT_ASSERT( Fragment::isPositionEqual(*iter, *iter) );
// other position
Fragment::position_t unequalpos(3,2.);
for (Fragment::positions_t::const_iterator iter = positions.begin();
iter != positions.end(); ++iter)
CPPUNIT_ASSERT( !Fragment::isPositionEqual(*iter, unequalpos) );
}
/** UnitTest for containsNuclei()
*/
void FragmentTest::containsNuclei_Test()
{
{
// tests present ones for containment
Fragment::nuclei_t validnuclei(positions.size());
std::transform(positions.begin(), positions.end(),
charges.begin(), validnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
CPPUNIT_ASSERT( fragment->containsNuclei(nucleus) );
}
}
{
// test some others
Fragment::nuclei_t invalidnuclei;
Fragment::position_t pos(3, -1.);
invalidnuclei += Fragment::createNucleus(pos, 1.);
pos[0] = 0.;
invalidnuclei += Fragment::createNucleus(pos, 1.);
pos[1] = 0.;
invalidnuclei += Fragment::createNucleus(pos, 1.);
pos[2] = -std::numeric_limits::epsilon()*1e+4;
invalidnuclei += Fragment::createNucleus(pos, 1.);
BOOST_FOREACH( Fragment::nucleus_t nucleus, invalidnuclei) {
CPPUNIT_ASSERT( !fragment->containsNuclei(nucleus) );
}
}
}
/** UnitTest for removeNuclei()
*/
void FragmentTest::removeNuclei_Test()
{
{
// tests present ones for removal
size_t size = fragment->nuclei.size();
Fragment::nuclei_t validnuclei(positions.size());
std::transform(positions.begin(), positions.end(),
charges.begin(), validnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
CPPUNIT_ASSERT_NO_THROW( fragment->removeNuclei(nucleus) );
CPPUNIT_ASSERT_EQUAL( --size, fragment->nuclei.size() );
}
}
{
// test some others
Fragment::nuclei_t invalidnuclei;
Fragment::position_t pos(3, -1.);
invalidnuclei += Fragment::createNucleus(pos, 1.);
pos[0] = 0;
invalidnuclei += Fragment::createNucleus(pos, 1.);
pos[1] = 0;
invalidnuclei += Fragment::createNucleus(pos, 1.);
pos[2] = -std::numeric_limits::epsilon()*1e+4;
invalidnuclei += Fragment::createNucleus(pos, 1.);
BOOST_FOREACH( Fragment::nucleus_t nucleus, invalidnuclei) {
CPPUNIT_ASSERT_NO_THROW( fragment->removeNuclei(nucleus) );
}
}
}
/** UnitTest for operator==() for Fragment::nucleus_t
*/
void FragmentTest::equalityNucleus_Test()
{
Fragment::nuclei_t validnuclei(positions.size());
std::transform(positions.begin(), positions.end(),
charges.begin(), validnuclei.begin(), Fragment::createNucleus);
{
// create some nuclei
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
CPPUNIT_ASSERT( nucleus == nucleus );
}
}
{
// create nucleus at other position
Fragment::position_t pos(3, 2.);
Fragment::nucleus_t unequalposnucleus(pos, 1.);
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
CPPUNIT_ASSERT( nucleus != unequalposnucleus );
}
}
{
// create nucleus with different charge
Fragment::position_t pos(3, 1.);
Fragment::nucleus_t unequalchargenucleus(pos, 5.);
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
CPPUNIT_ASSERT( nucleus != unequalchargenucleus );
}
}
}
/** UnitTest for operator==()
*/
void FragmentTest::equality_Test()
{
// create different fragment
Fragment::positions_t otherpositions;
Fragment::position_t otherpos(3, 2.);
otherpositions += otherpos;
otherpos[0] = 0.;
otherpositions += otherpos;
otherpos[1] = 0.;
otherpositions += otherpos;
Fragment::charges_t othercharges;
othercharges += 1., 2., 3.;
Fragment otherfragment(otherpositions, othercharges);
CPPUNIT_ASSERT( !(*fragment == otherfragment) );
CPPUNIT_ASSERT( *fragment != otherfragment );
// test against empty fragment
Fragment emptyfragment;
CPPUNIT_ASSERT( !(*fragment == emptyfragment) );
CPPUNIT_ASSERT( *fragment != emptyfragment );
// tests against themselves
CPPUNIT_ASSERT( *fragment == *fragment );
CPPUNIT_ASSERT( otherfragment == otherfragment );
CPPUNIT_ASSERT( emptyfragment == emptyfragment );
}
/** UnitTest for operator+=()
*/
void FragmentTest::assignment_Test()
{
// create different fragment
Fragment::positions_t otherpositions;
Fragment::position_t otherpos(3, 2.);
otherpositions += otherpos;
otherpos[0] = 0.;
otherpositions += otherpos;
otherpos[1] = 0.;
otherpositions += otherpos;
Fragment::charges_t othercharges;
othercharges += 1., 2., 3.;
Fragment otherfragment(otherpositions, othercharges);
// check for inequality
CPPUNIT_ASSERT( otherfragment.nuclei.size() != fragment->nuclei.size() );
CPPUNIT_ASSERT( otherfragment != *fragment );
//assign
otherfragment = *fragment;
// check for equality
CPPUNIT_ASSERT( otherfragment.nuclei.size() == fragment->nuclei.size() );
CPPUNIT_ASSERT( otherfragment == *fragment );
}
/** UnitTest for operator+=()
*/
void FragmentTest::operatorPlusEqual_NonOverlapping_Test()
{
{
// create non-overlapping set
Fragment::positions_t otherpositions;
Fragment::position_t otherpos(3, 2.);
otherpositions += otherpos;
otherpos[0] = 0.;
otherpositions += otherpos;
otherpos[1] = 0.;
otherpositions += otherpos;
Fragment::charges_t othercharges;
othercharges += 1., 2., 3.;
Fragment otherfragment(otherpositions, othercharges);
const size_t othersize = otherfragment.nuclei.size();
const size_t size = fragment->nuclei.size();
*fragment += otherfragment;
CPPUNIT_ASSERT_EQUAL( othersize, otherfragment.nuclei.size() );
CPPUNIT_ASSERT_EQUAL( size+othersize, fragment->nuclei.size() );
{
// tests all for containment
Fragment::nuclei_t validnuclei(positions.size()+otherpositions.size());
Fragment::nuclei_t::iterator iter =
std::transform(positions.begin(), positions.end(),
charges.begin(), validnuclei.begin(), Fragment::createNucleus);
std::transform(otherpositions.begin(), otherpositions.end(),
othercharges.begin(), iter, Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
CPPUNIT_ASSERT( fragment->containsNuclei(nucleus) );
}
}
{
// tests positions for no containment in otherfragment
Fragment::nuclei_t invalidnuclei(positions.size());
std::transform(positions.begin(), positions.end(),
charges.begin(), invalidnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, invalidnuclei) {
CPPUNIT_ASSERT( !otherfragment.containsNuclei(nucleus) );
}
}
{
// tests otherpositions for containment in otherfragment
Fragment::nuclei_t validnuclei(otherpositions.size());
std::transform(otherpositions.begin(), otherpositions.end(),
othercharges.begin(), validnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
CPPUNIT_ASSERT( otherfragment.containsNuclei(nucleus) );
}
}
}
}
/** UnitTest for operator+=()
*/
void FragmentTest::operatorPlusEqual_Test()
{
{
// create overlapping set (first overlaps)
Fragment::positions_t otherpositions;
Fragment::position_t otherpos(3, 1.);
otherpositions += otherpos;
otherpos[0] = 2.;
otherpositions += otherpos;
otherpos[1] = 2.;
otherpositions += otherpos;
Fragment::charges_t othercharges;
othercharges += 1., 2., 3.;
Fragment otherfragment(otherpositions, othercharges);
const size_t othersize = otherfragment.nuclei.size();
const size_t size = fragment->nuclei.size();
*fragment += otherfragment;
CPPUNIT_ASSERT_EQUAL( othersize, otherfragment.nuclei.size() );
CPPUNIT_ASSERT_EQUAL( size+othersize-1, fragment->nuclei.size() ); // one for already present
{
// tests all for containment
Fragment::nuclei_t validnuclei(positions.size()+otherpositions.size());
Fragment::nuclei_t::iterator iter =
std::transform(positions.begin(), positions.end(),
charges.begin(), validnuclei.begin(), Fragment::createNucleus);
std::transform(otherpositions.begin(), otherpositions.end(),
othercharges.begin(), iter, Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
CPPUNIT_ASSERT( fragment->containsNuclei(nucleus) );
}
}
{
// tests positions for no containment in otherfragment (but last)
Fragment::nuclei_t invalidnuclei(positions.size()-1);
std::transform(positions.begin(), --positions.end(),
charges.begin(), invalidnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, invalidnuclei) {
CPPUNIT_ASSERT( !otherfragment.containsNuclei(nucleus) );
}
}
{
// tests otherpositions for containment in otherfragment
Fragment::nuclei_t validnuclei(otherpositions.size());
std::transform(otherpositions.begin(), otherpositions.end(),
othercharges.begin(), validnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
CPPUNIT_ASSERT( otherfragment.containsNuclei(nucleus) );
}
}
}
}
/** UnitTest for operator-=()
*/
void FragmentTest::operatorMinusEqual_NonOverlapping_Test()
{
{
// create non-overlapping set
Fragment::positions_t otherpositions;
Fragment::position_t otherpos(3, 2.);
otherpositions += otherpos;
otherpos[0] = 0.;
otherpositions += otherpos;
otherpos[1] = 0.;
otherpositions += otherpos;
Fragment::charges_t othercharges;
othercharges += 1., 2., 3.;
Fragment otherfragment(otherpositions, othercharges);
const size_t othersize = otherfragment.nuclei.size();
const size_t size = fragment->nuclei.size();
*fragment -= otherfragment;
CPPUNIT_ASSERT_EQUAL( othersize, otherfragment.nuclei.size() );
CPPUNIT_ASSERT_EQUAL( size, fragment->nuclei.size() );
{
// tests positions for containment
Fragment::nuclei_t validnuclei(positions.size());
std::transform(positions.begin(), positions.end(),
charges.begin(), validnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
CPPUNIT_ASSERT( fragment->containsNuclei(nucleus) );
}
}
{
// tests otherpositions for no containment
Fragment::nuclei_t invalidnuclei(otherpositions.size());
std::transform(otherpositions.begin(), otherpositions.end(),
othercharges.begin(), invalidnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, invalidnuclei) {
CPPUNIT_ASSERT( !fragment->containsNuclei(nucleus) );
}
}
{
// tests positions for no containment in otherfragment
Fragment::nuclei_t invalidnuclei(positions.size());
std::transform(positions.begin(), positions.end(),
charges.begin(), invalidnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, invalidnuclei) {
CPPUNIT_ASSERT( !otherfragment.containsNuclei(nucleus) );
}
}
{
// tests otherpositions for containment in otherfragment
Fragment::nuclei_t validnuclei(otherpositions.size());
std::transform(otherpositions.begin(), otherpositions.end(),
othercharges.begin(), validnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
CPPUNIT_ASSERT( otherfragment.containsNuclei(nucleus) );
}
}
}
}
/** UnitTest for operator-=()
*/
void FragmentTest::operatorMinusEqual_Test()
{
{
// create overlapping set (first overlaps although with different charge)
Fragment::positions_t otherpositions;
Fragment::position_t otherpos(3, 1.);
otherpositions += otherpos;
otherpos[0] = 2.;
otherpositions += otherpos;
otherpos[1] = 2.;
otherpositions += otherpos;
Fragment::charges_t othercharges;
othercharges += 1., 2., 3.;
Fragment otherfragment(otherpositions, othercharges);
const size_t othersize = otherfragment.nuclei.size();
const size_t size = fragment->nuclei.size();
CPPUNIT_ASSERT( Fragment::isPositionEqual(otherpositions[0],positions[3]) );
*fragment -= otherfragment;
CPPUNIT_ASSERT_EQUAL( othersize, otherfragment.nuclei.size() );
CPPUNIT_ASSERT_EQUAL( size-1, fragment->nuclei.size() ); // just one overlaps
{
// tests all but last for containment
Fragment::nuclei_t validnuclei(positions.size());
std::transform(positions.begin(), positions.end(),
charges.begin(), validnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
if (Fragment::isPositionEqual(nucleus.first, otherpositions[0])) // only test position
CPPUNIT_ASSERT( !fragment->containsNuclei(nucleus) );
else
CPPUNIT_ASSERT( fragment->containsNuclei(nucleus) );
}
}
{
// tests positions for no containment in otherfragment
Fragment::nuclei_t invalidnuclei(positions.size()-1);
std::transform(positions.begin(), --positions.end(),
charges.begin(), invalidnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, invalidnuclei) {
CPPUNIT_ASSERT( !otherfragment.containsNuclei(nucleus) );
}
}
{
// tests otherpositions for containment in otherfragment
Fragment::nuclei_t validnuclei(otherpositions.size());
std::transform(otherpositions.begin(), otherpositions.end(),
othercharges.begin(), validnuclei.begin(), Fragment::createNucleus);
BOOST_FOREACH( Fragment::nucleus_t nucleus, validnuclei) {
CPPUNIT_ASSERT( otherfragment.containsNuclei(nucleus) );
}
}
}
}