From e09c487b97f8cd78944cc27ea28723622aed080b Mon Sep 17 00:00:00 2001 From: Sebastian Fricke Date: Tue, 26 Jan 2021 19:48:54 +0100 Subject: test: Add unit tests for the BayerFormat class Test all of the present methods including the newly implemented `fromV4L2PixelFormat`, as well as the new operators `==/!=`. Reviewed-by: Jacopo Mondi Reviewed-by: Laurent Pinchart Reviewed-by: David Plowman Signed-off-by: Sebastian Fricke Signed-off-by: Laurent Pinchart --- test/bayer-format.cpp | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++ test/meson.build | 1 + 2 files changed, 211 insertions(+) create mode 100644 test/bayer-format.cpp (limited to 'test') diff --git a/test/bayer-format.cpp b/test/bayer-format.cpp new file mode 100644 index 00000000..047e7db3 --- /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 + +#include +#include + +#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 different 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 " + << "(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 " + << "(got '" << transposeFmt.toString() << "')" + << endl; + return TestFail; + } + + return TestPass; + } +}; + +TEST_REGISTER(BayerFormatTest) diff --git a/test/meson.build b/test/meson.build index 065c5586..89e6ebff 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'], ['delayed_contols', 'delayed_contols.cpp'], -- cgit v1.2.1