summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/flags.cpp193
-rw-r--r--test/meson.build1
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'],