1 #include <libgeodecomp/storage/fixedarray.h>
2 #include <libgeodecomp/storage/grid.h>
3 #include <libgeodecomp/storage/neighborhooditerator.h>
4 #include <cxxtest/TestSuite.h>
5 
6 using namespace LibGeoDecomp;
7 
8 namespace LibGeoDecomp {
9 
10 class NeighborhoodIteratorTest : public CxxTest::TestSuite
11 {
12 public:
13     typedef FixedArray<double, 10> Container;
14 
setUp()15     void setUp()
16     {
17         grid = Grid<Container>(Coord<2>(10, 5));
18 
19         {
20             Container& c = grid[Coord<2>(0, 0)];
21             c << 1;
22         }
23 
24         {
25             Container& c = grid[Coord<2>(1, 0)];
26             c << 2
27               << 3;
28         }
29 
30         {
31             Container& c = grid[Coord<2>(2, 0)];
32             c << 4
33               << 5
34               << 6;
35         }
36 
37         {
38             Container& c = grid[Coord<2>(0, 1)];
39             c << 7
40               << 8
41               << 9
42               << 10;
43         }
44 
45         {
46             Container& c = grid[Coord<2>(1, 1)];
47             c << 11
48               << 12
49               << 13
50               << 14
51               << 15;
52         }
53 
54         {
55             Container& c = grid[Coord<2>(2, 1)];
56             c << 16
57               << 17
58               << 18
59               << 19
60               << 20
61               << 21;
62         }
63 
64         {
65             Container& c = grid[Coord<2>(0, 2)];
66             c << 22
67               << 23
68               << 24
69               << 25
70               << 26
71               << 27
72               << 28;
73         }
74 
75         {
76             Container& c = grid[Coord<2>(1, 2)];
77             c << 29
78               << 30
79               << 31
80               << 32
81               << 33
82               << 34
83               << 35
84               << 36;
85         }
86 
87         {
88             Container& c = grid[Coord<2>(2, 2)];
89             c << 37
90               << 38
91               << 39
92               << 40
93               << 41
94               << 42
95               << 43
96               << 44
97               << 45;
98         }
99 
100         TS_ASSERT_EQUALS(grid[Coord<2>(0, 0)].size(),  std::size_t(1));
101         TS_ASSERT_EQUALS(grid[Coord<2>(1, 0)].size(),  std::size_t(2));
102         TS_ASSERT_EQUALS(grid[Coord<2>(2, 0)].size(),  std::size_t(3));
103         TS_ASSERT_EQUALS(grid[Coord<2>(0, 1)].size(),  std::size_t(4));
104         TS_ASSERT_EQUALS(grid[Coord<2>(1, 1)].size(),  std::size_t(5));
105         TS_ASSERT_EQUALS(grid[Coord<2>(2, 1)].size(),  std::size_t(6));
106         TS_ASSERT_EQUALS(grid[Coord<2>(0, 2)].size(),  std::size_t(7));
107         TS_ASSERT_EQUALS(grid[Coord<2>(1, 2)].size(),  std::size_t(8));
108         TS_ASSERT_EQUALS(grid[Coord<2>(2, 2)].size(),  std::size_t(9));
109     }
110 
testBasic()111     void testBasic()
112     {
113         typedef CoordMap<Container, Grid<Container> > Neighborhood;
114         typedef NeighborhoodIterator<Neighborhood, 2> HoodIterator;
115 
116         Neighborhood hood = grid.getNeighborhood(Coord<2>(1, 1));
117         HoodIterator begin = HoodIterator::begin(hood);
118         HoodIterator end = HoodIterator::end(hood);
119         HoodIterator iter = begin;
120         TS_ASSERT_DIFFERS(iter, end);
121 
122         // cell -1, -1
123         TS_ASSERT_EQUALS(*iter.boxIterator, Coord<2>(-1, -1));
124         TS_ASSERT_EQUALS(*iter, 1);
125 
126         // cell  0, -1
127         ++iter;
128         TS_ASSERT_EQUALS(*iter.boxIterator, Coord<2>( 0, -1));
129         TS_ASSERT_EQUALS(*iter, 2);
130         ++iter;
131         TS_ASSERT_EQUALS(*iter.boxIterator, Coord<2>( 0, -1));
132 
133         // cell  1, -1
134         ++iter;
135         TS_ASSERT_EQUALS(*iter.boxIterator, Coord<2>( 1, -1));
136         TS_ASSERT_EQUALS(*iter, 4);
137         ++iter;
138         TS_ASSERT_EQUALS(*iter, 5);
139         ++iter;
140         TS_ASSERT_EQUALS(*iter, 6);
141 
142         // cell -1,  0
143         ++iter;
144         TS_ASSERT_EQUALS(*iter.boxIterator, Coord<2>(-1,  0));
145         TS_ASSERT_EQUALS(*iter, 7);
146         ++iter;
147         TS_ASSERT_EQUALS(*iter, 8);
148         ++iter;
149         TS_ASSERT_EQUALS(*iter, 9);
150         ++iter;
151         TS_ASSERT_EQUALS(*iter, 10);
152 
153         // cell  0,  0
154         ++iter;
155         TS_ASSERT_EQUALS(*iter.boxIterator, Coord<2>( 0,  0));
156         TS_ASSERT_EQUALS(*iter, 11);
157         ++iter;
158         TS_ASSERT_EQUALS(*iter, 12);
159         ++iter;
160         TS_ASSERT_EQUALS(*iter, 13);
161         ++iter;
162         TS_ASSERT_EQUALS(*iter, 14);
163         ++iter;
164         TS_ASSERT_EQUALS(*iter, 15);
165 
166         // cell  1,  0
167         ++iter;
168         TS_ASSERT_EQUALS(*iter.boxIterator, Coord<2>( 1,  0));
169         TS_ASSERT_EQUALS(*iter, 16);
170         ++iter;
171         TS_ASSERT_EQUALS(*iter, 17);
172         ++iter;
173         TS_ASSERT_EQUALS(*iter, 18);
174         ++iter;
175         TS_ASSERT_EQUALS(*iter, 19);
176         ++iter;
177         TS_ASSERT_EQUALS(*iter, 20);
178         ++iter;
179         TS_ASSERT_EQUALS(*iter, 21);
180 
181         // cell  -1,  1
182         ++iter;
183         TS_ASSERT_EQUALS(*iter.boxIterator, Coord<2>(-1,  1));
184         TS_ASSERT_EQUALS(*iter, 22);
185         ++iter;
186         TS_ASSERT_EQUALS(*iter, 23);
187         ++iter;
188         TS_ASSERT_EQUALS(*iter, 24);
189         ++iter;
190         TS_ASSERT_EQUALS(*iter, 25);
191         ++iter;
192         TS_ASSERT_EQUALS(*iter, 26);
193         ++iter;
194         TS_ASSERT_EQUALS(*iter, 27);
195         ++iter;
196         TS_ASSERT_EQUALS(*iter, 28);
197 
198         // cell  0,  1
199         ++iter;
200         TS_ASSERT_EQUALS(*iter.boxIterator, Coord<2>( 0,  1));
201         TS_ASSERT_EQUALS(*iter, 29);
202         ++iter;
203         TS_ASSERT_EQUALS(*iter, 30);
204         ++iter;
205         TS_ASSERT_EQUALS(*iter, 31);
206         ++iter;
207         TS_ASSERT_EQUALS(*iter, 32);
208         ++iter;
209         TS_ASSERT_EQUALS(*iter, 33);
210         ++iter;
211         TS_ASSERT_EQUALS(*iter, 34);
212         ++iter;
213         TS_ASSERT_EQUALS(*iter, 35);
214         ++iter;
215         TS_ASSERT_EQUALS(*iter, 36);
216 
217         // cell  1,  1
218         ++iter;
219         TS_ASSERT_EQUALS(*iter.boxIterator, Coord<2>( 1,  1));
220         TS_ASSERT_EQUALS(*iter, 37);
221         ++iter;
222         TS_ASSERT_EQUALS(*iter, 38);
223         ++iter;
224         TS_ASSERT_EQUALS(*iter, 39);
225         ++iter;
226         TS_ASSERT_EQUALS(*iter, 40);
227         ++iter;
228         TS_ASSERT_EQUALS(*iter, 41);
229         ++iter;
230         TS_ASSERT_EQUALS(*iter, 42);
231         ++iter;
232         TS_ASSERT_EQUALS(*iter, 43);
233         ++iter;
234         TS_ASSERT_EQUALS(*iter, 44);
235         ++iter;
236         TS_ASSERT_EQUALS(*iter, 45);
237 
238         ++iter;
239         TS_ASSERT_EQUALS(iter, end);
240     }
241 
testSkippingOfEmptyCells()242     void testSkippingOfEmptyCells()
243     {
244         typedef CoordMap<Container, Grid<Container> > Neighborhood;
245         typedef NeighborhoodIterator<Neighborhood, 2> HoodIterator;
246 
247         grid[Coord<2>(0, 0)].clear();
248         grid[Coord<2>(0, 1)].clear();
249 
250         Neighborhood hood = grid.getNeighborhood(Coord<2>(1, 1));
251         HoodIterator begin = HoodIterator::begin(hood);
252         HoodIterator iter = begin;
253 
254         // skipping one value from (0, 0)
255 
256         TS_ASSERT_EQUALS(*iter, 2);
257         ++iter;
258         TS_ASSERT_EQUALS(*iter, 3);
259 
260         ++iter;
261         TS_ASSERT_EQUALS(*iter, 4);
262         ++iter;
263         TS_ASSERT_EQUALS(*iter, 5);
264         ++iter;
265         TS_ASSERT_EQUALS(*iter, 6);
266 
267         // skipping four values from (0, 1)
268 
269         ++iter;
270         TS_ASSERT_EQUALS(*iter, 11);
271         ++iter;
272         TS_ASSERT_EQUALS(*iter, 12);
273         ++iter;
274         TS_ASSERT_EQUALS(*iter, 13);
275         ++iter;
276         TS_ASSERT_EQUALS(*iter, 14);
277         ++iter;
278         TS_ASSERT_EQUALS(*iter, 15);
279     }
280 
testSkippingOfAllEmptyCells()281     void testSkippingOfAllEmptyCells()
282     {
283         typedef CoordMap<Container, Grid<Container> > Neighborhood;
284         typedef NeighborhoodIterator<Neighborhood, 2> HoodIterator;
285 
286         grid[Coord<2>(0, 0)].clear();
287         grid[Coord<2>(1, 0)].clear();
288         grid[Coord<2>(2, 0)].clear();
289         grid[Coord<2>(0, 1)].clear();
290         grid[Coord<2>(1, 1)].clear();
291         grid[Coord<2>(2, 1)].clear();
292         grid[Coord<2>(0, 2)].clear();
293         grid[Coord<2>(1, 2)].clear();
294         grid[Coord<2>(2, 2)].clear();
295 
296 
297         Neighborhood hood = grid.getNeighborhood(Coord<2>(1, 1));
298 
299         HoodIterator begin = HoodIterator::begin(hood);
300         HoodIterator end = HoodIterator::end(hood);
301 
302         TS_ASSERT_EQUALS(begin, end);
303     }
304 
305 private:
306     Grid<Container> grid;
307 };
308 
309 }
310