blob: 852a1e42a784e169df522a9ce133c6ad859e4693 [file] [log] [blame]
#include "frc971/orin/points.h"
#include <random>
#include "gtest/gtest.h"
#include "aos/testing/random_seed.h"
namespace frc971::apriltag::testing {
// Tests that QuadBoundaryPoint doesn't corrupt data.
TEST(QuadBoundaryPoint, MasksWork) {
std::mt19937 generator(aos::testing::RandomSeed());
std::uniform_int_distribution<uint32_t> random_rep_scalar(0, 0xfffff);
std::uniform_int_distribution<uint32_t> random_point_scalar(0, 0x3ff);
std::uniform_int_distribution<uint32_t> random_dxy_scalar(0, 3);
std::uniform_int_distribution<uint32_t> random_bool(0, 1);
QuadBoundaryPoint point;
EXPECT_EQ(point.key, 0);
for (int i = 0; i < 25; ++i) {
const uint32_t rep0 = random_rep_scalar(generator);
for (int j = 0; j < 25; ++j) {
const uint32_t rep1 = random_rep_scalar(generator);
for (int k = 0; k < 25; ++k) {
const uint32_t x = random_point_scalar(generator);
const uint32_t y = random_point_scalar(generator);
for (int k = 0; k < 25; ++k) {
const uint32_t dxy = random_dxy_scalar(generator);
for (int m = 0; m < 2; ++m) {
const bool black_to_white = random_bool(generator) == 1;
if (point.rep0() != rep0) {
point.set_rep0(rep0);
}
if (point.rep1() != rep1) {
point.set_rep1(rep1);
}
if (point.base_x() != x || point.base_y() != y) {
point.set_base_xy(x, y);
}
switch (dxy) {
case 0:
if (point.dx() != 1 || point.dy() != 0) {
point.set_dxy(dxy);
}
break;
case 1:
if (point.dx() != 1 || point.dy() != 1) {
point.set_dxy(dxy);
}
break;
case 2:
if (point.dx() != 0 || point.dy() != 1) {
point.set_dxy(dxy);
}
break;
case 3:
if (point.dx() != -1 || point.dy() != 1) {
point.set_dxy(dxy);
}
break;
}
if (black_to_white != point.black_to_white()) {
point.set_black_to_white(black_to_white);
}
EXPECT_EQ(point.rep0(), rep0);
EXPECT_EQ(point.rep1(), rep1);
EXPECT_EQ(point.base_x(), x);
EXPECT_EQ(point.base_y(), y);
switch (dxy) {
case 0:
EXPECT_EQ(point.dx(), 1);
EXPECT_EQ(point.dy(), 0);
break;
case 1:
EXPECT_EQ(point.dx(), 1);
EXPECT_EQ(point.dy(), 1);
break;
case 2:
EXPECT_EQ(point.dx(), 0);
EXPECT_EQ(point.dy(), 1);
break;
case 3:
EXPECT_EQ(point.dx(), -1);
EXPECT_EQ(point.dy(), 1);
break;
}
EXPECT_EQ(point.x(), x * 2 + point.dx());
EXPECT_EQ(point.y(), y * 2 + point.dy());
EXPECT_EQ(point.black_to_white(), black_to_white);
}
}
}
}
}
}
// Tests that IndexPoint doesn't corrupt anything
TEST(IndexPoint, MasksWork) {
std::mt19937 generator(
aos::testing::RandomSeed()); // random_uint32(generator)
std::uniform_int_distribution<uint32_t> random_blob_index(0, 0xfff);
std::uniform_int_distribution<uint32_t> random_theta(0, 0xfffffff);
std::uniform_int_distribution<uint32_t> random_point_scalar(0, 0x3ff);
std::uniform_int_distribution<uint32_t> random_dxy_scalar(0, 3);
std::uniform_int_distribution<uint32_t> random_bool(0, 1);
IndexPoint point;
for (int i = 0; i < 25; i++) {
const uint32_t blob_index = random_blob_index(generator);
for (int j = 0; j < 25; j++) {
const uint32_t theta = random_theta(generator);
for (int k = 0; k < 25; ++k) {
const uint32_t x = random_point_scalar(generator);
const uint32_t y = random_point_scalar(generator);
for (int k = 0; k < 25; ++k) {
const uint32_t dxy = random_dxy_scalar(generator);
for (int m = 0; m < 2; ++m) {
const bool black_to_white = random_bool(generator) == 1;
if (point.blob_index() != blob_index) {
point.set_blob_index(blob_index);
}
if (point.theta() != theta) {
point.set_theta(theta);
}
if (point.base_x() != x || point.base_y() != y) {
point.set_base_xy(x, y);
}
switch (dxy) {
case 0:
if (point.dx() != 1 || point.dy() != 0) {
point.set_dxy(dxy);
}
break;
case 1:
if (point.dx() != 1 || point.dy() != 1) {
point.set_dxy(dxy);
}
break;
case 2:
if (point.dx() != 0 || point.dy() != 1) {
point.set_dxy(dxy);
}
break;
case 3:
if (point.dx() != -1 || point.dy() != 1) {
point.set_dxy(dxy);
}
break;
}
if (black_to_white != point.black_to_white()) {
point.set_black_to_white(black_to_white);
}
EXPECT_EQ(point.blob_index(), blob_index);
EXPECT_EQ(point.theta(), theta);
EXPECT_EQ(point.base_x(), x);
EXPECT_EQ(point.base_y(), y);
switch (dxy) {
case 0:
EXPECT_EQ(point.dx(), 1);
EXPECT_EQ(point.dy(), 0);
break;
case 1:
EXPECT_EQ(point.dx(), 1);
EXPECT_EQ(point.dy(), 1);
break;
case 2:
EXPECT_EQ(point.dx(), 0);
EXPECT_EQ(point.dy(), 1);
break;
case 3:
EXPECT_EQ(point.dx(), -1);
EXPECT_EQ(point.dy(), 1);
break;
}
EXPECT_EQ(point.x(), x * 2 + point.dx());
EXPECT_EQ(point.y(), y * 2 + point.dy());
EXPECT_EQ(point.black_to_white(), black_to_white);
}
}
}
}
}
}
} // namespace frc971::apriltag::testing