xref: /aosp_15_r20/external/emboss/compiler/back_end/cpp/testcode/enum_case_test.cc (revision 99e0aae7469b87d12f0ad23e61142c2d74c1ef70)
1 // Copyright 2023 Google LLC
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // Tests the `enum_case` attribute generating the correct case. Note that since
16 // these tests are regarding the name of enum members, it is likely that if this
17 // test would fail, it may fail to compile.
18 
19 #include "gtest/gtest.h"
20 #include "testdata/enum_case.emb.h"
21 
22 namespace emboss {
23 namespace test {
24 namespace {
25 
TEST(EnumShouty,AccessValuesByNameInSource)26 TEST(EnumShouty, AccessValuesByNameInSource) {
27   EXPECT_EQ(static_cast<int>(EnumShouty::FIRST), 0);
28   EXPECT_EQ(static_cast<int>(EnumShouty::SECOND), 1);
29   EXPECT_EQ(static_cast<int>(EnumShouty::TWO_WORD), 2);
30   EXPECT_EQ(static_cast<int>(EnumShouty::THREE_WORD_ENUM), 4);
31   EXPECT_EQ(static_cast<int>(EnumShouty::LONG_ENUM_VALUE_NAME), 8);
32 }
33 
TEST(EnumShouty,EnumIsKnown)34 TEST(EnumShouty, EnumIsKnown) {
35   EXPECT_TRUE(EnumIsKnown(EnumShouty::FIRST));
36   EXPECT_TRUE(EnumIsKnown(EnumShouty::SECOND));
37   EXPECT_TRUE(EnumIsKnown(EnumShouty::TWO_WORD));
38   EXPECT_TRUE(EnumIsKnown(EnumShouty::THREE_WORD_ENUM));
39   EXPECT_TRUE(EnumIsKnown(EnumShouty::LONG_ENUM_VALUE_NAME));
40   EXPECT_FALSE(EnumIsKnown(static_cast<EnumShouty>(999)));
41 }
42 
TEST(EnumShouty,NameToEnum)43 TEST(EnumShouty, NameToEnum) {
44   EnumShouty result;
45 
46   EXPECT_TRUE(TryToGetEnumFromName("FIRST", &result));
47   EXPECT_EQ(EnumShouty::FIRST, result);
48   EXPECT_TRUE(TryToGetEnumFromName("SECOND", &result));
49   EXPECT_EQ(EnumShouty::SECOND, result);
50   EXPECT_TRUE(TryToGetEnumFromName("TWO_WORD", &result));
51   EXPECT_EQ(EnumShouty::TWO_WORD, result);
52   EXPECT_TRUE(TryToGetEnumFromName("THREE_WORD_ENUM", &result));
53   EXPECT_EQ(EnumShouty::THREE_WORD_ENUM, result);
54   EXPECT_TRUE(TryToGetEnumFromName("LONG_ENUM_VALUE_NAME", &result));
55   EXPECT_EQ(EnumShouty::LONG_ENUM_VALUE_NAME, result);
56 }
57 
TEST(EnumShouty,NameToEnumFailsWithKCamel)58 TEST(EnumShouty, NameToEnumFailsWithKCamel) {
59   EnumShouty result = EnumShouty::FIRST;
60 
61   EXPECT_FALSE(TryToGetEnumFromName("kSecond", &result));
62   EXPECT_EQ(EnumShouty::FIRST, result);
63   EXPECT_FALSE(TryToGetEnumFromName("kTwoWord", &result));
64   EXPECT_EQ(EnumShouty::FIRST, result);
65   EXPECT_FALSE(TryToGetEnumFromName("kThreeWordEnum", &result));
66   EXPECT_EQ(EnumShouty::FIRST, result);
67   EXPECT_FALSE(TryToGetEnumFromName("kLongEnumValueName", &result));
68   EXPECT_EQ(EnumShouty::FIRST, result);
69 }
70 
TEST(EnumShouty,EnumToName)71 TEST(EnumShouty, EnumToName) {
72   EXPECT_EQ("FIRST", TryToGetNameFromEnum(EnumShouty::FIRST));
73   EXPECT_EQ("SECOND", TryToGetNameFromEnum(EnumShouty::SECOND));
74   EXPECT_EQ("TWO_WORD", TryToGetNameFromEnum(EnumShouty::TWO_WORD));
75   EXPECT_EQ("THREE_WORD_ENUM",
76     TryToGetNameFromEnum(EnumShouty::THREE_WORD_ENUM));
77   EXPECT_EQ("LONG_ENUM_VALUE_NAME",
78     TryToGetNameFromEnum(EnumShouty::LONG_ENUM_VALUE_NAME));
79 }
80 
TEST(EnumDefault,AccessValuesByNameInSource)81 TEST(EnumDefault, AccessValuesByNameInSource) {
82   EXPECT_EQ(static_cast<int>(EnumDefault::kFirst), 0);
83   EXPECT_EQ(static_cast<int>(EnumDefault::kSecond), 1);
84   EXPECT_EQ(static_cast<int>(EnumDefault::kTwoWord), 2);
85   EXPECT_EQ(static_cast<int>(EnumDefault::kThreeWordEnum), 4);
86   EXPECT_EQ(static_cast<int>(EnumDefault::kLongEnumValueName), 8);
87 }
88 
TEST(EnumDefault,EnumIsKnown)89 TEST(EnumDefault, EnumIsKnown) {
90   EXPECT_TRUE(EnumIsKnown(EnumDefault::kFirst));
91   EXPECT_TRUE(EnumIsKnown(EnumDefault::kSecond));
92   EXPECT_TRUE(EnumIsKnown(EnumDefault::kTwoWord));
93   EXPECT_TRUE(EnumIsKnown(EnumDefault::kThreeWordEnum));
94   EXPECT_TRUE(EnumIsKnown(EnumDefault::kLongEnumValueName));
95   EXPECT_FALSE(EnumIsKnown(static_cast<EnumDefault>(999)));
96 }
97 
TEST(EnumDefault,NameToEnum)98 TEST(EnumDefault, NameToEnum) {
99   EnumDefault result;
100 
101   EXPECT_TRUE(TryToGetEnumFromName("FIRST", &result));
102   EXPECT_EQ(EnumDefault::kFirst, result);
103   EXPECT_TRUE(TryToGetEnumFromName("SECOND", &result));
104   EXPECT_EQ(EnumDefault::kSecond, result);
105   EXPECT_TRUE(TryToGetEnumFromName("TWO_WORD", &result));
106   EXPECT_EQ(EnumDefault::kTwoWord, result);
107   EXPECT_TRUE(TryToGetEnumFromName("THREE_WORD_ENUM", &result));
108   EXPECT_EQ(EnumDefault::kThreeWordEnum, result);
109   EXPECT_TRUE(TryToGetEnumFromName("LONG_ENUM_VALUE_NAME", &result));
110   EXPECT_EQ(EnumDefault::kLongEnumValueName, result);
111 }
112 
TEST(EnumDefault,NameToEnumFailsWithKCamel)113 TEST(EnumDefault, NameToEnumFailsWithKCamel) {
114   EnumDefault result = EnumDefault::kFirst;
115 
116   EXPECT_FALSE(TryToGetEnumFromName("kFirst", &result));
117   EXPECT_EQ(EnumDefault::kFirst, result);
118   EXPECT_FALSE(TryToGetEnumFromName("kSecond", &result));
119   EXPECT_EQ(EnumDefault::kFirst, result);
120   EXPECT_FALSE(TryToGetEnumFromName("kTwoWord", &result));
121   EXPECT_EQ(EnumDefault::kFirst, result);
122   EXPECT_FALSE(TryToGetEnumFromName("kThreeWordEnum", &result));
123   EXPECT_EQ(EnumDefault::kFirst, result);
124   EXPECT_FALSE(TryToGetEnumFromName("kLongEnumValueName", &result));
125   EXPECT_EQ(EnumDefault::kFirst, result);
126 }
127 
TEST(EnumDefault,EnumToName)128 TEST(EnumDefault, EnumToName) {
129   EXPECT_EQ("FIRST", TryToGetNameFromEnum(EnumDefault::kFirst));
130   EXPECT_EQ("SECOND", TryToGetNameFromEnum(EnumDefault::kSecond));
131   EXPECT_EQ("TWO_WORD", TryToGetNameFromEnum(EnumDefault::kTwoWord));
132   EXPECT_EQ("THREE_WORD_ENUM",
133     TryToGetNameFromEnum(EnumDefault::kThreeWordEnum));
134   EXPECT_EQ("LONG_ENUM_VALUE_NAME",
135     TryToGetNameFromEnum(EnumDefault::kLongEnumValueName));
136 }
137 
TEST(EnumShoutyAndKCamel,AccessValuesByNameInSource)138 TEST(EnumShoutyAndKCamel, AccessValuesByNameInSource) {
139   EXPECT_EQ(static_cast<int>(EnumShoutyAndKCamel::FIRST), 0);
140   EXPECT_EQ(static_cast<int>(EnumShoutyAndKCamel::kFirst), 0);
141   EXPECT_EQ(static_cast<int>(EnumShoutyAndKCamel::SECOND), 1);
142   EXPECT_EQ(static_cast<int>(EnumShoutyAndKCamel::kSecond), 1);
143   EXPECT_EQ(static_cast<int>(EnumShoutyAndKCamel::TWO_WORD), 2);
144   EXPECT_EQ(static_cast<int>(EnumShoutyAndKCamel::kTwoWord), 2);
145   EXPECT_EQ(static_cast<int>(EnumShoutyAndKCamel::THREE_WORD_ENUM), 4);
146   EXPECT_EQ(static_cast<int>(EnumShoutyAndKCamel::kThreeWordEnum), 4);
147   EXPECT_EQ(static_cast<int>(EnumShoutyAndKCamel::LONG_ENUM_VALUE_NAME), 8);
148   EXPECT_EQ(static_cast<int>(EnumShoutyAndKCamel::kLongEnumValueName), 8);
149 }
150 
TEST(EnumShoutyAndKCamel,EnumIsKnown)151 TEST(EnumShoutyAndKCamel, EnumIsKnown) {
152   EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::FIRST));
153   EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::SECOND));
154   EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::TWO_WORD));
155   EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::THREE_WORD_ENUM));
156   EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::LONG_ENUM_VALUE_NAME));
157   EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::kFirst));
158   EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::kSecond));
159   EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::kTwoWord));
160   EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::kThreeWordEnum));
161   EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::kLongEnumValueName));
162   EXPECT_FALSE(EnumIsKnown(static_cast<EnumShoutyAndKCamel>(999)));
163 }
164 
TEST(EnumShoutyAndKCamel,NameToEnum)165 TEST(EnumShoutyAndKCamel, NameToEnum) {
166   EnumShoutyAndKCamel result;
167 
168   EXPECT_TRUE(TryToGetEnumFromName("FIRST", &result));
169   EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result);
170   EXPECT_TRUE(TryToGetEnumFromName("SECOND", &result));
171   EXPECT_EQ(EnumShoutyAndKCamel::SECOND, result);
172   EXPECT_TRUE(TryToGetEnumFromName("TWO_WORD", &result));
173   EXPECT_EQ(EnumShoutyAndKCamel::TWO_WORD, result);
174   EXPECT_TRUE(TryToGetEnumFromName("THREE_WORD_ENUM", &result));
175   EXPECT_EQ(EnumShoutyAndKCamel::THREE_WORD_ENUM, result);
176   EXPECT_TRUE(TryToGetEnumFromName("LONG_ENUM_VALUE_NAME", &result));
177   EXPECT_EQ(EnumShoutyAndKCamel::LONG_ENUM_VALUE_NAME, result);
178 }
179 
TEST(EnumShoutyAndKCamel,NameToEnumFailsWithKCamel)180 TEST(EnumShoutyAndKCamel, NameToEnumFailsWithKCamel) {
181   EnumShoutyAndKCamel result = EnumShoutyAndKCamel::FIRST;
182 
183   EXPECT_FALSE(TryToGetEnumFromName("kFirst", &result));
184   EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result);
185   EXPECT_FALSE(TryToGetEnumFromName("kSecond", &result));
186   EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result);
187   EXPECT_FALSE(TryToGetEnumFromName("kTwoWord", &result));
188   EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result);
189   EXPECT_FALSE(TryToGetEnumFromName("kThreeWordEnum", &result));
190   EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result);
191   EXPECT_FALSE(TryToGetEnumFromName("kLongEnumValueName", &result));
192   EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result);
193 }
194 
TEST(EnumShoutyAndKCamel,EnumToName)195 TEST(EnumShoutyAndKCamel, EnumToName) {
196   EXPECT_EQ("FIRST", TryToGetNameFromEnum(EnumShoutyAndKCamel::FIRST));
197   EXPECT_EQ("SECOND", TryToGetNameFromEnum(EnumShoutyAndKCamel::SECOND));
198   EXPECT_EQ("TWO_WORD", TryToGetNameFromEnum(EnumShoutyAndKCamel::TWO_WORD));
199   EXPECT_EQ("THREE_WORD_ENUM",
200     TryToGetNameFromEnum(EnumShoutyAndKCamel::THREE_WORD_ENUM));
201   EXPECT_EQ("LONG_ENUM_VALUE_NAME",
202     TryToGetNameFromEnum(EnumShoutyAndKCamel::LONG_ENUM_VALUE_NAME));
203 
204   EXPECT_EQ("FIRST", TryToGetNameFromEnum(EnumShoutyAndKCamel::kFirst));
205   EXPECT_EQ("SECOND", TryToGetNameFromEnum(EnumShoutyAndKCamel::kSecond));
206   EXPECT_EQ("TWO_WORD", TryToGetNameFromEnum(EnumShoutyAndKCamel::kTwoWord));
207   EXPECT_EQ("THREE_WORD_ENUM",
208     TryToGetNameFromEnum(EnumShoutyAndKCamel::kThreeWordEnum));
209   EXPECT_EQ("LONG_ENUM_VALUE_NAME",
210     TryToGetNameFromEnum(EnumShoutyAndKCamel::kLongEnumValueName));
211 }
212 
TEST(EnumMixed,AccessValuesByNameInSource)213 TEST(EnumMixed, AccessValuesByNameInSource) {
214   EXPECT_EQ(static_cast<int>(EnumMixed::FIRST), 0);
215   EXPECT_EQ(static_cast<int>(EnumMixed::kFirst), 0);
216   EXPECT_EQ(static_cast<int>(EnumMixed::SECOND), 1);
217   EXPECT_EQ(static_cast<int>(EnumMixed::kTwoWord), 2);
218   EXPECT_EQ(static_cast<int>(EnumMixed::THREE_WORD_ENUM), 4);
219   EXPECT_EQ(static_cast<int>(EnumMixed::kThreeWordEnum), 4);
220   EXPECT_EQ(static_cast<int>(EnumMixed::kLongEnumValueName), 8);
221 }
222 
TEST(EnumMixed,EnumIsKnown)223 TEST(EnumMixed, EnumIsKnown) {
224   EXPECT_TRUE(EnumIsKnown(EnumMixed::FIRST));
225   EXPECT_TRUE(EnumIsKnown(EnumMixed::SECOND));
226   EXPECT_TRUE(EnumIsKnown(EnumMixed::THREE_WORD_ENUM));
227   EXPECT_TRUE(EnumIsKnown(EnumMixed::kFirst));
228   EXPECT_TRUE(EnumIsKnown(EnumMixed::kTwoWord));
229   EXPECT_TRUE(EnumIsKnown(EnumMixed::kThreeWordEnum));
230   EXPECT_TRUE(EnumIsKnown(EnumMixed::kLongEnumValueName));
231   EXPECT_FALSE(EnumIsKnown(static_cast<EnumMixed>(999)));
232 }
233 
TEST(EnumMixed,NameToEnum)234 TEST(EnumMixed, NameToEnum) {
235   EnumMixed result;
236 
237   EXPECT_TRUE(TryToGetEnumFromName("FIRST", &result));
238   EXPECT_EQ(EnumMixed::FIRST, result);
239   EXPECT_TRUE(TryToGetEnumFromName("SECOND", &result));
240   EXPECT_EQ(EnumMixed::SECOND, result);
241   EXPECT_TRUE(TryToGetEnumFromName("TWO_WORD", &result));
242   EXPECT_EQ(EnumMixed::kTwoWord, result);
243   EXPECT_TRUE(TryToGetEnumFromName("THREE_WORD_ENUM", &result));
244   EXPECT_EQ(EnumMixed::THREE_WORD_ENUM, result);
245   EXPECT_TRUE(TryToGetEnumFromName("LONG_ENUM_VALUE_NAME", &result));
246   EXPECT_EQ(EnumMixed::kLongEnumValueName, result);
247 }
248 
TEST(EnumMixed,NameToEnumFailsWithKCamel)249 TEST(EnumMixed, NameToEnumFailsWithKCamel) {
250   EnumShoutyAndKCamel result = EnumShoutyAndKCamel::FIRST;
251 
252   EXPECT_FALSE(TryToGetEnumFromName("kFirst", &result));
253   EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result);
254   EXPECT_FALSE(TryToGetEnumFromName("kSecond", &result));
255   EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result);
256   EXPECT_FALSE(TryToGetEnumFromName("kTwoWord", &result));
257   EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result);
258   EXPECT_FALSE(TryToGetEnumFromName("kThreeWordEnum", &result));
259   EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result);
260   EXPECT_FALSE(TryToGetEnumFromName("kLongEnumValueName", &result));
261   EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result);
262 }
263 
TEST(EnumMixed,EnumToName)264 TEST(EnumMixed, EnumToName) {
265   EXPECT_EQ("FIRST", TryToGetNameFromEnum(EnumMixed::FIRST));
266   EXPECT_EQ("FIRST", TryToGetNameFromEnum(EnumMixed::kFirst));
267   EXPECT_EQ("SECOND", TryToGetNameFromEnum(EnumMixed::SECOND));
268   EXPECT_EQ("TWO_WORD", TryToGetNameFromEnum(EnumMixed::kTwoWord));
269   EXPECT_EQ("THREE_WORD_ENUM",
270     TryToGetNameFromEnum(EnumMixed::THREE_WORD_ENUM));
271   EXPECT_EQ("THREE_WORD_ENUM",
272     TryToGetNameFromEnum(EnumMixed::kThreeWordEnum));
273   EXPECT_EQ("LONG_ENUM_VALUE_NAME",
274     TryToGetNameFromEnum(EnumMixed::kLongEnumValueName));
275 }
276 
TEST(UseKCamelEnumCase,IsValidToUse)277 TEST(UseKCamelEnumCase, IsValidToUse) {
278   std::array<uint8_t, UseKCamelEnumCase::IntrinsicSizeInBytes()> buffer;
279   auto view = MakeUseKCamelEnumCaseView(&buffer);
280 
281   EXPECT_EQ(UseKCamelEnumCase::first(), EnumDefault::kFirst);
282   EXPECT_EQ(view.first().Read(), EnumDefault::kFirst);
283 
284   EXPECT_TRUE(view.v().TryToWrite(EnumDefault::kSecond));
285   EXPECT_FALSE(view.v_is_first().Read());
286 
287   EXPECT_TRUE(view.v().TryToWrite(EnumDefault::kFirst));
288   EXPECT_TRUE(view.v_is_first().Read());
289 }
290 
TEST(UseKCamelEnumCase,TextStream)291 TEST(UseKCamelEnumCase, TextStream) {
292   std::array<uint8_t, UseKCamelEnumCase::IntrinsicSizeInBytes()> buffer;
293   auto view = MakeUseKCamelEnumCaseView(&buffer);
294 
295   EXPECT_TRUE(view.v().TryToWrite(EnumDefault::kSecond));
296   EXPECT_EQ(WriteToString(view), "{ v: SECOND }");
297   EXPECT_TRUE(UpdateFromText(view, "{ v: TWO_WORD }"));
298   EXPECT_EQ(view.v().Read(), EnumDefault::kTwoWord);
299 }
300 
301 }  // namespace
302 }  // namespace test
303 }  // namespace emboss
304