#ifdef WITH_TESTS #include "Plot.h" #include "../Tests.h" #include "../../grid/Grid.h" #include "../../grid/GridPoint.h" #include "../../grid/GridNode.h" TEST(Grid, add) { Grid grid(20); ASSERT_EQ(0, grid.add(GP())); ASSERT_EQ(1, grid.add(GP())); ASSERT_EQ(2, grid.add(GP())); ASSERT_EQ(3, grid.add(GP())); // not aligned? -> error ASSERT_THROW(grid.add(GP(10,10,10)), std::exception); ASSERT_THROW(grid.add(GP(10,20,20)), std::exception); ASSERT_THROW(grid.add(GP(20,10,20)), std::exception); ASSERT_THROW(grid.add(GP(20,20,10)), std::exception); ASSERT_EQ(4, grid.add(GP(20,20,20))); // access ASSERT_EQ(GP(20,20,20), grid[4]); } TEST(Grid, BBox) { Grid grid(20); int idx = grid.add(GP(40,40,40)); ASSERT_EQ(30, grid.getBBox(idx).getMin().x); ASSERT_EQ(50, grid.getBBox(idx).getMax().x); ASSERT_EQ(30, grid.getBBox(idx).getMin().y); ASSERT_EQ(50, grid.getBBox(idx).getMax().y); } TEST(Grid, connectBiDir) { Grid grid(1); int idx1 = grid.add(GP( 0, 0, 0)); int idx2 = grid.add(GP( 0, 1, 0)); int idx3 = grid.add(GP( 0,-1, 0)); int idx4 = grid.add(GP( 1, 0, 0)); int idx5 = grid.add(GP(-1, 0, 0)); grid.connectBiDir(idx1, idx2); grid.connectBiDir(idx1, idx3); grid.connectBiDir(idx1, idx4); grid.connectBiDir(idx1, idx5); ASSERT_EQ(4, grid.getNumNeighbors(idx1)); ASSERT_EQ(1, grid.getNumNeighbors(idx2)); ASSERT_EQ(1, grid.getNumNeighbors(idx3)); ASSERT_EQ(1, grid.getNumNeighbors(idx4)); ASSERT_EQ(1, grid.getNumNeighbors(idx5)); ASSERT_EQ(grid[idx2], grid.getNeighbor(idx1, 0)); ASSERT_EQ(grid[idx3], grid.getNeighbor(idx1, 1)); ASSERT_EQ(grid[idx4], grid.getNeighbor(idx1, 2)); ASSERT_EQ(grid[idx5], grid.getNeighbor(idx1, 3)); } TEST(Grid, disconnectBiDir) { Grid grid(1); int idx1 = grid.add(GP( 0, 0, 0)); int idx2 = grid.add(GP( 0, 1, 0)); int idx3 = grid.add(GP( 0,-1, 0)); int idx4 = grid.add(GP( 1, 0, 0)); int idx5 = grid.add(GP(-1, 0, 0)); grid.connectBiDir(idx1, idx2); grid.connectBiDir(idx1, idx3); grid.connectBiDir(idx1, idx4); grid.connectBiDir(idx1, idx5); // remove 1 <-> 4 grid.disconnectBiDir(idx1, idx4); ASSERT_EQ(3, grid.getNumNeighbors(idx1)); ASSERT_EQ(0, grid.getNumNeighbors(idx4)); ASSERT_EQ(grid[idx2], grid.getNeighbor(idx1, 0)); ASSERT_EQ(grid[idx3], grid.getNeighbor(idx1, 1)); ASSERT_EQ(grid[idx5], grid.getNeighbor(idx1, 2)); // remove 1 <-> 5 grid.disconnectBiDir(idx1, idx5); ASSERT_EQ(2, grid.getNumNeighbors(idx1)); ASSERT_EQ(0, grid.getNumNeighbors(idx5)); ASSERT_EQ(grid[idx2], grid.getNeighbor(idx1, 0)); ASSERT_EQ(grid[idx3], grid.getNeighbor(idx1, 1)); // remove 1 <-> 2 grid.disconnectBiDir(idx1, idx2); ASSERT_EQ(1, grid.getNumNeighbors(idx1)); ASSERT_EQ(0, grid.getNumNeighbors(idx2)); ASSERT_EQ(grid[idx3], grid.getNeighbor(idx1, 0)); // remove 1 <-> 2 grid.disconnectBiDir(idx1, idx3); ASSERT_EQ(0, grid.getNumNeighbors(idx1)); ASSERT_EQ(0, grid.getNumNeighbors(idx3)); } TEST(Grid, uid) { Grid grid(20); GP gp(20,40,60); uint64_t uid = grid.getUID(gp); const int mask = (1 << 20) - 1; // 20-bit mask ASSERT_EQ(3, uid >> 40 & mask); // x ASSERT_EQ(2, uid >> 20 & mask); // y ASSERT_EQ(1, uid >> 0 & mask); // z } TEST(Grid, remove) { Grid grid(1); GP gp1( 0, 0, 0); GP gp2( 0, 1, 0); GP gp3( 0,-1, 0); GP gp4( 1, 0, 0); GP gp5(-1, 0, 0); int idx1 = grid.add(gp1); int idx2 = grid.add(gp2); int idx3 = grid.add(gp3); int idx4 = grid.add(gp4); int idx5 = grid.add(gp5); grid.connectBiDir(idx1, idx2); grid.connectBiDir(idx1, idx3); grid.connectBiDir(idx1, idx4); grid.connectBiDir(idx1, idx5); grid.remove(idx1); grid.cleanup(); ASSERT_EQ(4, grid.getNumNodes()); ASSERT_EQ(gp2, grid[0]); ASSERT_EQ(gp3, grid[1]); ASSERT_EQ(gp4, grid[2]); ASSERT_EQ(gp5, grid[3]); ASSERT_EQ(0, grid.getNumNeighbors(grid[0])); ASSERT_EQ(0, grid.getNumNeighbors(grid[1])); ASSERT_EQ(0, grid.getNumNeighbors(grid[2])); ASSERT_EQ(0, grid.getNumNeighbors(grid[3])); } TEST(Grid, neighborIter) { Grid grid(1); int idx1 = grid.add(GP( 0, 0, 0)); int idx2 = grid.add(GP( 0, 1, 0)); int idx3 = grid.add(GP( 0,-1, 0)); int idx4 = grid.add(GP( 1, 0, 0)); int idx5 = grid.add(GP(-1, 0, 0)); grid.connectBiDir(idx1, idx2); grid.connectBiDir(idx1, idx3); grid.connectBiDir(idx1, idx4); grid.connectBiDir(idx1, idx5); int i = 0; for (GP& node : grid.neighbors(idx1)) { (void) node; ++i; } ASSERT_EQ(4, i); } TEST(Grid, bbox) { Grid grid(1); grid.add(GP( 0, 0, 0)); grid.add(GP( 0, 1, 0)); grid.add(GP( 0,-1, 0)); grid.add(GP( 1, 0, 0)); grid.add(GP(-1, 0, 0)); BBox3 bb = grid.getBBox(); ASSERT_EQ(bb.getMin().x, -1); ASSERT_EQ(bb.getMin().y, -1); ASSERT_EQ(bb.getMin().z, 0); ASSERT_EQ(bb.getMax().x, +1); ASSERT_EQ(bb.getMax().y, +1); ASSERT_EQ(bb.getMax().z, 0); } TEST(Grid, nearest) { Grid grid(20); GP c1(20,20,20); GP c2(40,40,40); grid.add(c1); grid.add(c2); ASSERT_EQ(c1, grid.getNodeFor(GP(15,20,20))); ASSERT_EQ(c1, grid.getNodeFor(GP(20,15,20))); ASSERT_EQ(c1, grid.getNodeFor(GP(20,20,15))); ASSERT_EQ(c1, grid.getNodeFor(GP(25,20,20))); ASSERT_EQ(c1, grid.getNodeFor(GP(20,25,20))); ASSERT_EQ(c1, grid.getNodeFor(GP(20,20,25))); ASSERT_EQ(c2, grid.getNodeFor(GP(35,40,40))); ASSERT_EQ(c2, grid.getNodeFor(GP(40,35,40))); ASSERT_EQ(c2, grid.getNodeFor(GP(40,40,35))); ASSERT_EQ(c2, grid.getNodeFor(GP(45,40,40))); ASSERT_EQ(c2, grid.getNodeFor(GP(40,45,40))); ASSERT_EQ(c2, grid.getNodeFor(GP(40,40,45))); } #endif