1 /*
2  * Copyright 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <gtest/gtest.h>
18 #include <ftl/NamedEnum.h>
19 
20 namespace android {
21 
22 // Test enum class maximum enum value smaller than default maximum of 8.
23 enum class TestEnums { ZERO = 0x0, ONE = 0x1, TWO = 0x2, THREE = 0x3, SEVEN = 0x7 };
24 // Big enum contains enum values greater than default maximum of 8.
25 enum class TestBigEnums { ZERO = 0x0, FIFTEEN = 0xF };
26 
27 // Declared to specialize the maximum enum since the enum size exceeds 8 by default.
28 template <>
29 constexpr size_t NamedEnum::max<TestBigEnums> = 16;
30 
31 namespace test {
32 using android::TestBigEnums;
33 using android::TestEnums;
34 
TEST(NamedEnum,RuntimeNamedEnum)35 TEST(NamedEnum, RuntimeNamedEnum) {
36     TestEnums e = TestEnums::ZERO;
37     ASSERT_EQ(NamedEnum::enum_name(e), "ZERO");
38 
39     e = TestEnums::ONE;
40     ASSERT_EQ(NamedEnum::enum_name(e), "ONE");
41 
42     e = TestEnums::THREE;
43     ASSERT_EQ(NamedEnum::enum_name(e), "THREE");
44 
45     e = TestEnums::SEVEN;
46     ASSERT_EQ(NamedEnum::enum_name(e), "SEVEN");
47 }
48 
49 // Test big enum
TEST(NamedEnum,RuntimeBigNamedEnum)50 TEST(NamedEnum, RuntimeBigNamedEnum) {
51     TestBigEnums e = TestBigEnums::ZERO;
52     ASSERT_EQ(NamedEnum::enum_name(e), "ZERO");
53 
54     e = TestBigEnums::FIFTEEN;
55     ASSERT_EQ(NamedEnum::enum_name(e), "FIFTEEN");
56 }
57 
TEST(NamedEnum,RuntimeNamedEnumAsString)58 TEST(NamedEnum, RuntimeNamedEnumAsString) {
59     TestEnums e = TestEnums::ZERO;
60     ASSERT_EQ(NamedEnum::string(e), "ZERO");
61 
62     e = TestEnums::ONE;
63     ASSERT_EQ(NamedEnum::string(e), "ONE");
64 
65     e = TestEnums::THREE;
66     ASSERT_EQ(NamedEnum::string(e), "THREE");
67 
68     e = TestEnums::SEVEN;
69     ASSERT_EQ(NamedEnum::string(e), "SEVEN");
70 }
71 
TEST(NamedEnum,RuntimeBigNamedEnumAsString)72 TEST(NamedEnum, RuntimeBigNamedEnumAsString) {
73     TestBigEnums e = TestBigEnums::ZERO;
74     ASSERT_EQ(NamedEnum::string(e), "ZERO");
75 
76     e = TestBigEnums::FIFTEEN;
77     ASSERT_EQ(NamedEnum::string(e), "FIFTEEN");
78 }
79 
TEST(NamedEnum,RuntimeUnknownNamedEnum)80 TEST(NamedEnum, RuntimeUnknownNamedEnum) {
81     TestEnums e = static_cast<TestEnums>(0x5);
82     ASSERT_EQ(NamedEnum::enum_name(e), std::nullopt);
83     e = static_cast<TestEnums>(0x9);
84     ASSERT_EQ(NamedEnum::enum_name(e), std::nullopt);
85 }
86 
TEST(NamedEnum,RuntimeUnknownNamedEnumAsString)87 TEST(NamedEnum, RuntimeUnknownNamedEnumAsString) {
88     TestEnums e = static_cast<TestEnums>(0x5);
89     ASSERT_EQ(NamedEnum::string(e), "05");
90     e = static_cast<TestEnums>(0x9);
91     ASSERT_EQ(NamedEnum::string(e, "0x%08x"), "0x00000009");
92 }
93 
TEST(NamedEnum,CompileTimeFlagName)94 TEST(NamedEnum, CompileTimeFlagName) {
95     static_assert(NamedEnum::enum_name<TestEnums::TWO>() == "TWO");
96     static_assert(NamedEnum::enum_name<TestEnums::THREE>() == "THREE");
97 }
98 
99 } // namespace test
100 
101 } // namespace android
102