diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2020-07-13 01:53:24 +0300 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2021-08-03 10:55:21 +0300 |
commit | f7c6b1228bb0073ebdcab04599e96de0ace31064 (patch) | |
tree | 3d3c93e6d8c33255a52c180aa55f3782e03e9739 | |
parent | 87c18aab8c32d4ec07ea166721ae847b72f7418a (diff) |
test: Add tests for the Flags class
Add tests that exercise the whole API of the Flags class.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
-rw-r--r-- | test/flags.cpp | 193 | ||||
-rw-r--r-- | test/meson.build | 1 |
2 files changed, 194 insertions, 0 deletions
diff --git a/test/flags.cpp b/test/flags.cpp new file mode 100644 index 00000000..2177e247 --- /dev/null +++ b/test/flags.cpp @@ -0,0 +1,193 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2020, Google Inc. + * + * flags.cpp - Flags tests + */ + +#include <iostream> + +#include <libcamera/base/flags.h> + +#include "test.h" + +using namespace libcamera; +using namespace std; + +class FlagsTest : public Test +{ +protected: + enum class Option { + First = (1 << 0), + Second = (1 << 1), + Third = (1 << 2), + }; + + using Options = Flags<Option>; + + enum class Mode { + Alpha = (1 << 0), + Beta = (1 << 1), + Gamma = (1 << 2), + }; + + using Modes = Flags<Mode>; + + int run() override; +}; + +namespace libcamera { + +LIBCAMERA_FLAGS_ENABLE_OPERATORS(FlagsTest::Option) + +} /* namespace libcamera */ + +int FlagsTest::run() +{ + /* Commented-out constructs are expected not to compile. */ + + /* Flags<int> f; */ + + /* + * Unary operators with enum argument. + */ + + Options options; + + if (options) { + cerr << "Default-constructed Flags<> is not zero" << endl; + return TestFail; + } + + options |= Option::First; + if (!options || options != Option::First) { + cerr << "Unary bitwise OR with enum failed" << endl; + return TestFail; + } + + /* options &= Mode::Alpha; */ + /* options |= Mode::Beta; */ + /* options ^= Mode::Gamma; */ + + options &= ~Option::First; + if (options) { + cerr << "Unary bitwise AND with enum failed" << endl; + return TestFail; + } + + options ^= Option::Second; + if (options != Option::Second) { + cerr << "Unary bitwise XOR with enum failed" << endl; + return TestFail; + } + + options = Options(); + + /* + * Unary operators with Flags argument. + */ + + options |= Options(Option::First); + if (options != Option::First) { + cerr << "Unary bitwise OR with Flags<> failed" << endl; + return TestFail; + } + + /* options &= Options(Mode::Alpha); */ + /* options |= Options(Mode::Beta); */ + /* options ^= Options(Mode::Gamma); */ + + options &= ~Options(Option::First); + if (options) { + cerr << "Unary bitwise AND with Flags<> failed" << endl; + return TestFail; + } + + options ^= Options(Option::Second); + if (options != Option::Second) { + cerr << "Unary bitwise XOR with Flags<> failed" << endl; + return TestFail; + } + + options = Options(); + + /* + * Binary operators with enum argument. + */ + + options = options | Option::First; + if (!(options & Option::First)) { + cerr << "Binary bitwise OR with enum failed" << endl; + return TestFail; + } + + /* options = options & Mode::Alpha; */ + /* options = options | Mode::Beta; */ + /* options = options ^ Mode::Gamma; */ + + options = options & ~Option::First; + if (options != (Option::First & Option::Second)) { + cerr << "Binary bitwise AND with enum failed" << endl; + return TestFail; + } + + options = options ^ (Option::First ^ Option::Second); + if (options != (Option::First | Option::Second)) { + cerr << "Binary bitwise XOR with enum failed" << endl; + return TestFail; + } + + options = Options(); + + /* + * Binary operators with Flags argument. + */ + + options |= Options(Option::First); + if (!(options & Option::First)) { + cerr << "Binary bitwise OR with Flags<> failed" << endl; + return TestFail; + } + + /* options = options & Options(Mode::Alpha); */ + /* options = options | Options(Mode::Beta); */ + /* options = options ^ Options(Mode::Gamma); */ + + options = options & ~Options(Option::First); + if (options) { + cerr << "Binary bitwise AND with Flags<> failed" << endl; + return TestFail; + } + + options = options ^ Options(Option::Second); + if (options != Option::Second) { + cerr << "Binary bitwise XOR with Flags<> failed" << endl; + return TestFail; + } + + options = Options(); + + /* + * Conversion operators. + */ + + options |= Option::First | Option::Second | Option::Third; + if (static_cast<Options::Type>(options) != 7) { + cerr << "Cast to underlying type failed" << endl; + return TestFail; + } + + /* + * Conversion of the result of ninary operators on the underlying enum. + */ + + /* unsigned int val1 = Option::First; */ + /* unsigned int val2 = ~Option::First; */ + /* unsigned int val3 = Option::First | Option::Second; */ + /* Option val4 = ~Option::First; */ + /* Option val5 = Option::First | Option::Second; */ + + return TestPass; +} + +TEST_REGISTER(FlagsTest) diff --git a/test/meson.build b/test/meson.build index 2c3e7654..3bceb5df 100644 --- a/test/meson.build +++ b/test/meson.build @@ -40,6 +40,7 @@ internal_tests = [ ['event-thread', 'event-thread.cpp'], ['file', 'file.cpp'], ['file-descriptor', 'file-descriptor.cpp'], + ['flags', 'flags.cpp'], ['hotplug-cameras', 'hotplug-cameras.cpp'], ['mapped-buffer', 'mapped-buffer.cpp'], ['message', 'message.cpp'], |