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