[libcamera-devel,07/11] test: geometry: Add tests for Size class comparison operators

Message ID 20190415165700.22970-8-laurent.pinchart@ideasonboard.com
State Superseded
Headers show
Series
  • Rockchip ISP pipeline handler
Related show

Commit Message

Laurent Pinchart April 15, 2019, 4:56 p.m. UTC
Add a test that exercises all the comparison operators for the Size
class.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 test/geometry.cpp | 125 ++++++++++++++++++++++++++++++++++++++++++++++
 test/meson.build  |   1 +
 2 files changed, 126 insertions(+)
 create mode 100644 test/geometry.cpp

Comments

Niklas Söderlund April 15, 2019, 8:58 p.m. UTC | #1
Hi Laurent,

Thanks for your test code,

On 2019-04-15 19:56:56 +0300, Laurent Pinchart wrote:
> Add a test that exercises all the comparison operators for the Size
> class.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>

> ---
>  test/geometry.cpp | 125 ++++++++++++++++++++++++++++++++++++++++++++++
>  test/meson.build  |   1 +
>  2 files changed, 126 insertions(+)
>  create mode 100644 test/geometry.cpp
> 
> diff --git a/test/geometry.cpp b/test/geometry.cpp
> new file mode 100644
> index 000000000000..7ba3f72ed71d
> --- /dev/null
> +++ b/test/geometry.cpp
> @@ -0,0 +1,125 @@
> +/* 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:
> +	int init()
> +	{
> +		return 0;
> +	}
> +
> +	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()
> +	{
> +		/* 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;
> +
> +		return TestPass;
> +	}
> +
> +	void cleanup()
> +	{
> +	}
> +};
> +
> +TEST_REGISTER(GeometryTest)
> diff --git a/test/meson.build b/test/meson.build
> index 71a96921697c..d501f2beaf96 100644
> --- a/test/meson.build
> +++ b/test/meson.build
> @@ -9,6 +9,7 @@ subdir('v4l2_subdevice')
>  public_tests = [
>      ['event',                           'event.cpp'],
>      ['event-dispatcher',                'event-dispatcher.cpp'],
> +    ['geometry',                        'geometry.cpp'],
>      ['list-cameras',                    'list-cameras.cpp'],
>      ['signal',                          'signal.cpp'],
>      ['timer',                           'timer.cpp'],
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
Jacopo Mondi April 16, 2019, 3:19 p.m. UTC | #2
Hi Laurent,

On Mon, Apr 15, 2019 at 07:56:56PM +0300, Laurent Pinchart wrote:
> Add a test that exercises all the comparison operators for the Size
> class.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
>  test/geometry.cpp | 125 ++++++++++++++++++++++++++++++++++++++++++++++
>  test/meson.build  |   1 +
>  2 files changed, 126 insertions(+)
>  create mode 100644 test/geometry.cpp
>
> diff --git a/test/geometry.cpp b/test/geometry.cpp
> new file mode 100644
> index 000000000000..7ba3f72ed71d
> --- /dev/null
> +++ b/test/geometry.cpp
> @@ -0,0 +1,125 @@
> +/* 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:
> +	int init()
> +	{
> +		return 0;
> +	}

Do you need this?

> +
> +	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()
> +	{
> +		/* 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;
> +
> +		return TestPass;
> +	}
> +
> +	void cleanup()
> +	{
> +	}

this too?

Minors apart:
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>

Thanks
  j

> +};
> +
> +TEST_REGISTER(GeometryTest)
> diff --git a/test/meson.build b/test/meson.build
> index 71a96921697c..d501f2beaf96 100644
> --- a/test/meson.build
> +++ b/test/meson.build
> @@ -9,6 +9,7 @@ subdir('v4l2_subdevice')
>  public_tests = [
>      ['event',                           'event.cpp'],
>      ['event-dispatcher',                'event-dispatcher.cpp'],
> +    ['geometry',                        'geometry.cpp'],
>      ['list-cameras',                    'list-cameras.cpp'],
>      ['signal',                          'signal.cpp'],
>      ['timer',                           'timer.cpp'],
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
Laurent Pinchart April 16, 2019, 8:10 p.m. UTC | #3
Hi Jacopo,

On Tue, Apr 16, 2019 at 05:19:14PM +0200, Jacopo Mondi wrote:
> On Mon, Apr 15, 2019 at 07:56:56PM +0300, Laurent Pinchart wrote:
> > Add a test that exercises all the comparison operators for the Size
> > class.
> >
> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > ---
> >  test/geometry.cpp | 125 ++++++++++++++++++++++++++++++++++++++++++++++
> >  test/meson.build  |   1 +
> >  2 files changed, 126 insertions(+)
> >  create mode 100644 test/geometry.cpp
> >
> > diff --git a/test/geometry.cpp b/test/geometry.cpp
> > new file mode 100644
> > index 000000000000..7ba3f72ed71d
> > --- /dev/null
> > +++ b/test/geometry.cpp
> > @@ -0,0 +1,125 @@
> > +/* 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:
> > +	int init()
> > +	{
> > +		return 0;
> > +	}
> 
> Do you need this?

I don't, same for cleanup(). I'll fix that.

> > +
> > +	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()
> > +	{
> > +		/* 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;
> > +
> > +		return TestPass;
> > +	}
> > +
> > +	void cleanup()
> > +	{
> > +	}
> 
> this too?
> 
> Minors apart:
> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
> 
> > +};
> > +
> > +TEST_REGISTER(GeometryTest)
> > diff --git a/test/meson.build b/test/meson.build
> > index 71a96921697c..d501f2beaf96 100644
> > --- a/test/meson.build
> > +++ b/test/meson.build
> > @@ -9,6 +9,7 @@ subdir('v4l2_subdevice')
> >  public_tests = [
> >      ['event',                           'event.cpp'],
> >      ['event-dispatcher',                'event-dispatcher.cpp'],
> > +    ['geometry',                        'geometry.cpp'],
> >      ['list-cameras',                    'list-cameras.cpp'],
> >      ['signal',                          'signal.cpp'],
> >      ['timer',                           'timer.cpp'],

Patch

diff --git a/test/geometry.cpp b/test/geometry.cpp
new file mode 100644
index 000000000000..7ba3f72ed71d
--- /dev/null
+++ b/test/geometry.cpp
@@ -0,0 +1,125 @@ 
+/* 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:
+	int init()
+	{
+		return 0;
+	}
+
+	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()
+	{
+		/* 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;
+
+		return TestPass;
+	}
+
+	void cleanup()
+	{
+	}
+};
+
+TEST_REGISTER(GeometryTest)
diff --git a/test/meson.build b/test/meson.build
index 71a96921697c..d501f2beaf96 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -9,6 +9,7 @@  subdir('v4l2_subdevice')
 public_tests = [
     ['event',                           'event.cpp'],
     ['event-dispatcher',                'event-dispatcher.cpp'],
+    ['geometry',                        'geometry.cpp'],
     ['list-cameras',                    'list-cameras.cpp'],
     ['signal',                          'signal.cpp'],
     ['timer',                           'timer.cpp'],