It's common for code to check if a rectangle is null. Add a helper function to do so and test the function in test/geometry.cpp Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
203 lines
6.3 KiB
C++
203 lines
6.3 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (C) 2019, Google Inc.
|
|
*
|
|
* geometry.cpp - Geometry classes tests
|
|
*/
|
|
|
|
#include <iostream>
|
|
|
|
#include <libcamera/geometry.h>
|
|
|
|
#include "test.h"
|
|
|
|
using namespace std;
|
|
using namespace libcamera;
|
|
|
|
class GeometryTest : public Test
|
|
{
|
|
protected:
|
|
bool compare(const Size &lhs, const Size &rhs,
|
|
bool (*op)(const Size &lhs, const Size &rhs),
|
|
const char *opName, bool expect)
|
|
{
|
|
bool result = op(lhs, rhs);
|
|
|
|
if (result != expect) {
|
|
cout << "Size(" << lhs.width << ", " << lhs.height << ") "
|
|
<< opName << " "
|
|
<< "Size(" << rhs.width << ", " << rhs.height << ") "
|
|
<< "test failed" << std::endl;
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
int run()
|
|
{
|
|
if (!Size().isNull() || !Size(0, 0).isNull()) {
|
|
cout << "Null size incorrectly reported as not null" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
if (Size(0, 100).isNull() || Size(100, 0).isNull() || Size(100, 100).isNull()) {
|
|
cout << "Non-null size incorrectly reported as null" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
/* Test alignDownTo(), alignUpTo(), boundTo() and expandTo() */
|
|
Size s(50, 50);
|
|
|
|
s.alignDownTo(16, 16);
|
|
if (s != Size(48, 48)) {
|
|
cout << "Size::alignDownTo() test failed" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
s.alignUpTo(32, 32);
|
|
if (s != Size(64, 64)) {
|
|
cout << "Size::alignUpTo() test failed" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
s.boundTo({ 40, 40 });
|
|
if (s != Size(40, 40)) {
|
|
cout << "Size::boundTo() test failed" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
s.expandTo({ 50, 50 });
|
|
if (s != Size(50, 50)) {
|
|
cout << "Size::expandTo() test failed" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
s.alignDownTo(16, 16).alignUpTo(32, 32)
|
|
.boundTo({ 40, 80 }).expandTo({ 16, 80 });
|
|
if (s != Size(40, 80)) {
|
|
cout << "Size chained in-place modifiers test failed" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
/* Test alignedDownTo(), alignedUpTo(), boundedTo() and expandedTo() */
|
|
if (Size(0, 0).alignedDownTo(16, 8) != Size(0, 0) ||
|
|
Size(1, 1).alignedDownTo(16, 8) != Size(0, 0) ||
|
|
Size(16, 8).alignedDownTo(16, 8) != Size(16, 8)) {
|
|
cout << "Size::alignedDownTo() test failed" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
if (Size(0, 0).alignedUpTo(16, 8) != Size(0, 0) ||
|
|
Size(1, 1).alignedUpTo(16, 8) != Size(16, 8) ||
|
|
Size(16, 8).alignedUpTo(16, 8) != Size(16, 8)) {
|
|
cout << "Size::alignedUpTo() test failed" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
if (Size(0, 0).boundedTo({ 100, 100 }) != Size(0, 0) ||
|
|
Size(200, 50).boundedTo({ 100, 100 }) != Size(100, 50) ||
|
|
Size(50, 200).boundedTo({ 100, 100 }) != Size(50, 100)) {
|
|
cout << "Size::boundedTo() test failed" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
if (Size(0, 0).expandedTo({ 100, 100 }) != Size(100, 100) ||
|
|
Size(200, 50).expandedTo({ 100, 100 }) != Size(200, 100) ||
|
|
Size(50, 200).expandedTo({ 100, 100 }) != Size(100, 200)) {
|
|
cout << "Size::expandedTo() test failed" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
/* Test Size equality and inequality. */
|
|
if (!compare(Size(100, 100), Size(100, 100), &operator==, "==", true))
|
|
return TestFail;
|
|
if (!compare(Size(100, 100), Size(100, 100), &operator!=, "!=", false))
|
|
return TestFail;
|
|
|
|
if (!compare(Size(100, 100), Size(200, 100), &operator==, "==", false))
|
|
return TestFail;
|
|
if (!compare(Size(100, 100), Size(200, 100), &operator!=, "!=", true))
|
|
return TestFail;
|
|
|
|
if (!compare(Size(100, 100), Size(100, 200), &operator==, "==", false))
|
|
return TestFail;
|
|
if (!compare(Size(100, 100), Size(100, 200), &operator!=, "!=", true))
|
|
return TestFail;
|
|
|
|
/* Test Size ordering based on combined with and height. */
|
|
if (!compare(Size(100, 100), Size(200, 200), &operator<, "<", true))
|
|
return TestFail;
|
|
if (!compare(Size(100, 100), Size(200, 200), &operator<=, "<=", true))
|
|
return TestFail;
|
|
if (!compare(Size(100, 100), Size(200, 200), &operator>, ">", false))
|
|
return TestFail;
|
|
if (!compare(Size(100, 100), Size(200, 200), &operator>=, ">=", false))
|
|
return TestFail;
|
|
|
|
if (!compare(Size(200, 200), Size(100, 100), &operator<, "<", false))
|
|
return TestFail;
|
|
if (!compare(Size(200, 200), Size(100, 100), &operator<=, "<=", false))
|
|
return TestFail;
|
|
if (!compare(Size(200, 200), Size(100, 100), &operator>, ">", true))
|
|
return TestFail;
|
|
if (!compare(Size(200, 200), Size(100, 100), &operator>=, ">=", true))
|
|
return TestFail;
|
|
|
|
/* Test Size ordering based on area (with overlapping sizes). */
|
|
if (!compare(Size(200, 100), Size(100, 400), &operator<, "<", true))
|
|
return TestFail;
|
|
if (!compare(Size(200, 100), Size(100, 400), &operator<=, "<=", true))
|
|
return TestFail;
|
|
if (!compare(Size(200, 100), Size(100, 400), &operator>, ">", false))
|
|
return TestFail;
|
|
if (!compare(Size(200, 100), Size(100, 400), &operator>=, ">=", false))
|
|
return TestFail;
|
|
|
|
if (!compare(Size(100, 400), Size(200, 100), &operator<, "<", false))
|
|
return TestFail;
|
|
if (!compare(Size(100, 400), Size(200, 100), &operator<=, "<=", false))
|
|
return TestFail;
|
|
if (!compare(Size(100, 400), Size(200, 100), &operator>, ">", true))
|
|
return TestFail;
|
|
if (!compare(Size(100, 400), Size(200, 100), &operator>=, ">=", true))
|
|
return TestFail;
|
|
|
|
/* Test Size ordering based on width (with identical areas). */
|
|
if (!compare(Size(100, 200), Size(200, 100), &operator<, "<", true))
|
|
return TestFail;
|
|
if (!compare(Size(100, 200), Size(200, 100), &operator<=, "<=", true))
|
|
return TestFail;
|
|
if (!compare(Size(100, 200), Size(200, 100), &operator>, ">", false))
|
|
return TestFail;
|
|
if (!compare(Size(100, 200), Size(200, 100), &operator>=, ">=", false))
|
|
return TestFail;
|
|
|
|
if (!compare(Size(200, 100), Size(100, 200), &operator<, "<", false))
|
|
return TestFail;
|
|
if (!compare(Size(200, 100), Size(100, 200), &operator<=, "<=", false))
|
|
return TestFail;
|
|
if (!compare(Size(200, 100), Size(100, 200), &operator>, ">", true))
|
|
return TestFail;
|
|
if (!compare(Size(200, 100), Size(100, 200), &operator>=, ">=", true))
|
|
return TestFail;
|
|
|
|
/* Test Rectangle::isNull(). */
|
|
if (!Rectangle(0, 0, 0, 0).isNull() ||
|
|
!Rectangle(1, 1, 0, 0).isNull()) {
|
|
cout << "Null rectangle incorrectly reported as not null" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
if (Rectangle(0, 0, 0, 1).isNull() ||
|
|
Rectangle(0, 0, 1, 0).isNull() ||
|
|
Rectangle(0, 0, 1, 1).isNull()) {
|
|
cout << "Non-null rectangle incorrectly reported as null" << endl;
|
|
return TestFail;
|
|
}
|
|
|
|
return TestPass;
|
|
}
|
|
};
|
|
|
|
TEST_REGISTER(GeometryTest)
|