[libcamera-devel,v3,5/5] test: Add unit tests for the BayerFormat class
diff mbox series

Message ID 20210126184854.46156-6-sebastian.fricke@posteo.net
State Accepted
Headers show
Series
  • Improve BayerFormat class
Related show

Commit Message

Sebastian Fricke Jan. 26, 2021, 6:48 p.m. UTC
Test all of the present methods including the newly implemented
`fromV4L2PixelFormat`, as well as the new operators `==/!=`.

Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Signed-off-by: Sebastian Fricke <sebastian.fricke@posteo.net>
---
 test/bayer_format.cpp | 210 ++++++++++++++++++++++++++++++++++++++++++
 test/meson.build      |   1 +
 2 files changed, 211 insertions(+)
 create mode 100644 test/bayer_format.cpp

Comments

Laurent Pinchart Jan. 26, 2021, 11:12 p.m. UTC | #1
Hi Sebastian,

Thank you for the patch.

On Tue, Jan 26, 2021 at 07:48:54PM +0100, Sebastian Fricke wrote:
> Test all of the present methods including the newly implemented
> `fromV4L2PixelFormat`, as well as the new operators `==/!=`.
> 
> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
> Signed-off-by: Sebastian Fricke <sebastian.fricke@posteo.net>
> ---
>  test/bayer_format.cpp | 210 ++++++++++++++++++++++++++++++++++++++++++
>  test/meson.build      |   1 +
>  2 files changed, 211 insertions(+)
>  create mode 100644 test/bayer_format.cpp
> 
> diff --git a/test/bayer_format.cpp b/test/bayer_format.cpp
> new file mode 100644
> index 00000000..f763500f
> --- /dev/null
> +++ b/test/bayer_format.cpp
> @@ -0,0 +1,210 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/*
> + * Copyright (C) 2020, Sebastian Fricke
> + *
> + * bayer_format.cpp - BayerFormat class tests
> + */
> +
> +#include <iostream>
> +
> +#include <libcamera/internal/bayer_format.h>
> +#include <libcamera/transform.h>
> +
> +#include "test.h"
> +
> +using namespace std;
> +using namespace libcamera;
> +
> +class BayerFormatTest : public Test
> +{
> +protected:
> +	int run()
> +	{
> +		/* An empty Bayer format has to be invalid. */
> +		BayerFormat bayerFmt;
> +		if (bayerFmt.isValid()) {
> +			cerr << "An empty BayerFormat has to be invalid."
> +			     << endl;
> +			return TestFail;
> +		}
> +
> +		/* A correct Bayer format has to be valid. */
> +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> +		if (!bayerFmt.isValid()) {
> +			cerr << "A correct BayerFormat has to be valid."
> +			     << endl;
> +			return TestFail;
> +		}
> +
> +		/*
> +		 * Two bayer formats created with the same order and bit depth
> +		 * have to be equal.
> +		 */
> +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> +		BayerFormat bayerFmtExpect = BayerFormat(BayerFormat::BGGR, 8,
> +							 BayerFormat::None);
> +		if (bayerFmt != bayerFmtExpect) {
> +			cerr << "Comparison of identical formats failed."
> +			     << endl;
> +			return TestFail;
> +		}
> +
> +		/*
> +		 * Two Bayer formats created with the same order but with a
> +		 * different bitDepth are not equal.
> +		 */
> +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> +		bayerFmtExpect = BayerFormat(BayerFormat::BGGR, 12,
> +					     BayerFormat::None);
> +		if (bayerFmt == bayerFmtExpect) {
> +			cerr << "Comparison of divergent formats failed."

s/divergent/different/

> +			     << endl;
> +			return TestFail;
> +		}
> +
> +		/*
> +		 * Create a Bayer format with a V4L2PixelFormat and check if we
> +		 * get the same format after converting back to the V4L2 Format.
> +		 */
> +		V4L2PixelFormat v4l2FmtExpect = V4L2PixelFormat(
> +			V4L2_PIX_FMT_SBGGR8);
> +		bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2FmtExpect);
> +		V4L2PixelFormat v4l2Fmt = bayerFmt.toV4L2PixelFormat();
> +		if (v4l2Fmt != v4l2FmtExpect) {
> +			cerr << "Expected: '" << v4l2FmtExpect.toString()
> +			     << "' got: '" << v4l2Fmt.toString() << "'" << endl;
> +			return TestFail;
> +		}
> +
> +		/*
> +		 * Use an empty Bayer format and verify that no matching
> +		 * V4L2PixelFormat is found.
> +		 */
> +		v4l2FmtExpect = V4L2PixelFormat();
> +		bayerFmt = BayerFormat();
> +		v4l2Fmt = bayerFmt.toV4L2PixelFormat();
> +		if (v4l2Fmt != v4l2FmtExpect) {
> +			cerr << "Expected: empty V4L2PixelFormat got: '"
> +			     << v4l2Fmt.toString() << "'" << endl;
> +			return TestFail;
> +		}
> +
> +		/*
> +		 * Check if we get the expected Bayer format BGGR8
> +		 * when we convert the V4L2PixelFormat (V4L2_PIX_FMT_SBGGR8)
> +		 * to a Bayer format.
> +		 */
> +		bayerFmtExpect = BayerFormat(BayerFormat::BGGR, 8,
> +					     BayerFormat::None);
> +		v4l2Fmt = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR8);
> +		bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2Fmt);
> +		if (bayerFmt != bayerFmtExpect) {
> +			cerr << "Expected BayerFormat '"
> +			     << bayerFmtExpect.toString() << "', got: '"
> +			     << bayerFmt.toString() << "'" << endl;
> +			return TestFail;
> +		}
> +
> +		/*
> +		 * Confirm that a V4L2PixelFormat that is not found in
> +		 * the conversion table, doesn't yield a Bayer format.
> +		 */
> +		V4L2PixelFormat v4l2FmtUnknown = V4L2PixelFormat(
> +			V4L2_PIX_FMT_BGRA444);
> +		bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2FmtUnknown);
> +		if (bayerFmt.isValid()) {
> +			cerr << "Expected empty BayerFormat got: '"
> +			     << bayerFmt.toString() << "'" << endl;
> +			return TestFail;
> +		}
> +
> +		/*
> +		 * Test if a valid Bayer format can be converted to a
> +		 * string representation.
> +		 */
> +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> +		if (bayerFmt.toString() != "BGGR-8") {
> +			cerr << "String representation != 'BGGR-8' (got: '"
> +			     << bayerFmt.toString() << "' ) " << endl;
> +			return TestFail;
> +		}
> +
> +		/*
> +		 * Determine if an empty Bayer format results in no
> +		 * string representation.
> +		 */
> +		bayerFmt = BayerFormat();
> +		if (bayerFmt.toString() != "INVALID") {
> +			cerr << "String representation != 'INVALID' (got: '"
> +			     << bayerFmt.toString() << "' ) " << endl;
> +			return TestFail;
> +		}
> +
> +		/*
> +		 * Perform a horizontal Flip and make sure that the
> +		 * order is adjusted accordingly.
> +		 */
> +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> +		bayerFmtExpect = BayerFormat(BayerFormat::GBRG, 8,
> +					     BayerFormat::None);
> +		BayerFormat hFlipFmt = bayerFmt.transform(Transform::HFlip);
> +		if (hFlipFmt != bayerFmtExpect) {
> +			cerr << "Horizontal flip of 'BGGR-8' should result in '"
> +			     << bayerFmtExpect.toString() << "', got: '"
> +			     << hFlipFmt.toString() << "'" << endl;
> +			return TestFail;
> +		}
> +
> +		/*
> +		 * Perform a vertical Flip and make sure that
> +		 * the order is adjusted accordingly.
> +		 */
> +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> +		bayerFmtExpect = BayerFormat(BayerFormat::GRBG, 8,
> +					     BayerFormat::None);
> +		BayerFormat vFlipFmt = bayerFmt.transform(Transform::VFlip);
> +		if (vFlipFmt != bayerFmtExpect) {
> +			cerr << "Vertical flip of 'BGGR-8' should result in '"
> +			     << bayerFmtExpect.toString() << "', got: '"
> +			     << vFlipFmt.toString() << "'" << endl;
> +			return TestFail;
> +		}
> +
> +		/*
> +		 * Perform a transposition on a pixel order with both green
> +		 * pixels on the bottom left to top right diagonal and make
> +		 * sure, that it doesn't change.
> +		 */
> +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> +		BayerFormat transposeFmt = bayerFmt.transform(
> +			Transform::Transpose);
> +		if (transposeFmt != bayerFmt) {
> +			cerr << "Transpose with both green pixels on the "
> +			     << "antidiagonal, should not change the order "

s/antidiagonal,/antidiagonal/

> +			     << " result: '" << transposeFmt.toString() << "'"
> +			     << endl;
> +			return TestFail;
> +		}
> +
> +		/*
> +		 * Perform a transposition on an pixel order with red and blue
> +		 * on the bottom left to top right diagonal and make sure
> +		 * that their positions are switched.
> +		 */
> +		bayerFmt = BayerFormat(BayerFormat::GBRG, 8, BayerFormat::None);
> +		bayerFmtExpect = BayerFormat(BayerFormat::GRBG, 8,
> +					     BayerFormat::None);
> +		transposeFmt = bayerFmt.transform(Transform::Transpose);
> +		if (transposeFmt != bayerFmtExpect) {
> +			cerr << "Transpose with the red & blue pixels on the "
> +			     << "antidiagonal, should switch their position "

Same here.

> +			     << " result: '" << transposeFmt.toString() << "'"
> +			     << endl;
> +			return TestFail;
> +		}
> +
> +		return TestPass;
> +	}
> +};
> +
> +TEST_REGISTER(BayerFormatTest);

