// Copyright 2023 Google LLC // // Licensed 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 // // https://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. // Tests the `enum_case` attribute generating the correct case. Note that since // these tests are regarding the name of enum members, it is likely that if this // test would fail, it may fail to compile. #include "gtest/gtest.h" #include "testdata/enum_case.emb.h" namespace emboss { namespace test { namespace { TEST(EnumShouty, AccessValuesByNameInSource) { EXPECT_EQ(static_cast(EnumShouty::FIRST), 0); EXPECT_EQ(static_cast(EnumShouty::SECOND), 1); EXPECT_EQ(static_cast(EnumShouty::TWO_WORD), 2); EXPECT_EQ(static_cast(EnumShouty::THREE_WORD_ENUM), 4); EXPECT_EQ(static_cast(EnumShouty::LONG_ENUM_VALUE_NAME), 8); } TEST(EnumShouty, EnumIsKnown) { EXPECT_TRUE(EnumIsKnown(EnumShouty::FIRST)); EXPECT_TRUE(EnumIsKnown(EnumShouty::SECOND)); EXPECT_TRUE(EnumIsKnown(EnumShouty::TWO_WORD)); EXPECT_TRUE(EnumIsKnown(EnumShouty::THREE_WORD_ENUM)); EXPECT_TRUE(EnumIsKnown(EnumShouty::LONG_ENUM_VALUE_NAME)); EXPECT_FALSE(EnumIsKnown(static_cast(999))); } TEST(EnumShouty, NameToEnum) { EnumShouty result; EXPECT_TRUE(TryToGetEnumFromName("FIRST", &result)); EXPECT_EQ(EnumShouty::FIRST, result); EXPECT_TRUE(TryToGetEnumFromName("SECOND", &result)); EXPECT_EQ(EnumShouty::SECOND, result); EXPECT_TRUE(TryToGetEnumFromName("TWO_WORD", &result)); EXPECT_EQ(EnumShouty::TWO_WORD, result); EXPECT_TRUE(TryToGetEnumFromName("THREE_WORD_ENUM", &result)); EXPECT_EQ(EnumShouty::THREE_WORD_ENUM, result); EXPECT_TRUE(TryToGetEnumFromName("LONG_ENUM_VALUE_NAME", &result)); EXPECT_EQ(EnumShouty::LONG_ENUM_VALUE_NAME, result); } TEST(EnumShouty, NameToEnumFailsWithKCamel) { EnumShouty result = EnumShouty::FIRST; EXPECT_FALSE(TryToGetEnumFromName("kSecond", &result)); EXPECT_EQ(EnumShouty::FIRST, result); EXPECT_FALSE(TryToGetEnumFromName("kTwoWord", &result)); EXPECT_EQ(EnumShouty::FIRST, result); EXPECT_FALSE(TryToGetEnumFromName("kThreeWordEnum", &result)); EXPECT_EQ(EnumShouty::FIRST, result); EXPECT_FALSE(TryToGetEnumFromName("kLongEnumValueName", &result)); EXPECT_EQ(EnumShouty::FIRST, result); } TEST(EnumShouty, EnumToName) { EXPECT_EQ("FIRST", TryToGetNameFromEnum(EnumShouty::FIRST)); EXPECT_EQ("SECOND", TryToGetNameFromEnum(EnumShouty::SECOND)); EXPECT_EQ("TWO_WORD", TryToGetNameFromEnum(EnumShouty::TWO_WORD)); EXPECT_EQ("THREE_WORD_ENUM", TryToGetNameFromEnum(EnumShouty::THREE_WORD_ENUM)); EXPECT_EQ("LONG_ENUM_VALUE_NAME", TryToGetNameFromEnum(EnumShouty::LONG_ENUM_VALUE_NAME)); } TEST(EnumDefault, AccessValuesByNameInSource) { EXPECT_EQ(static_cast(EnumDefault::kFirst), 0); EXPECT_EQ(static_cast(EnumDefault::kSecond), 1); EXPECT_EQ(static_cast(EnumDefault::kTwoWord), 2); EXPECT_EQ(static_cast(EnumDefault::kThreeWordEnum), 4); EXPECT_EQ(static_cast(EnumDefault::kLongEnumValueName), 8); } TEST(EnumDefault, EnumIsKnown) { EXPECT_TRUE(EnumIsKnown(EnumDefault::kFirst)); EXPECT_TRUE(EnumIsKnown(EnumDefault::kSecond)); EXPECT_TRUE(EnumIsKnown(EnumDefault::kTwoWord)); EXPECT_TRUE(EnumIsKnown(EnumDefault::kThreeWordEnum)); EXPECT_TRUE(EnumIsKnown(EnumDefault::kLongEnumValueName)); EXPECT_FALSE(EnumIsKnown(static_cast(999))); } TEST(EnumDefault, NameToEnum) { EnumDefault result; EXPECT_TRUE(TryToGetEnumFromName("FIRST", &result)); EXPECT_EQ(EnumDefault::kFirst, result); EXPECT_TRUE(TryToGetEnumFromName("SECOND", &result)); EXPECT_EQ(EnumDefault::kSecond, result); EXPECT_TRUE(TryToGetEnumFromName("TWO_WORD", &result)); EXPECT_EQ(EnumDefault::kTwoWord, result); EXPECT_TRUE(TryToGetEnumFromName("THREE_WORD_ENUM", &result)); EXPECT_EQ(EnumDefault::kThreeWordEnum, result); EXPECT_TRUE(TryToGetEnumFromName("LONG_ENUM_VALUE_NAME", &result)); EXPECT_EQ(EnumDefault::kLongEnumValueName, result); } TEST(EnumDefault, NameToEnumFailsWithKCamel) { EnumDefault result = EnumDefault::kFirst; EXPECT_FALSE(TryToGetEnumFromName("kFirst", &result)); EXPECT_EQ(EnumDefault::kFirst, result); EXPECT_FALSE(TryToGetEnumFromName("kSecond", &result)); EXPECT_EQ(EnumDefault::kFirst, result); EXPECT_FALSE(TryToGetEnumFromName("kTwoWord", &result)); EXPECT_EQ(EnumDefault::kFirst, result); EXPECT_FALSE(TryToGetEnumFromName("kThreeWordEnum", &result)); EXPECT_EQ(EnumDefault::kFirst, result); EXPECT_FALSE(TryToGetEnumFromName("kLongEnumValueName", &result)); EXPECT_EQ(EnumDefault::kFirst, result); } TEST(EnumDefault, EnumToName) { EXPECT_EQ("FIRST", TryToGetNameFromEnum(EnumDefault::kFirst)); EXPECT_EQ("SECOND", TryToGetNameFromEnum(EnumDefault::kSecond)); EXPECT_EQ("TWO_WORD", TryToGetNameFromEnum(EnumDefault::kTwoWord)); EXPECT_EQ("THREE_WORD_ENUM", TryToGetNameFromEnum(EnumDefault::kThreeWordEnum)); EXPECT_EQ("LONG_ENUM_VALUE_NAME", TryToGetNameFromEnum(EnumDefault::kLongEnumValueName)); } TEST(EnumShoutyAndKCamel, AccessValuesByNameInSource) { EXPECT_EQ(static_cast(EnumShoutyAndKCamel::FIRST), 0); EXPECT_EQ(static_cast(EnumShoutyAndKCamel::kFirst), 0); EXPECT_EQ(static_cast(EnumShoutyAndKCamel::SECOND), 1); EXPECT_EQ(static_cast(EnumShoutyAndKCamel::kSecond), 1); EXPECT_EQ(static_cast(EnumShoutyAndKCamel::TWO_WORD), 2); EXPECT_EQ(static_cast(EnumShoutyAndKCamel::kTwoWord), 2); EXPECT_EQ(static_cast(EnumShoutyAndKCamel::THREE_WORD_ENUM), 4); EXPECT_EQ(static_cast(EnumShoutyAndKCamel::kThreeWordEnum), 4); EXPECT_EQ(static_cast(EnumShoutyAndKCamel::LONG_ENUM_VALUE_NAME), 8); EXPECT_EQ(static_cast(EnumShoutyAndKCamel::kLongEnumValueName), 8); } TEST(EnumShoutyAndKCamel, EnumIsKnown) { EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::FIRST)); EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::SECOND)); EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::TWO_WORD)); EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::THREE_WORD_ENUM)); EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::LONG_ENUM_VALUE_NAME)); EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::kFirst)); EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::kSecond)); EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::kTwoWord)); EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::kThreeWordEnum)); EXPECT_TRUE(EnumIsKnown(EnumShoutyAndKCamel::kLongEnumValueName)); EXPECT_FALSE(EnumIsKnown(static_cast(999))); } TEST(EnumShoutyAndKCamel, NameToEnum) { EnumShoutyAndKCamel result; EXPECT_TRUE(TryToGetEnumFromName("FIRST", &result)); EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result); EXPECT_TRUE(TryToGetEnumFromName("SECOND", &result)); EXPECT_EQ(EnumShoutyAndKCamel::SECOND, result); EXPECT_TRUE(TryToGetEnumFromName("TWO_WORD", &result)); EXPECT_EQ(EnumShoutyAndKCamel::TWO_WORD, result); EXPECT_TRUE(TryToGetEnumFromName("THREE_WORD_ENUM", &result)); EXPECT_EQ(EnumShoutyAndKCamel::THREE_WORD_ENUM, result); EXPECT_TRUE(TryToGetEnumFromName("LONG_ENUM_VALUE_NAME", &result)); EXPECT_EQ(EnumShoutyAndKCamel::LONG_ENUM_VALUE_NAME, result); } TEST(EnumShoutyAndKCamel, NameToEnumFailsWithKCamel) { EnumShoutyAndKCamel result = EnumShoutyAndKCamel::FIRST; EXPECT_FALSE(TryToGetEnumFromName("kFirst", &result)); EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result); EXPECT_FALSE(TryToGetEnumFromName("kSecond", &result)); EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result); EXPECT_FALSE(TryToGetEnumFromName("kTwoWord", &result)); EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result); EXPECT_FALSE(TryToGetEnumFromName("kThreeWordEnum", &result)); EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result); EXPECT_FALSE(TryToGetEnumFromName("kLongEnumValueName", &result)); EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result); } TEST(EnumShoutyAndKCamel, EnumToName) { EXPECT_EQ("FIRST", TryToGetNameFromEnum(EnumShoutyAndKCamel::FIRST)); EXPECT_EQ("SECOND", TryToGetNameFromEnum(EnumShoutyAndKCamel::SECOND)); EXPECT_EQ("TWO_WORD", TryToGetNameFromEnum(EnumShoutyAndKCamel::TWO_WORD)); EXPECT_EQ("THREE_WORD_ENUM", TryToGetNameFromEnum(EnumShoutyAndKCamel::THREE_WORD_ENUM)); EXPECT_EQ("LONG_ENUM_VALUE_NAME", TryToGetNameFromEnum(EnumShoutyAndKCamel::LONG_ENUM_VALUE_NAME)); EXPECT_EQ("FIRST", TryToGetNameFromEnum(EnumShoutyAndKCamel::kFirst)); EXPECT_EQ("SECOND", TryToGetNameFromEnum(EnumShoutyAndKCamel::kSecond)); EXPECT_EQ("TWO_WORD", TryToGetNameFromEnum(EnumShoutyAndKCamel::kTwoWord)); EXPECT_EQ("THREE_WORD_ENUM", TryToGetNameFromEnum(EnumShoutyAndKCamel::kThreeWordEnum)); EXPECT_EQ("LONG_ENUM_VALUE_NAME", TryToGetNameFromEnum(EnumShoutyAndKCamel::kLongEnumValueName)); } TEST(EnumMixed, AccessValuesByNameInSource) { EXPECT_EQ(static_cast(EnumMixed::FIRST), 0); EXPECT_EQ(static_cast(EnumMixed::kFirst), 0); EXPECT_EQ(static_cast(EnumMixed::SECOND), 1); EXPECT_EQ(static_cast(EnumMixed::kTwoWord), 2); EXPECT_EQ(static_cast(EnumMixed::THREE_WORD_ENUM), 4); EXPECT_EQ(static_cast(EnumMixed::kThreeWordEnum), 4); EXPECT_EQ(static_cast(EnumMixed::kLongEnumValueName), 8); } TEST(EnumMixed, EnumIsKnown) { EXPECT_TRUE(EnumIsKnown(EnumMixed::FIRST)); EXPECT_TRUE(EnumIsKnown(EnumMixed::SECOND)); EXPECT_TRUE(EnumIsKnown(EnumMixed::THREE_WORD_ENUM)); EXPECT_TRUE(EnumIsKnown(EnumMixed::kFirst)); EXPECT_TRUE(EnumIsKnown(EnumMixed::kTwoWord)); EXPECT_TRUE(EnumIsKnown(EnumMixed::kThreeWordEnum)); EXPECT_TRUE(EnumIsKnown(EnumMixed::kLongEnumValueName)); EXPECT_FALSE(EnumIsKnown(static_cast(999))); } TEST(EnumMixed, NameToEnum) { EnumMixed result; EXPECT_TRUE(TryToGetEnumFromName("FIRST", &result)); EXPECT_EQ(EnumMixed::FIRST, result); EXPECT_TRUE(TryToGetEnumFromName("SECOND", &result)); EXPECT_EQ(EnumMixed::SECOND, result); EXPECT_TRUE(TryToGetEnumFromName("TWO_WORD", &result)); EXPECT_EQ(EnumMixed::kTwoWord, result); EXPECT_TRUE(TryToGetEnumFromName("THREE_WORD_ENUM", &result)); EXPECT_EQ(EnumMixed::THREE_WORD_ENUM, result); EXPECT_TRUE(TryToGetEnumFromName("LONG_ENUM_VALUE_NAME", &result)); EXPECT_EQ(EnumMixed::kLongEnumValueName, result); } TEST(EnumMixed, NameToEnumFailsWithKCamel) { EnumShoutyAndKCamel result = EnumShoutyAndKCamel::FIRST; EXPECT_FALSE(TryToGetEnumFromName("kFirst", &result)); EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result); EXPECT_FALSE(TryToGetEnumFromName("kSecond", &result)); EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result); EXPECT_FALSE(TryToGetEnumFromName("kTwoWord", &result)); EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result); EXPECT_FALSE(TryToGetEnumFromName("kThreeWordEnum", &result)); EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result); EXPECT_FALSE(TryToGetEnumFromName("kLongEnumValueName", &result)); EXPECT_EQ(EnumShoutyAndKCamel::FIRST, result); } TEST(EnumMixed, EnumToName) { EXPECT_EQ("FIRST", TryToGetNameFromEnum(EnumMixed::FIRST)); EXPECT_EQ("FIRST", TryToGetNameFromEnum(EnumMixed::kFirst)); EXPECT_EQ("SECOND", TryToGetNameFromEnum(EnumMixed::SECOND)); EXPECT_EQ("TWO_WORD", TryToGetNameFromEnum(EnumMixed::kTwoWord)); EXPECT_EQ("THREE_WORD_ENUM", TryToGetNameFromEnum(EnumMixed::THREE_WORD_ENUM)); EXPECT_EQ("THREE_WORD_ENUM", TryToGetNameFromEnum(EnumMixed::kThreeWordEnum)); EXPECT_EQ("LONG_ENUM_VALUE_NAME", TryToGetNameFromEnum(EnumMixed::kLongEnumValueName)); } TEST(UseKCamelEnumCase, IsValidToUse) { std::array buffer; auto view = MakeUseKCamelEnumCaseView(&buffer); EXPECT_EQ(UseKCamelEnumCase::first(), EnumDefault::kFirst); EXPECT_EQ(view.first().Read(), EnumDefault::kFirst); EXPECT_TRUE(view.v().TryToWrite(EnumDefault::kSecond)); EXPECT_FALSE(view.v_is_first().Read()); EXPECT_TRUE(view.v().TryToWrite(EnumDefault::kFirst)); EXPECT_TRUE(view.v_is_first().Read()); } TEST(UseKCamelEnumCase, TextStream) { std::array buffer; auto view = MakeUseKCamelEnumCaseView(&buffer); EXPECT_TRUE(view.v().TryToWrite(EnumDefault::kSecond)); EXPECT_EQ(WriteToString(view), "{ v: SECOND }"); EXPECT_TRUE(UpdateFromText(view, "{ v: TWO_WORD }")); EXPECT_EQ(view.v().Read(), EnumDefault::kTwoWord); } } // namespace } // namespace test } // namespace emboss