blob: 852a1e42a784e169df522a9ce133c6ad859e4693 [file] [log] [blame]
Justin Turcotteda332b82023-12-28 22:30:10 -08001#include "frc971/orin/points.h"
2
3#include <random>
4
5#include "gtest/gtest.h"
6
7#include "aos/testing/random_seed.h"
8
9namespace frc971::apriltag::testing {
10
11// Tests that QuadBoundaryPoint doesn't corrupt data.
12TEST(QuadBoundaryPoint, MasksWork) {
13 std::mt19937 generator(aos::testing::RandomSeed());
14 std::uniform_int_distribution<uint32_t> random_rep_scalar(0, 0xfffff);
15 std::uniform_int_distribution<uint32_t> random_point_scalar(0, 0x3ff);
16 std::uniform_int_distribution<uint32_t> random_dxy_scalar(0, 3);
17 std::uniform_int_distribution<uint32_t> random_bool(0, 1);
18
19 QuadBoundaryPoint point;
20
21 EXPECT_EQ(point.key, 0);
22
23 for (int i = 0; i < 25; ++i) {
24 const uint32_t rep0 = random_rep_scalar(generator);
25 for (int j = 0; j < 25; ++j) {
26 const uint32_t rep1 = random_rep_scalar(generator);
27 for (int k = 0; k < 25; ++k) {
28 const uint32_t x = random_point_scalar(generator);
29 const uint32_t y = random_point_scalar(generator);
30 for (int k = 0; k < 25; ++k) {
31 const uint32_t dxy = random_dxy_scalar(generator);
32 for (int m = 0; m < 2; ++m) {
33 const bool black_to_white = random_bool(generator) == 1;
34
35 if (point.rep0() != rep0) {
36 point.set_rep0(rep0);
37 }
38
39 if (point.rep1() != rep1) {
40 point.set_rep1(rep1);
41 }
42
43 if (point.base_x() != x || point.base_y() != y) {
44 point.set_base_xy(x, y);
45 }
46
47 switch (dxy) {
48 case 0:
49 if (point.dx() != 1 || point.dy() != 0) {
50 point.set_dxy(dxy);
51 }
52 break;
53 case 1:
54 if (point.dx() != 1 || point.dy() != 1) {
55 point.set_dxy(dxy);
56 }
57 break;
58 case 2:
59 if (point.dx() != 0 || point.dy() != 1) {
60 point.set_dxy(dxy);
61 }
62 break;
63 case 3:
64 if (point.dx() != -1 || point.dy() != 1) {
65 point.set_dxy(dxy);
66 }
67 break;
68 }
69
70 if (black_to_white != point.black_to_white()) {
71 point.set_black_to_white(black_to_white);
72 }
73
74 EXPECT_EQ(point.rep0(), rep0);
75 EXPECT_EQ(point.rep1(), rep1);
76 EXPECT_EQ(point.base_x(), x);
77 EXPECT_EQ(point.base_y(), y);
78 switch (dxy) {
79 case 0:
80 EXPECT_EQ(point.dx(), 1);
81 EXPECT_EQ(point.dy(), 0);
82 break;
83 case 1:
84 EXPECT_EQ(point.dx(), 1);
85 EXPECT_EQ(point.dy(), 1);
86 break;
87 case 2:
88 EXPECT_EQ(point.dx(), 0);
89 EXPECT_EQ(point.dy(), 1);
90 break;
91 case 3:
92 EXPECT_EQ(point.dx(), -1);
93 EXPECT_EQ(point.dy(), 1);
94 break;
95 }
96
97 EXPECT_EQ(point.x(), x * 2 + point.dx());
98 EXPECT_EQ(point.y(), y * 2 + point.dy());
99
100 EXPECT_EQ(point.black_to_white(), black_to_white);
101 }
102 }
103 }
104 }
105 }
106}
107
108// Tests that IndexPoint doesn't corrupt anything
109TEST(IndexPoint, MasksWork) {
110 std::mt19937 generator(
111 aos::testing::RandomSeed()); // random_uint32(generator)
112 std::uniform_int_distribution<uint32_t> random_blob_index(0, 0xfff);
113 std::uniform_int_distribution<uint32_t> random_theta(0, 0xfffffff);
114 std::uniform_int_distribution<uint32_t> random_point_scalar(0, 0x3ff);
115 std::uniform_int_distribution<uint32_t> random_dxy_scalar(0, 3);
116 std::uniform_int_distribution<uint32_t> random_bool(0, 1);
117
118 IndexPoint point;
119
120 for (int i = 0; i < 25; i++) {
121 const uint32_t blob_index = random_blob_index(generator);
122 for (int j = 0; j < 25; j++) {
123 const uint32_t theta = random_theta(generator);
124 for (int k = 0; k < 25; ++k) {
125 const uint32_t x = random_point_scalar(generator);
126 const uint32_t y = random_point_scalar(generator);
127 for (int k = 0; k < 25; ++k) {
128 const uint32_t dxy = random_dxy_scalar(generator);
129 for (int m = 0; m < 2; ++m) {
130 const bool black_to_white = random_bool(generator) == 1;
131
132 if (point.blob_index() != blob_index) {
133 point.set_blob_index(blob_index);
134 }
135
136 if (point.theta() != theta) {
137 point.set_theta(theta);
138 }
139
140 if (point.base_x() != x || point.base_y() != y) {
141 point.set_base_xy(x, y);
142 }
143
144 switch (dxy) {
145 case 0:
146 if (point.dx() != 1 || point.dy() != 0) {
147 point.set_dxy(dxy);
148 }
149 break;
150 case 1:
151 if (point.dx() != 1 || point.dy() != 1) {
152 point.set_dxy(dxy);
153 }
154 break;
155 case 2:
156 if (point.dx() != 0 || point.dy() != 1) {
157 point.set_dxy(dxy);
158 }
159 break;
160 case 3:
161 if (point.dx() != -1 || point.dy() != 1) {
162 point.set_dxy(dxy);
163 }
164 break;
165 }
166
167 if (black_to_white != point.black_to_white()) {
168 point.set_black_to_white(black_to_white);
169 }
170
171 EXPECT_EQ(point.blob_index(), blob_index);
172 EXPECT_EQ(point.theta(), theta);
173 EXPECT_EQ(point.base_x(), x);
174 EXPECT_EQ(point.base_y(), y);
175
176 switch (dxy) {
177 case 0:
178 EXPECT_EQ(point.dx(), 1);
179 EXPECT_EQ(point.dy(), 0);
180 break;
181 case 1:
182 EXPECT_EQ(point.dx(), 1);
183 EXPECT_EQ(point.dy(), 1);
184 break;
185 case 2:
186 EXPECT_EQ(point.dx(), 0);
187 EXPECT_EQ(point.dy(), 1);
188 break;
189 case 3:
190 EXPECT_EQ(point.dx(), -1);
191 EXPECT_EQ(point.dy(), 1);
192 break;
193 }
194 EXPECT_EQ(point.x(), x * 2 + point.dx());
195 EXPECT_EQ(point.y(), y * 2 + point.dy());
196
197 EXPECT_EQ(point.black_to_white(), black_to_white);
198 }
199 }
200 }
201 }
202 }
203}
204} // namespace frc971::apriltag::testing