| /** |
| * 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 |