/*
* 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 .
*/
/*
* AtomsCalculationUnitTest.cpp
*
* Created on: Feb 19, 2010
* Author: crueger
*/
// include config.h
#ifdef HAVE_CONFIG_H
#include
#endif
#include "AtomsCalculationUnitTest.hpp"
#include
#include
#include
#include
#include
#include "Descriptors/AtomDescriptor.hpp"
#include "Descriptors/AtomIdDescriptor.hpp"
#include "Actions/AtomsCalculation.hpp"
#include "Actions/AtomsCalculation_impl.hpp"
#include "Actions/ActionQueue.hpp"
#include "Actions/ActionTrait.hpp"
#include "World.hpp"
#include "World_calculations.hpp"
#include "Atom/atom.hpp"
using namespace MoleCuilder;
#ifdef HAVE_TESTRUNNER
#include "UnitTestMain.hpp"
#endif /*HAVE_TESTRUNNER*/
// Registers the fixture into the 'registry'
CPPUNIT_TEST_SUITE_REGISTRATION( AtomsCalculationTest );
// set up and tear down
void AtomsCalculationTest::setUp(){
World::getInstance();
for(int i=0;igetId();
}
}
void AtomsCalculationTest::tearDown(){
World::purgeInstance();
ActionQueue::purgeInstance();
}
// some helper functions
static bool hasAllIds(std::vector atoms,atomId_t ids[ATOM_COUNT], std::set excluded = std::set()){
for(int i=0;i::iterator iter;
bool res=false;
for(iter=atoms.begin();iter!=atoms.end();++iter){
res |= (*iter) == id;
}
if(!res) {
cout << "Atom " << id << " missing in returned list" << endl;
return false;
}
}
}
return true;
}
static bool hasNoDuplicates(std::vector ids){
std::set found;
std::vector::iterator iter;
for(iter=ids.begin();iter!=ids.end();++iter){
int id = (*iter);
if(found.count(id))
return false;
found.insert(id);
}
return true;
}
void AtomsCalculationTest::testCalculateSimple(){
ActionTrait FooTrait("FOO");
AtomsCalculation *calc = World::getInstance().calcOnAtoms(boost::bind(&atom::getId,_1),FooTrait,AllAtoms());
std::vector allIds = (*calc)();
CPPUNIT_ASSERT(hasAllIds(allIds,atomIds));
CPPUNIT_ASSERT(hasNoDuplicates(allIds));
}
void AtomsCalculationTest::testCalculateExcluded(){
ActionTrait FooTrait("FOO");
atomId_t excluded = atomIds[ATOM_COUNT/2];
AtomsCalculation *calc = World::getInstance().calcOnAtoms(boost::bind(&atom::getId,_1),FooTrait,AllAtoms() && !AtomById(excluded));
std::vector allIds = (*calc)();
std::set excluded_set;
excluded_set.insert(excluded);
CPPUNIT_ASSERT(hasAllIds(allIds,atomIds,excluded_set));
CPPUNIT_ASSERT(hasNoDuplicates(allIds));
CPPUNIT_ASSERT_EQUAL((size_t)(ATOM_COUNT-1),allIds.size());
}