// // $Id: geometer_t.cpp,v 1.3 2001/06/14 21:04:17 hobbs Exp $ // // File: geometer_t.cpp // Purpose: // Created: 17-APR-2000 John Hobbs // // $Revision: 1.3 $ // // // Include files #include #include "identifiers/RCPID.hpp" #include "geometry_system/management/absGeometer.hpp" #include "geometry_system/management/absRcpGeometer.hpp" #include "geometry_system/management/RcpGeometerRegistry.hpp" #include "geometry_system/management/GeometryObserver.hpp" using namespace std; using namespace dgs; using namespace edm; // Global definitions -- Classes used only in testing class detType: public d0_Object { public: detType() {} D0_OBJECT_SETUP(detType) }; class testGeometer: public absGeometer { public: testGeometer(): d_ncalls(0) {} void refresh(d0_Ref newdet) { cout << "In testGeometer::refresh." << endl; d_ncalls += 1; } int call_count() const { return d_ncalls; } private: int d_ncalls; }; class testRcpGeometer: public absRcpGeometer { public: testRcpGeometer(): d_ncalls(0) {} int call_count() const { return d_ncalls; } private: bool refresh(const edm::RCP* anRCP) { d_ncalls +=1; return true; } int d_ncalls; }; int main() { int errcode=0; // Make a toy geometer and call its refresh method. Check its counter // to make sure the refresh was indeed called testGeometer *tg = new testGeometer(); const detType dt; d0_Ref ddt(&dt); tg->absRefresh(ddt); if( tg->call_count() != 1 ) errcode = 1; // Make two observers and hook them to the geometer. Call refresh again // and make sure that both geometryObservers got the word. GeometryObserver *o1=new GeometryObserver(tg), *o2=new GeometryObserver(tg); tg->absRefresh(ddt); if( tg->call_count() != 2 ) errcode |= 1; if( !o1->updated() ) { cout << "Failed to update first observer" << endl; errcode |= 2; } if( !o2->updated() ) { cout << "Failed to update second observer" << endl; errcode |= 2; } if( o1->updated() ) { cout << "Failed to auto reset update in first observer in GeometryObserver::update()" << endl; errcode |= 4; } // Delete one of the observers and call refresh. If all goes well, this // should not crash because the deleted observer has been removed fro the // list. Check that the remaining observer has indeed been called delete o2; o2 = 0; tg->absRefresh(ddt); if( tg->call_count() != 3 ) errcode |= 1; if( !o1->updated() ) { cout << "Failed to update first observer after delete" << endl; errcode |= 2; } // Now switch to testing RCP geometers. Here we want to see that the method // to get the list of known rcpid's is valid... testRcpGeometer a,*b=new testRcpGeometer(); if( a.absRefresh(0) ) { cout << "Updated when not expected" << endl; errcode |=8; } RcpGeometerRegistry* rgr = RcpGeometerRegistry::get_instance(); const map *rid = rgr->environment(); if( rid->size() != 2 ) { cout << "Initial size mismatch. Got " << rid->size() << ", expected 2." << endl; errcode |= 16; } map::const_iterator i = rid->begin(); if( (*i).first != b ) { cout << "Registration address mismatch. Got " << (*i).first << ", expected " << b << endl; errcode |= 32; } ++i; if( (*i).first != &a ) { cout << "Registration address mismatch. Got " << (*i).first << ", expected " << &a << endl; errcode |= 32; } delete b; b=0; if( rid->size() != 1 ) { cout << "Final size mismatch. Got " << rid->size() << ", expected 1." << endl; errcode |= 16; } return errcode; }