blob: 2177e247e6cd65faf45c389821e44678162727bf [file] [log] [blame]
/* 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)