blob: c15fabbfa18bc91f5015ab9429aae7d15ee12799 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
**/
#include <array>
#include "gtest/gtest.h"
#include "utility/EqualsAnyConstant.hpp"
namespace quickstep {
TEST(EqualsAnyConstantTest, IntTest) {
for (int checked = 0; checked < 100; ++checked) {
// Always false when checking against no constants.
EXPECT_FALSE(EqualsAnyConstant(checked));
// Check against a single constant (using the template directly and the
// macro).
EXPECT_EQ(checked == 42,
(EqualsAnyConstant<int, 42>(checked)));
EXPECT_EQ(checked == 42,
QUICKSTEP_EQUALS_ANY_CONSTANT(checked, 42));
// Check against a few constants.
EXPECT_EQ((checked == 2) || (checked == 3) || (checked == 5) || (checked == 7),
(EqualsAnyConstant<int, 2, 3, 5, 7>(checked)));
EXPECT_EQ((checked == 2) || (checked == 3) || (checked == 5) || (checked == 7),
QUICKSTEP_EQUALS_ANY_CONSTANT(checked, 2, 3, 5, 7));
// Check against exactly 8 constants.
EXPECT_EQ((checked == 2) || (checked == 3) || (checked == 5) || (checked == 7)
|| (checked == 11) || (checked == 13) || (checked == 17) || (checked == 19),
(EqualsAnyConstant<int, 2, 3, 5, 7, 11, 13, 17, 19>(checked)));
EXPECT_EQ((checked == 2) || (checked == 3) || (checked == 5) || (checked == 7)
|| (checked == 11) || (checked == 13) || (checked == 17) || (checked == 19),
QUICKSTEP_EQUALS_ANY_CONSTANT(checked, 2, 3, 5, 7, 11, 13, 17, 19));
// Check against more than 8 constants (will recursively expand templates).
EXPECT_EQ((checked == 2) || (checked == 3) || (checked == 5) || (checked == 7)
|| (checked == 11) || (checked == 13) || (checked == 17) || (checked == 19)
|| (checked == 23) || (checked == 29) || (checked == 31) || (checked == 37),
(EqualsAnyConstant<int, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37>(checked)));
EXPECT_EQ((checked == 2) || (checked == 3) || (checked == 5) || (checked == 7)
|| (checked == 11) || (checked == 13) || (checked == 17) || (checked == 19)
|| (checked == 23) || (checked == 29) || (checked == 31) || (checked == 37),
QUICKSTEP_EQUALS_ANY_CONSTANT(checked, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37));
}
}
namespace {
enum class TestEnum {
kCase00, kCase01, kCase02, kCase03, kCase04, kCase05, kCase06, kCase07,
kCase08, kCase09, kCase10, kCase11, kCase12, kCase13, kCase14, kCase15,
kCase16, kCase17, kCase18, kCase19, kCase20, kCase21, kCase22, kCase23,
kCase24, kCase25, kCase26, kCase27, kCase28, kCase29, kCase30, kCase31,
kCase32, kCase33, kCase34, kCase35, kCase36, kCase37, kCase38, kCase39
};
TEST(EqualsAnyConstantTest, EnumTest) {
std::array<TestEnum, 40> all_cases{{
TestEnum::kCase00, TestEnum::kCase01, TestEnum::kCase02, TestEnum::kCase03,
TestEnum::kCase04, TestEnum::kCase05, TestEnum::kCase06, TestEnum::kCase07,
TestEnum::kCase08, TestEnum::kCase09, TestEnum::kCase10, TestEnum::kCase11,
TestEnum::kCase12, TestEnum::kCase13, TestEnum::kCase14, TestEnum::kCase15,
TestEnum::kCase16, TestEnum::kCase17, TestEnum::kCase18, TestEnum::kCase19,
TestEnum::kCase20, TestEnum::kCase21, TestEnum::kCase22, TestEnum::kCase23,
TestEnum::kCase24, TestEnum::kCase25, TestEnum::kCase26, TestEnum::kCase27,
TestEnum::kCase28, TestEnum::kCase29, TestEnum::kCase30, TestEnum::kCase31,
TestEnum::kCase32, TestEnum::kCase33, TestEnum::kCase34, TestEnum::kCase35,
TestEnum::kCase36, TestEnum::kCase37, TestEnum::kCase38, TestEnum::kCase39}};
// We intentionally use a reference type instead of the literal type here to
// make sure that everything still works correctly with references.
for (const TestEnum &checked : all_cases) {
// Always false when checking against no constants.
EXPECT_FALSE(EqualsAnyConstant(checked));
// Check against a single constant (using the template directly and the
// macro).
EXPECT_EQ(checked == TestEnum::kCase32,
(EqualsAnyConstant<TestEnum, TestEnum::kCase32>(checked)));
EXPECT_EQ(checked == TestEnum::kCase32,
QUICKSTEP_EQUALS_ANY_CONSTANT(checked, TestEnum::kCase32));
// Check against a few constants.
EXPECT_EQ((checked == TestEnum::kCase02) || (checked == TestEnum::kCase03)
|| (checked == TestEnum::kCase05) || (checked == TestEnum::kCase07),
(EqualsAnyConstant<TestEnum,
TestEnum::kCase02, TestEnum::kCase03,
TestEnum::kCase05, TestEnum::kCase07>(checked)));
EXPECT_EQ((checked == TestEnum::kCase02) || (checked == TestEnum::kCase03)
|| (checked == TestEnum::kCase05) || (checked == TestEnum::kCase07),
QUICKSTEP_EQUALS_ANY_CONSTANT(checked,
TestEnum::kCase02, TestEnum::kCase03,
TestEnum::kCase05, TestEnum::kCase07));
// Check against exactly 8 constants.
EXPECT_EQ((checked == TestEnum::kCase02) || (checked == TestEnum::kCase03)
|| (checked == TestEnum::kCase05) || (checked == TestEnum::kCase07)
|| (checked == TestEnum::kCase11) || (checked == TestEnum::kCase13)
|| (checked == TestEnum::kCase17) || (checked == TestEnum::kCase19),
(EqualsAnyConstant<TestEnum,
TestEnum::kCase02, TestEnum::kCase03,
TestEnum::kCase05, TestEnum::kCase07,
TestEnum::kCase11, TestEnum::kCase13,
TestEnum::kCase17, TestEnum::kCase19>(checked)));
EXPECT_EQ((checked == TestEnum::kCase02) || (checked == TestEnum::kCase03)
|| (checked == TestEnum::kCase05) || (checked == TestEnum::kCase07)
|| (checked == TestEnum::kCase11) || (checked == TestEnum::kCase13)
|| (checked == TestEnum::kCase17) || (checked == TestEnum::kCase19),
QUICKSTEP_EQUALS_ANY_CONSTANT(checked,
TestEnum::kCase02, TestEnum::kCase03,
TestEnum::kCase05, TestEnum::kCase07,
TestEnum::kCase11, TestEnum::kCase13,
TestEnum::kCase17, TestEnum::kCase19));
// Check against more than 8 constants (will recursively expand templates).
EXPECT_EQ((checked == TestEnum::kCase02) || (checked == TestEnum::kCase03)
|| (checked == TestEnum::kCase05) || (checked == TestEnum::kCase07)
|| (checked == TestEnum::kCase11) || (checked == TestEnum::kCase13)
|| (checked == TestEnum::kCase17) || (checked == TestEnum::kCase19)
|| (checked == TestEnum::kCase23) || (checked == TestEnum::kCase29)
|| (checked == TestEnum::kCase31) || (checked == TestEnum::kCase37),
(EqualsAnyConstant<TestEnum,
TestEnum::kCase02, TestEnum::kCase03,
TestEnum::kCase05, TestEnum::kCase07,
TestEnum::kCase11, TestEnum::kCase13,
TestEnum::kCase17, TestEnum::kCase19,
TestEnum::kCase23, TestEnum::kCase29,
TestEnum::kCase31, TestEnum::kCase37>(checked)));
EXPECT_EQ((checked == TestEnum::kCase02) || (checked == TestEnum::kCase03)
|| (checked == TestEnum::kCase05) || (checked == TestEnum::kCase07)
|| (checked == TestEnum::kCase11) || (checked == TestEnum::kCase13)
|| (checked == TestEnum::kCase17) || (checked == TestEnum::kCase19)
|| (checked == TestEnum::kCase23) || (checked == TestEnum::kCase29)
|| (checked == TestEnum::kCase31) || (checked == TestEnum::kCase37),
QUICKSTEP_EQUALS_ANY_CONSTANT(checked,
TestEnum::kCase02, TestEnum::kCase03,
TestEnum::kCase05, TestEnum::kCase07,
TestEnum::kCase11, TestEnum::kCase13,
TestEnum::kCase17, TestEnum::kCase19,
TestEnum::kCase23, TestEnum::kCase29,
TestEnum::kCase31, TestEnum::kCase37));
}
}
} // namespace
} // namespace quickstep