/*
* 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 .
*/
/*
* manipulateAtomsTest.cpp
*
* Created on: Feb 18, 2010
* Author: crueger
*/
// include config.h
#ifdef HAVE_CONFIG_H
#include
#endif
#include
#include
#include
#include
#include
#include "Descriptors/AtomDescriptor.hpp"
#include "Descriptors/AtomIdDescriptor.hpp"
#include "Actions/ManipulateAtomsProcess.hpp"
#include "Actions/ActionQueue.hpp"
#include "World.hpp"
#include "Atom/atom.hpp"
#include "stubs/DummyUI.hpp"
#include "ManipulateAtomsUnitTest.hpp"
using namespace MoleCuilder;
#ifdef HAVE_TESTRUNNER
#include "UnitTestMain.hpp"
#endif /*HAVE_TESTRUNNER*/
// Registers the fixture into the 'registry'
CPPUNIT_TEST_SUITE_REGISTRATION( manipulateAtomsTest );
// some stubs
class AtomStub : public atom {
public:
AtomStub(int _id) :
atom(),
manipulated(false),
id(_id)
{}
virtual atomId_t getId(){
return id;
}
virtual void doSomething(){
manipulated = true;
}
bool manipulated;
private:
atomId_t id;
};
class countObserver : public Observer{
public:
countObserver() :
Observer("countObserver"),
count(0)
{}
virtual ~countObserver(){}
void update(Observable *){
count++;
}
void subjectKilled(Observable *)
{}
int count;
};
// set up and tear down
void manipulateAtomsTest::setUp(){
hasDescriptor = false;
World::getInstance();
// setup ActionHistory
ActionQueue::getInstance();
// TODO: find a way to really reset the factory to a clean state in tear-down
if(!hasDescriptor){
UIFactory::registerFactory(new DummyUIFactory::description());
hasDescriptor = true;
}
UIFactory::makeUserInterface("Dummy");
for(int i=0;i(_atom);
CPPUNIT_ASSERT(atom);
atom->doSomething();
}
void manipulateAtomsTest::testManipulateSimple(){
ManipulateAtomsProcess *proc = World::getInstance().manipulateAtoms(boost::bind(operation,_1),"FOO",AllAtoms());
proc->call();
std::vector allAtoms = World::getInstance().getAllAtoms(AllAtoms());
std::vector::iterator iter;
for(iter=allAtoms.begin();iter!=allAtoms.end();++iter){
AtomStub *atom;
atom = dynamic_cast(*iter);
CPPUNIT_ASSERT(atom);
CPPUNIT_ASSERT(atom->manipulated);
}
}
void manipulateAtomsTest::testManipulateExcluded(){
ManipulateAtomsProcess *proc = World::getInstance().manipulateAtoms(boost::bind(operation,_1),"FOO",AllAtoms() && !AtomById(ATOM_COUNT/2));
proc->call();
std::vector allAtoms = World::getInstance().getAllAtoms(AllAtoms());
std::vector::iterator iter;
for(iter=allAtoms.begin();iter!=allAtoms.end();++iter){
AtomStub *atom;
atom = dynamic_cast(*iter);
CPPUNIT_ASSERT(atom);
if(atom->getId()!=(int)ATOM_COUNT/2)
CPPUNIT_ASSERT(atom->manipulated);
else
CPPUNIT_ASSERT(!atom->manipulated);
}
}
void manipulateAtomsTest::testObserver(){
countObserver *obs = new countObserver();
World::getInstance().signOn(obs);
ManipulateAtomsProcess *proc = World::getInstance().manipulateAtoms(boost::bind(operation,_1),"FOO",AllAtoms());
proc->call();
CPPUNIT_ASSERT_EQUAL(1,obs->count);
World::getInstance().signOff(obs);
delete obs;
}