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