Iterators are now working far more reliably and have more extensive tests that randomize inputs and fuzz them to check they keep working.
This commit is contained in:
parent
8e470df554
commit
70cd963e5c
11 changed files with 318 additions and 84 deletions
101
tests/matrix.cpp
101
tests/matrix.cpp
|
@ -3,6 +3,7 @@
|
|||
#include <string>
|
||||
#include "config.hpp"
|
||||
#include "matrix.hpp"
|
||||
#include "rand.hpp"
|
||||
#include "components.hpp"
|
||||
#include <nlohmann/json.hpp>
|
||||
#include <fstream>
|
||||
|
@ -19,34 +20,104 @@ TEST_CASE("basic matrix iterator", "[matrix]") {
|
|||
|
||||
Matrix walls = test["walls"];
|
||||
|
||||
matrix::dump("ITERATOR DUMP", walls);
|
||||
|
||||
println("VS matrix::each_row ------");
|
||||
|
||||
for(matrix::each_row it{walls}; it.next();) {
|
||||
REQUIRE(walls[it.y][it.x] == it.cell);
|
||||
print("{} ", it.cell);
|
||||
if(it.row) print("\n");
|
||||
}
|
||||
|
||||
// tests going through straight cells but also
|
||||
// using two iterators on one matrix (or two)
|
||||
matrix::each_cell cells{walls};
|
||||
cells.next(); // kick it off
|
||||
size_t row_count = 0;
|
||||
|
||||
for(matrix::each_row it{walls};
|
||||
it.next(); cells.next())
|
||||
{
|
||||
REQUIRE(walls[cells.y][cells.x] == it.cell);
|
||||
REQUIRE(walls[cells.y][cells.x] == walls[it.y][it.x]);
|
||||
row_count += it.row;
|
||||
}
|
||||
|
||||
println("END TEST=============");
|
||||
REQUIRE(row_count == walls.size());
|
||||
|
||||
{
|
||||
// test getting the correct height in the middle
|
||||
row_count = 0;
|
||||
matrix::in_box box{walls, 2,2, 1};
|
||||
|
||||
while(box.next()) {
|
||||
row_count += box.x == box.left;
|
||||
walls[box.y][box.x] = 3;
|
||||
}
|
||||
matrix::dump("2,2 WALLS", walls, 2, 2);
|
||||
|
||||
REQUIRE(row_count == 3);
|
||||
}
|
||||
|
||||
{
|
||||
matrix::dump("1:1 POINT", walls, 1,1);
|
||||
// confirm boxes have the right number of rows
|
||||
// when x goes to 0 on first next call
|
||||
row_count = 0;
|
||||
matrix::in_box box{walls, 1, 1, 1};
|
||||
|
||||
while(box.next()) {
|
||||
row_count += box.x == box.left;
|
||||
}
|
||||
REQUIRE(row_count == 3);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("matrix_assign works", "[matrix]") {
|
||||
|
||||
inline void random_matrix(Matrix &out) {
|
||||
for(size_t y = 0; y < out.size(); y++) {
|
||||
for(size_t x = 0; x < out[0].size(); x++) {
|
||||
out[y][x] = Random::uniform<int>(-10,10);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("matrix_dump works", "[matrix]") {
|
||||
TEST_CASE("thash matrix iterators", "[matrix]") {
|
||||
for(int count = 0; count < Random::uniform<int>(10,30); count++) {
|
||||
size_t width = Random::uniform<size_t>(1, 100);
|
||||
size_t height = Random::uniform<size_t>(1, 100);
|
||||
|
||||
Matrix test(width, matrix::Row(height));
|
||||
random_matrix(test);
|
||||
|
||||
// first make a randomized matrix
|
||||
matrix::each_cell cells{test};
|
||||
cells.next(); // kick off the other iterator
|
||||
|
||||
for(matrix::each_row it{test};
|
||||
it.next(); cells.next())
|
||||
{
|
||||
REQUIRE(test[cells.y][cells.x] == test[it.y][it.x]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("thrash box iterators", "[matrix]") {
|
||||
for(int count = 0; count < 20; count++) {
|
||||
size_t width = Random::uniform<size_t>(1, 25);
|
||||
size_t height = Random::uniform<size_t>(1, 33);
|
||||
|
||||
Matrix test(height, matrix::Row(width));
|
||||
random_matrix(test);
|
||||
|
||||
// this will be greater than the random_matrix cells
|
||||
int test_i = Random::uniform<size_t>(20,30);
|
||||
|
||||
// go through every cell
|
||||
for(matrix::each_cell target{test}; target.next();) {
|
||||
PointList result;
|
||||
// make a random size box
|
||||
size_t size = Random::uniform<int>(1, 33);
|
||||
matrix::in_box box{test, target.x, target.y, size};
|
||||
|
||||
while(box.next()) {
|
||||
test[box.y][box.x] = test_i;
|
||||
result.push_back({box.x, box.y});
|
||||
}
|
||||
|
||||
for(auto point : result) {
|
||||
REQUIRE(test[point.y][point.x] == test_i);
|
||||
test[point.y][point.x] = 10; // kind of reset it for another try
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue