diff options
Diffstat (limited to 'test/flags.cpp')
-rw-r--r-- | test/flags.cpp | 193 |
1 files changed, 193 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) |