summaryrefslogtreecommitdiff
path: root/src/apps/common
'#n5'>56789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
AgeCommit message (Expand)Author
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2020, Google Inc.
 *
 * 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)