s/;//

> diff --git a/test/meson.build b/test/meson.build
> index 7f0682ad..709b47aa 100644
> --- a/test/meson.build
> +++ b/test/meson.build
> @@ -27,6 +27,7 @@ public_tests = [
>  ]
>  
>  internal_tests = [
> +    ['bayer-format',                    'bayer_format.cpp'],
>      ['byte-stream-buffer',              'byte-stream-buffer.cpp'],
>      ['camera-sensor',                   'camera-sensor.cpp'],
>      ['event',                           'event.cpp'],
Laurent Pinchart Jan. 26, 2021, 11:21 p.m. UTC | #2
Hi Sebastian,

A few other comments.

On Wed, Jan 27, 2021 at 01:12:56AM +0200, Laurent Pinchart wrote:
> On Tue, Jan 26, 2021 at 07:48:54PM +0100, Sebastian Fricke wrote:
> > Test all of the present methods including the newly implemented
> > `fromV4L2PixelFormat`, as well as the new operators `==/!=`.
> > 
> > Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
> > Signed-off-by: Sebastian Fricke <sebastian.fricke@posteo.net>
> > ---
> >  test/bayer_format.cpp | 210 ++++++++++++++++++++++++++++++++++++++++++
> >  test/meson.build      |   1 +
> >  2 files changed, 211 insertions(+)
> >  create mode 100644 test/bayer_format.cpp
> > 
> > diff --git a/test/bayer_format.cpp b/test/bayer_format.cpp
> > new file mode 100644
> > index 00000000..f763500f
> > --- /dev/null
> > +++ b/test/bayer_format.cpp
> > @@ -0,0 +1,210 @@
> > +/* SPDX-License-Identifier: GPL-2.0-or-later */
> > +/*
> > + * Copyright (C) 2020, Sebastian Fricke
> > + *
> > + * bayer_format.cpp - BayerFormat class tests
> > + */
> > +
> > +#include <iostream>
> > +
> > +#include <libcamera/internal/bayer_format.h>
> > +#include <libcamera/transform.h>
> > +
> > +#include "test.h"
> > +
> > +using namespace std;
> > +using namespace libcamera;
> > +
> > +class BayerFormatTest : public Test
> > +{
> > +protected:
> > +	int run()
> > +	{
> > +		/* An empty Bayer format has to be invalid. */
> > +		BayerFormat bayerFmt;
> > +		if (bayerFmt.isValid()) {
> > +			cerr << "An empty BayerFormat has to be invalid."
> > +			     << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/* A correct Bayer format has to be valid. */
> > +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> > +		if (!bayerFmt.isValid()) {
> > +			cerr << "A correct BayerFormat has to be valid."
> > +			     << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/*
> > +		 * Two bayer formats created with the same order and bit depth
> > +		 * have to be equal.
> > +		 */
> > +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> > +		BayerFormat bayerFmtExpect = BayerFormat(BayerFormat::BGGR, 8,
> > +							 BayerFormat::None);
> > +		if (bayerFmt != bayerFmtExpect) {
> > +			cerr << "Comparison of identical formats failed."
> > +			     << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/*
> > +		 * Two Bayer formats created with the same order but with a
> > +		 * different bitDepth are not equal.
> > +		 */
> > +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> > +		bayerFmtExpect = BayerFormat(BayerFormat::BGGR, 12,
> > +					     BayerFormat::None);
> > +		if (bayerFmt == bayerFmtExpect) {
> > +			cerr << "Comparison of divergent formats failed."
> 
> s/divergent/different/
> 
> > +			     << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/*
> > +		 * Create a Bayer format with a V4L2PixelFormat and check if we
> > +		 * get the same format after converting back to the V4L2 Format.
> > +		 */
> > +		V4L2PixelFormat v4l2FmtExpect = V4L2PixelFormat(
> > +			V4L2_PIX_FMT_SBGGR8);
> > +		bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2FmtExpect);
> > +		V4L2PixelFormat v4l2Fmt = bayerFmt.toV4L2PixelFormat();
> > +		if (v4l2Fmt != v4l2FmtExpect) {
> > +			cerr << "Expected: '" << v4l2FmtExpect.toString()
> > +			     << "' got: '" << v4l2Fmt.toString() << "'" << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/*
> > +		 * Use an empty Bayer format and verify that no matching
> > +		 * V4L2PixelFormat is found.
> > +		 */
> > +		v4l2FmtExpect = V4L2PixelFormat();
> > +		bayerFmt = BayerFormat();
> > +		v4l2Fmt = bayerFmt.toV4L2PixelFormat();
> > +		if (v4l2Fmt != v4l2FmtExpect) {
> > +			cerr << "Expected: empty V4L2PixelFormat got: '"
> > +			     << v4l2Fmt.toString() << "'" << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/*
> > +		 * Check if we get the expected Bayer format BGGR8
> > +		 * when we convert the V4L2PixelFormat (V4L2_PIX_FMT_SBGGR8)
> > +		 * to a Bayer format.
> > +		 */
> > +		bayerFmtExpect = BayerFormat(BayerFormat::BGGR, 8,
> > +					     BayerFormat::None);
> > +		v4l2Fmt = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR8);
> > +		bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2Fmt);
> > +		if (bayerFmt != bayerFmtExpect) {
> > +			cerr << "Expected BayerFormat '"
> > +			     << bayerFmtExpect.toString() << "', got: '"
> > +			     << bayerFmt.toString() << "'" << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/*
> > +		 * Confirm that a V4L2PixelFormat that is not found in
> > +		 * the conversion table, doesn't yield a Bayer format.
> > +		 */
> > +		V4L2PixelFormat v4l2FmtUnknown = V4L2PixelFormat(
> > +			V4L2_PIX_FMT_BGRA444);
> > +		bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2FmtUnknown);
> > +		if (bayerFmt.isValid()) {
> > +			cerr << "Expected empty BayerFormat got: '"
> > +			     << bayerFmt.toString() << "'" << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/*
> > +		 * Test if a valid Bayer format can be converted to a
> > +		 * string representation.
> > +		 */
> > +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> > +		if (bayerFmt.toString() != "BGGR-8") {
> > +			cerr << "String representation != 'BGGR-8' (got: '"
> > +			     << bayerFmt.toString() << "' ) " << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/*
> > +		 * Determine if an empty Bayer format results in no
> > +		 * string representation.
> > +		 */
> > +		bayerFmt = BayerFormat();
> > +		if (bayerFmt.toString() != "INVALID") {
> > +			cerr << "String representation != 'INVALID' (got: '"
> > +			     << bayerFmt.toString() << "' ) " << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/*
> > +		 * Perform a horizontal Flip and make sure that the
> > +		 * order is adjusted accordingly.
> > +		 */
> > +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> > +		bayerFmtExpect = BayerFormat(BayerFormat::GBRG, 8,
> > +					     BayerFormat::None);
> > +		BayerFormat hFlipFmt = bayerFmt.transform(Transform::HFlip);
> > +		if (hFlipFmt != bayerFmtExpect) {
> > +			cerr << "Horizontal flip of 'BGGR-8' should result in '"
> > +			     << bayerFmtExpect.toString() << "', got: '"
> > +			     << hFlipFmt.toString() << "'" << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/*
> > +		 * Perform a vertical Flip and make sure that
> > +		 * the order is adjusted accordingly.
> > +		 */
> > +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> > +		bayerFmtExpect = BayerFormat(BayerFormat::GRBG, 8,
> > +					     BayerFormat::None);
> > +		BayerFormat vFlipFmt = bayerFmt.transform(Transform::VFlip);
> > +		if (vFlipFmt != bayerFmtExpect) {
> > +			cerr << "Vertical flip of 'BGGR-8' should result in '"
> > +			     << bayerFmtExpect.toString() << "', got: '"
> > +			     << vFlipFmt.toString() << "'" << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/*
> > +		 * Perform a transposition on a pixel order with both green
> > +		 * pixels on the bottom left to top right diagonal and make
> > +		 * sure, that it doesn't change.
> > +		 */
> > +		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
> > +		BayerFormat transposeFmt = bayerFmt.transform(
> > +			Transform::Transpose);
> > +		if (transposeFmt != bayerFmt) {
> > +			cerr << "Transpose with both green pixels on the "
> > +			     << "antidiagonal, should not change the order "
> 
> s/antidiagonal,/antidiagonal/
> 
> > +			     << " result: '" << transposeFmt.toString() << "'"

There's no line break before this line, so the message on the console
would look weird. I'd write

			     << "(got '" << transposeFmt.toString() << "')"

> > +			     << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		/*
> > +		 * Perform a transposition on an pixel order with red and blue
> > +		 * on the bottom left to top right diagonal and make sure
> > +		 * that their positions are switched.
> > +		 */
> > +		bayerFmt = BayerFormat(BayerFormat::GBRG, 8, BayerFormat::None);
> > +		bayerFmtExpect = BayerFormat(BayerFormat::GRBG, 8,
> > +					     BayerFormat::None);
> > +		transposeFmt = bayerFmt.transform(Transform::Transpose);
> > +		if (transposeFmt != bayerFmtExpect) {
> > +			cerr << "Transpose with the red & blue pixels on the "
> > +			     << "antidiagonal, should switch their position "
> 
> Same here.
> 
> > +			     << " result: '" << transposeFmt.toString() << "'"

Same here.

> > +			     << endl;
> > +			return TestFail;
> > +		}
> > +
> > +		return TestPass;
> > +	}
> > +};
> > +
> > +TEST_REGISTER(BayerFormatTest);
> 
> s/;//
> 
> > diff --git a/test/meson.build b/test/meson.build
> > index 7f0682ad..709b47aa 100644
> > --- a/test/meson.build
> > +++ b/test/meson.build
> > @@ -27,6 +27,7 @@ public_tests = [
> >  ]
> >  
> >  internal_tests = [
> > +    ['bayer-format',                    'bayer_format.cpp'],

I'd rename the file to bayer-format.cpp to match the other files in this
directory.

> >      ['byte-stream-buffer',              'byte-stream-buffer.cpp'],
> >      ['camera-sensor',                   'camera-sensor.cpp'],
> >      ['event',                           'event.cpp'],

Patch
diff mbox series

diff --git a/test/bayer_format.cpp b/test/bayer_format.cpp
new file mode 100644
index 00000000..f763500f
--- /dev/null
+++ b/test/bayer_format.cpp
@@ -0,0 +1,210 @@ 
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2020, Sebastian Fricke
+ *
+ * bayer_format.cpp - BayerFormat class tests
+ */
+
+#include <iostream>
+
+#include <libcamera/internal/bayer_format.h>
+#include <libcamera/transform.h>
+
+#include "test.h"
+
+using namespace std;
+using namespace libcamera;
+
+class BayerFormatTest : public Test
+{
+protected:
+	int run()
+	{
+		/* An empty Bayer format has to be invalid. */
+		BayerFormat bayerFmt;
+		if (bayerFmt.isValid()) {
+			cerr << "An empty BayerFormat has to be invalid."
+			     << endl;
+			return TestFail;
+		}
+
+		/* A correct Bayer format has to be valid. */
+		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
+		if (!bayerFmt.isValid()) {
+			cerr << "A correct BayerFormat has to be valid."
+			     << endl;
+			return TestFail;
+		}
+
+		/*
+		 * Two bayer formats created with the same order and bit depth
+		 * have to be equal.
+		 */
+		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
+		BayerFormat bayerFmtExpect = BayerFormat(BayerFormat::BGGR, 8,
+							 BayerFormat::None);
+		if (bayerFmt != bayerFmtExpect) {
+			cerr << "Comparison of identical formats failed."
+			     << endl;
+			return TestFail;
+		}
+
+		/*
+		 * Two Bayer formats created with the same order but with a
+		 * different bitDepth are not equal.
+		 */
+		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
+		bayerFmtExpect = BayerFormat(BayerFormat::BGGR, 12,
+					     BayerFormat::None);
+		if (bayerFmt == bayerFmtExpect) {
+			cerr << "Comparison of divergent formats failed."
+			     << endl;
+			return TestFail;
+		}
+
+		/*
+		 * Create a Bayer format with a V4L2PixelFormat and check if we
+		 * get the same format after converting back to the V4L2 Format.
+		 */
+		V4L2PixelFormat v4l2FmtExpect = V4L2PixelFormat(
+			V4L2_PIX_FMT_SBGGR8);
+		bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2FmtExpect);
+		V4L2PixelFormat v4l2Fmt = bayerFmt.toV4L2PixelFormat();
+		if (v4l2Fmt != v4l2FmtExpect) {
+			cerr << "Expected: '" << v4l2FmtExpect.toString()
+			     << "' got: '" << v4l2Fmt.toString() << "'" << endl;
+			return TestFail;
+		}
+
+		/*
+		 * Use an empty Bayer format and verify that no matching
+		 * V4L2PixelFormat is found.
+		 */
+		v4l2FmtExpect = V4L2PixelFormat();
+		bayerFmt = BayerFormat();
+		v4l2Fmt = bayerFmt.toV4L2PixelFormat();
+		if (v4l2Fmt != v4l2FmtExpect) {
+			cerr << "Expected: empty V4L2PixelFormat got: '"
+			     << v4l2Fmt.toString() << "'" << endl;
+			return TestFail;
+		}
+
+		/*
+		 * Check if we get the expected Bayer format BGGR8
+		 * when we convert the V4L2PixelFormat (V4L2_PIX_FMT_SBGGR8)
+		 * to a Bayer format.
+		 */
+		bayerFmtExpect = BayerFormat(BayerFormat::BGGR, 8,
+					     BayerFormat::None);
+		v4l2Fmt = V4L2PixelFormat(V4L2_PIX_FMT_SBGGR8);
+		bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2Fmt);
+		if (bayerFmt != bayerFmtExpect) {
+			cerr << "Expected BayerFormat '"
+			     << bayerFmtExpect.toString() << "', got: '"
+			     << bayerFmt.toString() << "'" << endl;
+			return TestFail;
+		}
+
+		/*
+		 * Confirm that a V4L2PixelFormat that is not found in
+		 * the conversion table, doesn't yield a Bayer format.
+		 */
+		V4L2PixelFormat v4l2FmtUnknown = V4L2PixelFormat(
+			V4L2_PIX_FMT_BGRA444);
+		bayerFmt = BayerFormat::fromV4L2PixelFormat(v4l2FmtUnknown);
+		if (bayerFmt.isValid()) {
+			cerr << "Expected empty BayerFormat got: '"
+			     << bayerFmt.toString() << "'" << endl;
+			return TestFail;
+		}
+
+		/*
+		 * Test if a valid Bayer format can be converted to a
+		 * string representation.
+		 */
+		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
+		if (bayerFmt.toString() != "BGGR-8") {
+			cerr << "String representation != 'BGGR-8' (got: '"
+			     << bayerFmt.toString() << "' ) " << endl;
+			return TestFail;
+		}
+
+		/*
+		 * Determine if an empty Bayer format results in no
+		 * string representation.
+		 */
+		bayerFmt = BayerFormat();
+		if (bayerFmt.toString() != "INVALID") {
+			cerr << "String representation != 'INVALID' (got: '"
+			     << bayerFmt.toString() << "' ) " << endl;
+			return TestFail;
+		}
+
+		/*
+		 * Perform a horizontal Flip and make sure that the
+		 * order is adjusted accordingly.
+		 */
+		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
+		bayerFmtExpect = BayerFormat(BayerFormat::GBRG, 8,
+					     BayerFormat::None);
+		BayerFormat hFlipFmt = bayerFmt.transform(Transform::HFlip);
+		if (hFlipFmt != bayerFmtExpect) {
+			cerr << "Horizontal flip of 'BGGR-8' should result in '"
+			     << bayerFmtExpect.toString() << "', got: '"
+			     << hFlipFmt.toString() << "'" << endl;
+			return TestFail;
+		}
+
+		/*
+		 * Perform a vertical Flip and make sure that
+		 * the order is adjusted accordingly.
+		 */
+		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
+		bayerFmtExpect = BayerFormat(BayerFormat::GRBG, 8,
+					     BayerFormat::None);
+		BayerFormat vFlipFmt = bayerFmt.transform(Transform::VFlip);
+		if (vFlipFmt != bayerFmtExpect) {
+			cerr << "Vertical flip of 'BGGR-8' should result in '"
+			     << bayerFmtExpect.toString() << "', got: '"
+			     << vFlipFmt.toString() << "'" << endl;
+			return TestFail;
+		}
+
+		/*
+		 * Perform a transposition on a pixel order with both green
+		 * pixels on the bottom left to top right diagonal and make
+		 * sure, that it doesn't change.
+		 */
+		bayerFmt = BayerFormat(BayerFormat::BGGR, 8, BayerFormat::None);
+		BayerFormat transposeFmt = bayerFmt.transform(
+			Transform::Transpose);
+		if (transposeFmt != bayerFmt) {
+			cerr << "Transpose with both green pixels on the "
+			     << "antidiagonal, should not change the order "
+			     << " result: '" << transposeFmt.toString() << "'"
+			     << endl;
+			return TestFail;
+		}
+
+		/*
+		 * Perform a transposition on an pixel order with red and blue
+		 * on the bottom left to top right diagonal and make sure
+		 * that their positions are switched.
+		 */
+		bayerFmt = BayerFormat(BayerFormat::GBRG, 8, BayerFormat::None);
+		bayerFmtExpect = BayerFormat(BayerFormat::GRBG, 8,
+					     BayerFormat::None);
+		transposeFmt = bayerFmt.transform(Transform::Transpose);
+		if (transposeFmt != bayerFmtExpect) {
+			cerr << "Transpose with the red & blue pixels on the "
+			     << "antidiagonal, should switch their position "
+			     << " result: '" << transposeFmt.toString() << "'"
+			     << endl;
+			return TestFail;
+		}
+
+		return TestPass;
+	}
+};
+
+TEST_REGISTER(BayerFormatTest);
diff --git a/test/meson.build b/test/meson.build
index 7f0682ad..709b47aa 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -27,6 +27,7 @@  public_tests = [
 ]
 
 internal_tests = [
+    ['bayer-format',                    'bayer_format.cpp'],
     ['byte-stream-buffer',              'byte-stream-buffer.cpp'],
     ['camera-sensor',                   'camera-sensor.cpp'],
     ['event',                           'event.cpp'],