/*
* Project: MoleCuilder
* Description: creates and alters molecular systems
* Copyright (C) 2010-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 .
*/
/*
* LinkedCellUnitTest.cpp
*
* Created on: Apr 9, 2010
* Author: heber
*/
// include config.h
#ifdef HAVE_CONFIG_H
#include
#endif
using namespace std;
#include
#include
#include
#include
#include
#include
#include "Atom/atom.hpp"
#include "CodePatterns/Assert.hpp"
#include "Descriptors/MoleculeDescriptor.hpp"
#include "Element/element.hpp"
#include "Element/periodentafel.hpp"
#include "LinkedCell/linkedcell.hpp"
#include "LinkedCell/PointCloudAdaptor.hpp"
#include "molecule.hpp"
#include "World.hpp"
#include "linkedcellUnitTest.hpp"
#ifdef HAVE_TESTRUNNER
#include "UnitTestMain.hpp"
#endif /*HAVE_TESTRUNNER*/
/********************************************** Test classes **************************************/
// Registers the fixture into the 'registry'
CPPUNIT_TEST_SUITE_REGISTRATION( linkedcelltest );
void linkedcelltest::setUp()
{
// failing asserts should be thrown
ASSERT_DO(Assert::Throw);
atom *Walker = NULL;
// construct element
hydrogen = World::getInstance().getPeriode()->FindElement(1);
CPPUNIT_ASSERT(hydrogen != NULL && "could not find element hydrogen");
// construct molecule (water molecule)
TestMolecule = World::getInstance().createMolecule();
CPPUNIT_ASSERT(TestMolecule != NULL && "could not create molecule");
for (double x=0.5;x<3;x+=1.)
for (double y=0.5;y<3;y+=1.)
for (double z=0.5;z<3;z+=1.) {
Walker = World::getInstance().createAtom();
CPPUNIT_ASSERT(Walker != NULL && "could not create atom");
Walker->setType(hydrogen);
Walker->setPosition(Vector(x, y, z ));
TestMolecule->AddAtom(Walker);
}
// construct linked cell
PointCloudAdaptor cloud(TestMolecule, TestMolecule->name);
LC = new LinkedCell_deprecated (cloud, 1.);
CPPUNIT_ASSERT(LC != NULL && "could not create LinkedCell");
// check that TestMolecule was correctly constructed
CPPUNIT_ASSERT_EQUAL( TestMolecule->getAtomCount(), 3*3*3 );
};
void linkedcelltest::tearDown()
{
delete(LC);
World::purgeInstance();
};
/** UnitTest for LinkedCell_deprecated::CheckBounds().
*/
void linkedcelltest::CheckBoundsTest()
{
// check for within bounds
LC->n[0] = LC->n[1] = LC->n[2] = 0;
CPPUNIT_ASSERT_EQUAL( true, LC->CheckBounds() );
LC->n[0] = LC->n[1] = LC->n[2] = 1;
CPPUNIT_ASSERT_EQUAL( true, LC->CheckBounds() );
LC->n[0] = LC->n[1] = LC->n[2] = 2;
CPPUNIT_ASSERT_EQUAL( true, LC->CheckBounds() );
// check for out of bounds
cout << "The following test is supposed to fail and produce an ERROR." << endl;
LC->n[0] = 404040;
CPPUNIT_ASSERT_EQUAL( false, LC->CheckBounds() );
cout << "The following test is supposed to fail and produce an ERROR." << endl;
LC->n[0] = 0;
LC->n[1] = 5000;
CPPUNIT_ASSERT_EQUAL( false, LC->CheckBounds() );
cout << "The following test is supposed to fail and produce an ERROR." << endl;
LC->n[1] = 0;
LC->n[2] = -70;
CPPUNIT_ASSERT_EQUAL( false, LC->CheckBounds() );
cout << "The following test is supposed to fail and produce an ERROR." << endl;
LC->n[0] = LC->n[1] = LC->n[2] = 3;
CPPUNIT_ASSERT_EQUAL( false, LC->CheckBounds() );
};
/** UnitTest for LinkedCell_deprecated::GetCurrentCell().
* Note that CheckBounds() is used and has to be tested already.
*/
void linkedcelltest::GetCurrentCellTest()
{
// within bounds
LC->n[0] = LC->n[1] = LC->n[2] = 0;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)&LC->LC[0 * 3*3 + 0 * 3 + 0], LC->GetCurrentCell() );
LC->n[0] = LC->n[1] = LC->n[2] = 1;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)&LC->LC[1 * 3*3 + 1 * 3 + 1], LC->GetCurrentCell() );
LC->n[0] = LC->n[1] = LC->n[2] = 2;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)&LC->LC[2 * 3*3 + 2 * 3 + 2], LC->GetCurrentCell() );
// out of bounds
LC->n[0] = LC->n[1] = LC->n[2] = 3;
cout << "The following test is supposed to fail and produce an ERROR." << endl;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)NULL, LC->GetCurrentCell() );
LC->n[0] = LC->n[1] = LC->n[2] = -1;
cout << "The following test is supposed to fail and produce an ERROR." << endl;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)NULL, LC->GetCurrentCell() );
};
/** UnitTest for LinkedCell_deprecated::GetRelativeToCurrentCell().
*/
void linkedcelltest::GetRelativeToCurrentCellTest()
{
int offset[3];
// offset to (0,0,0) always
offset[0] = offset[1] = offset[2] = 0;
LC->n[0] = LC->n[1] = LC->n[2] = 0;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)&LC->LC[0], LC->GetRelativeToCurrentCell(offset) );
offset[0] = offset[1] = offset[2] = -1;
LC->n[0] = LC->n[1] = LC->n[2] = 1;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)&LC->LC[0], LC->GetRelativeToCurrentCell(offset) );
offset[0] = offset[1] = offset[2] = -2;
LC->n[0] = LC->n[1] = LC->n[2] = 2;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)&LC->LC[0], LC->GetRelativeToCurrentCell(offset) );
// offset to (0,0,0) - 1.*(x/y/z) out of bounds
offset[0] = offset[1] = offset[2] = 0;
offset[0] = -1;
LC->n[0] = LC->n[1] = LC->n[2] = 0;
cout << "The following test is supposed to fail and produce an ERROR." << endl;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)NULL, LC->GetRelativeToCurrentCell(offset) );
offset[0] = offset[1] = offset[2] = 0;
offset[1] = -1;
LC->n[0] = LC->n[1] = LC->n[2] = 0;
cout << "The following test is supposed to fail and produce an ERROR." << endl;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)NULL, LC->GetRelativeToCurrentCell(offset) );
offset[0] = offset[1] = offset[2] = 0;
offset[2] = -1;
LC->n[0] = LC->n[1] = LC->n[2] = 0;
cout << "The following test is supposed to fail and produce an ERROR." << endl;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)NULL, LC->GetRelativeToCurrentCell(offset) );
// out of bounds
offset[0] = offset[1] = offset[2] = -5054932;
LC->n[0] = LC->n[1] = LC->n[2] = 1;
cout << "The following test is supposed to fail and produce an ERROR." << endl;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)NULL, LC->GetRelativeToCurrentCell(offset) );
offset[0] = offset[1] = offset[2] = 192345;
LC->n[0] = LC->n[1] = LC->n[2] = 1;
cout << "The following test is supposed to fail and produce an ERROR." << endl;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)NULL, LC->GetRelativeToCurrentCell(offset) );
// index is out of bounds, offset points within
offset[0] = offset[1] = offset[2] = -2;
LC->n[0] = LC->n[1] = LC->n[2] = 4;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)&LC->LC[2 * 3*3 + 2 * 3 + 2], LC->GetRelativeToCurrentCell(offset) );
// index is within bounds, offset points out
offset[0] = offset[1] = offset[2] = 2;
LC->n[0] = LC->n[1] = LC->n[2] = 2;
cout << "The following test is supposed to fail and produce an ERROR." << endl;
CPPUNIT_ASSERT_EQUAL( (const TesselPointSTLList*)NULL, LC->GetRelativeToCurrentCell(offset) );
};
/** UnitTest for LinkedCell_deprecated::SetIndexToNode().
*/
void linkedcelltest::SetIndexToNodeTest()
{
// check all atoms
for(molecule::iterator iter = TestMolecule->begin(); iter != TestMolecule->end();++iter){
CPPUNIT_ASSERT_EQUAL( true, LC->SetIndexToNode(*iter) );
}
// check internal vectors, returns false, because this atom is not in LC-list!
atom *newAtom = World::getInstance().createAtom();
newAtom->setName("test");
newAtom->setPosition(Vector(1,1,1));
CPPUNIT_ASSERT_EQUAL( false, LC->SetIndexToNode(newAtom) );
World::getInstance().destroyAtom(newAtom);
// check out of bounds vectors
newAtom = World::getInstance().createAtom();
newAtom->setName("test");
newAtom->setPosition(Vector(0,-1,0));
CPPUNIT_ASSERT_EQUAL( false, LC->SetIndexToNode(newAtom) );
World::getInstance().destroyAtom(newAtom);
};
/** UnitTest for LinkedCell_deprecated::SetIndexToVector().
*/
void linkedcelltest::SetIndexToVectorTest()
{
Vector tester;
// check center of each cell
for (double x=0.5;x<3;x+=1.)
for (double y=0.5;y<3;y+=1.)
for (double z=0.5;z<3;z+=1.) {
tester = Vector(x,y,z);
CPPUNIT_ASSERT_EQUAL( true, LC->SetIndexToVector(tester) );
}
// check corners of each cell
for (double x=1.;x<4;x+=1.)
for (double y=1.;y<4;y+=1.)
for (double z=1.;z<4;z+=1.) {
tester= Vector(x,y,z);
cout << "Tester is at " << tester << "." << endl;
CPPUNIT_ASSERT_EQUAL( true, LC->SetIndexToVector(tester) );
}
// check out of bounds
for (double x=0.5-1e-10;x<5;x+=3.1)
for (double y=0.5-1e-10;y<5;y+=3.1)
for (double z=0.5-1e-10;z<5;z+=3.1) {
tester = Vector(x,y,z);
cout << "The following test is supposed to fail and produce an ERROR." << endl;
CPPUNIT_ASSERT_EQUAL( false, LC->SetIndexToVector(tester) );
}
// check nonsense vectors
tester= Vector(-423598,3245978,29349);
cout << "The following test is supposed to fail and produce an ERROR." << endl;
CPPUNIT_ASSERT_EQUAL( false, LC->SetIndexToVector(tester) );
};
/** UnitTest for LinkedCell_deprecated::GetNeighbourBounds().
*/
void linkedcelltest::GetNeighbourBoundsTest()
{
Vector tester;
int lower[NDIM], upper[NDIM];
tester= Vector(0.5,0.5,0.5);
LC->SetIndexToVector(tester);
LC->GetNeighbourBounds(lower, upper);
for (int i=0;iSetIndexToVector(tester) );
ListOfPoints = LC->GetallNeighbours();
size = ListOfPoints->size();
CPPUNIT_ASSERT_EQUAL( (size_t)27, size );
for(molecule::iterator iter = TestMolecule->begin(); iter != TestMolecule->end(); ++iter){
ListOfPoints->remove((*iter));
size--;
CPPUNIT_ASSERT_EQUAL( size, ListOfPoints->size() );
}
CPPUNIT_ASSERT_EQUAL( (size_t)0, size );
CPPUNIT_ASSERT_EQUAL( (size_t)0, ListOfPoints->size() );
CPPUNIT_ASSERT_EQUAL( true, ListOfPoints->empty() );
delete(ListOfPoints);
// get all atoms in one corner
tester= Vector(0.5, 0.5, 0.5);
CPPUNIT_ASSERT_EQUAL ( true, LC->SetIndexToVector(tester) );
ListOfPoints = LC->GetallNeighbours();
size=ListOfPoints->size();
CPPUNIT_ASSERT_EQUAL( (size_t)8, size );
for(molecule::iterator iter = TestMolecule->begin(); iter != TestMolecule->end(); ++iter){
if (((*iter)->at(0) <2) && ((*iter)->at(1) <2) && ((*iter)->at(2) <2)) {
ListOfPoints->remove(*iter);
size--;
CPPUNIT_ASSERT_EQUAL( size, ListOfPoints->size() );
}
}
CPPUNIT_ASSERT_EQUAL( (size_t)0, size );
CPPUNIT_ASSERT_EQUAL( (size_t)0, ListOfPoints->size() );
CPPUNIT_ASSERT_EQUAL( true, ListOfPoints->empty() );
delete(ListOfPoints);
// get all atoms from one corner
tester = Vector(0.5, 0.5, 0.5);
CPPUNIT_ASSERT_EQUAL ( true, LC->SetIndexToVector(tester) );
ListOfPoints = LC->GetallNeighbours(3);
size=ListOfPoints->size();
CPPUNIT_ASSERT_EQUAL( (size_t)27, size );
for(molecule::iterator iter = TestMolecule->begin(); iter!=TestMolecule->end();++iter){
ListOfPoints->remove(*iter);
size--;
CPPUNIT_ASSERT_EQUAL( size, ListOfPoints->size() );
}
CPPUNIT_ASSERT_EQUAL( (size_t)0, size );
CPPUNIT_ASSERT_EQUAL( (size_t)0, ListOfPoints->size() );
CPPUNIT_ASSERT_EQUAL( true, ListOfPoints->empty() );
delete(ListOfPoints);
};
/** UnitTest for LinkedCell_deprecated::GetPointsInsideSphere().
*/
void linkedcelltest::GetPointsInsideSphereTest()
{
Vector tester;
TesselPointSTLList *ListOfPoints = NULL;
size_t size = 0;
// get all points around central arom with radius 1.
tester= Vector(1.5,1.5,1.5);
CPPUNIT_ASSERT_EQUAL ( true, LC->SetIndexToVector(tester) );
ListOfPoints = LC->GetPointsInsideSphere(1., &tester);
size = ListOfPoints->size();
CPPUNIT_ASSERT_EQUAL( (size_t)7, size );
for(molecule::iterator iter = TestMolecule->begin(); iter!=TestMolecule->end();++iter){
if (((*iter)->DistanceSquared(tester) - 1.) < MYEPSILON ) {
ListOfPoints->remove(*iter);
size--;
CPPUNIT_ASSERT_EQUAL( size, ListOfPoints->size() );
}
}
CPPUNIT_ASSERT_EQUAL( (size_t)0, size );
CPPUNIT_ASSERT_EQUAL( (size_t)0, ListOfPoints->size() );
CPPUNIT_ASSERT_EQUAL( true, ListOfPoints->empty() );
delete(ListOfPoints);
};