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