Add a basic test of the thresholding code
This in preparation for adding a new implementation.
Change-Id: I8ef7a25607b48a1649cb2c30e121a72a600eb1e6
diff --git a/aos/vision/blob/threshold_test.cc b/aos/vision/blob/threshold_test.cc
new file mode 100644
index 0000000..96a2a22
--- /dev/null
+++ b/aos/vision/blob/threshold_test.cc
@@ -0,0 +1,100 @@
+#include "aos/vision/blob/threshold.h"
+
+#include <vector>
+
+#include "aos/vision/blob/range_image.h"
+#include "aos/vision/image/image_types.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+namespace aos {
+namespace vision {
+namespace testing {
+
+class YuyvYThresholdTest : public ::testing::Test {
+};
+
+// Verifies that a simple image is thresholded correctly.
+//
+// Specifically, we want to get this result from the thresholding:
+// --+--
+// +---+
+// -+++-
+// +++-+
+// -----
+// ++-++
+// +++++
+// +-+-+
+TEST_F(YuyvYThresholdTest, SimpleImage) {
+ ImageFormat format;
+ format.w = 5;
+ format.h = 8;
+
+ std::vector<std::vector<ImageRange>> expected_ranges;
+ std::vector<char> image;
+ image.resize(5 * 8 * 2);
+ // --+--
+ image[0 * 2 + 0 * 10] = 0;
+ image[1 * 2 + 0 * 10] = 0;
+ image[2 * 2 + 0 * 10] = 128;
+ image[3 * 2 + 0 * 10] = 127;
+ image[4 * 2 + 0 * 10] = 0;
+ expected_ranges.push_back({{{2, 3}}});
+ // +---+
+ image[0 * 2 + 1 * 10] = 128;
+ image[1 * 2 + 1 * 10] = 0;
+ image[2 * 2 + 1 * 10] = 0;
+ image[3 * 2 + 1 * 10] = 10;
+ image[4 * 2 + 1 * 10] = 255;
+ expected_ranges.push_back({{{0, 1}, {4, 5}}});
+ // -+++-
+ image[0 * 2 + 2 * 10] = 73;
+ image[1 * 2 + 2 * 10] = 250;
+ image[2 * 2 + 2 * 10] = 251;
+ image[3 * 2 + 2 * 10] = 252;
+ image[4 * 2 + 2 * 10] = 45;
+ expected_ranges.push_back({{{1, 4}}});
+ // +++-+
+ image[0 * 2 + 3 * 10] = 128;
+ image[1 * 2 + 3 * 10] = 134;
+ image[2 * 2 + 3 * 10] = 250;
+ image[3 * 2 + 3 * 10] = 0;
+ image[4 * 2 + 3 * 10] = 230;
+ expected_ranges.push_back({{{0, 3}, {4, 5}}});
+ // -----
+ image[0 * 2 + 4 * 10] = 7;
+ image[1 * 2 + 4 * 10] = 120;
+ image[2 * 2 + 4 * 10] = 127;
+ image[3 * 2 + 4 * 10] = 0;
+ image[4 * 2 + 4 * 10] = 50;
+ expected_ranges.push_back({{}});
+ // ++-++
+ image[0 * 2 + 5 * 10] = 140;
+ image[1 * 2 + 5 * 10] = 140;
+ image[2 * 2 + 5 * 10] = 0;
+ image[3 * 2 + 5 * 10] = 140;
+ image[4 * 2 + 5 * 10] = 140;
+ expected_ranges.push_back({{{0, 2}, {3, 5}}});
+ // +++++
+ image[0 * 2 + 6 * 10] = 128;
+ image[1 * 2 + 6 * 10] = 128;
+ image[2 * 2 + 6 * 10] = 128;
+ image[3 * 2 + 6 * 10] = 128;
+ image[4 * 2 + 6 * 10] = 128;
+ expected_ranges.push_back({{{0, 5}}});
+ // +-+-+
+ image[0 * 2 + 7 * 10] = 200;
+ image[1 * 2 + 7 * 10] = 0;
+ image[2 * 2 + 7 * 10] = 200;
+ image[3 * 2 + 7 * 10] = 0;
+ image[4 * 2 + 7 * 10] = 200;
+ expected_ranges.push_back({{{0, 1}, {2, 3}, {4, 5}}});
+ const RangeImage expected_result(0, std::move(expected_ranges));
+
+ const auto slow_result = SlowYuyvYThreshold(format, image.data(), 127);
+ ASSERT_EQ(expected_result, slow_result);
+}
+
+} // namespace testing
+} // namespace vision
+} // namespace aos