This repository has been archived on 2020-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
Files
Indoor/tests/grid/TestGrid.cpp
kazu cdf97322f8 added new data-structures
added new test-cases
added flexible dijkstra calculation
added debugging log
modified: plotting, grid-generation, grid-importance,
refactoring
2016-01-22 18:47:06 +01:00

236 lines
5.3 KiB
C++
Executable File

#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<20, GP> grid;
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<20, GP> grid;
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<1, GP> grid;
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<1, GP> grid;
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<20, GP> grid;
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<1, GP> grid;
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<1, GP> grid;
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)) {++i;}
ASSERT_EQ(4, i);
}
TEST(Grid, bbox) {
Grid<1, GP> grid;
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<20, GP> grid;
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