1 #include <cxxtest/TestSuite.h> 2 3 #include <libgeodecomp/io/simpleinitializer.h> 4 #include <libgeodecomp/io/steerer.h> 5 #include <libgeodecomp/io/testinitializer.h> 6 #include <libgeodecomp/misc/testcell.h> 7 #include <libgeodecomp/parallelization/serialsimulator.h> 8 9 #include <boost/shared_ptr.hpp> 10 11 using namespace LibGeoDecomp; 12 13 namespace LibGeoDecomp { 14 15 class MyTestCell 16 { 17 public: 18 class API : public APITraits::HasStaticData<int> 19 {}; 20 21 static int staticData; 22 23 template<typename NEIGHBORHOOD> update(NEIGHBORHOOD hood,unsigned nanoStep)24 void update(NEIGHBORHOOD hood, unsigned nanoStep) 25 { 26 // NOP 27 } 28 }; 29 30 int MyTestCell::staticData = 0; 31 32 class MyStaticDataModifyingSteerer : public Steerer<MyTestCell> 33 { 34 public: MyStaticDataModifyingSteerer()35 MyStaticDataModifyingSteerer() : 36 Steerer<MyTestCell>(1), 37 counter(666) 38 {} 39 nextStep(GridType * grid,const Region<Topology::DIM> & validRegion,const CoordType & globalDimensions,unsigned step,SteererEvent event,std::size_t rank,bool lastCall,SteererFeedback * feedback)40 virtual void nextStep( 41 GridType *grid, 42 const Region<Topology::DIM>& validRegion, 43 const CoordType& globalDimensions, 44 unsigned step, 45 SteererEvent event, 46 std::size_t rank, 47 bool lastCall, 48 SteererFeedback *feedback) 49 { 50 feedback->setStaticData(counter++); 51 } 52 53 private: 54 int counter; 55 }; 56 57 class MyInitializer : public SimpleInitializer<MyTestCell> 58 { 59 public: MyInitializer(Coord<2> dim,unsigned maxSteps)60 MyInitializer(Coord<2> dim, unsigned maxSteps) : 61 SimpleInitializer<MyTestCell>(dim, maxSteps) 62 {} 63 grid(GridBase<MyTestCell,2> * target)64 virtual void grid(GridBase<MyTestCell, 2> *target) 65 {} 66 }; 67 68 class SteererTest : public CxxTest::TestSuite 69 { 70 public: 71 typedef MyStaticDataModifyingSteerer SteererType; 72 setUp()73 void setUp() 74 { 75 simulator.reset( 76 new SerialSimulator<MyTestCell>( 77 new MyInitializer( 78 Coord<2>(10, 20), 79 34))); 80 simulator->addSteerer(new SteererType()); 81 } 82 tearDown()83 void tearDown() 84 { 85 simulator.reset(); 86 } 87 testStaticDataModification()88 void testStaticDataModification() 89 { 90 TS_ASSERT_EQUALS(0, MyTestCell::staticData); 91 simulator->run(); 92 // initial value + 34 steps + finsh: 93 TS_ASSERT_EQUALS(666 + 34 + 1, MyTestCell::staticData); 94 } 95 96 private: 97 boost::shared_ptr<SerialSimulator<MyTestCell> > simulator; 98 }; 99 100 } 101