11be9fc66SLei Zhang //===- EnumsGenTest.cpp - TableGen EnumsGen Tests -------------------------===//
21be9fc66SLei Zhang //
330857107SMehdi Amini // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
456222a06SMehdi Amini // See https://llvm.org/LICENSE.txt for license information.
556222a06SMehdi Amini // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61be9fc66SLei Zhang //
756222a06SMehdi Amini //===----------------------------------------------------------------------===//
81be9fc66SLei Zhang 
9fee90542SVladislav Vinogradov #include "mlir/IR/BuiltinAttributes.h"
10fee90542SVladislav Vinogradov #include "mlir/IR/BuiltinTypes.h"
11fee90542SVladislav Vinogradov #include "mlir/IR/MLIRContext.h"
1205b4ff0aSJean-Michel Gorius #include "mlir/Support/LLVM.h"
13fee90542SVladislav Vinogradov 
141be9fc66SLei Zhang #include "llvm/ADT/DenseMap.h"
152fa86571SLei Zhang #include "llvm/ADT/StringExtras.h"
161be9fc66SLei Zhang #include "llvm/ADT/StringSwitch.h"
17fee90542SVladislav Vinogradov 
181be9fc66SLei Zhang #include "gmock/gmock.h"
19fee90542SVladislav Vinogradov 
201be9fc66SLei Zhang #include <type_traits>
211be9fc66SLei Zhang 
22032810f5SRahul Joshi /// Pull in generated enum utility declarations and definitions.
231be9fc66SLei Zhang #include "EnumsGenTest.h.inc"
24fee90542SVladislav Vinogradov 
251be9fc66SLei Zhang #include "EnumsGenTest.cpp.inc"
261be9fc66SLei Zhang 
27032810f5SRahul Joshi /// Test namespaces and enum class/utility names.
281be9fc66SLei Zhang using Outer::Inner::ConvertToEnum;
291be9fc66SLei Zhang using Outer::Inner::ConvertToString;
3060e34f8dSMogball using Outer::Inner::FooEnum;
311be9fc66SLei Zhang 
TEST(EnumsGenTest,GeneratedStrEnumDefinition)329dd182e0SLei Zhang TEST(EnumsGenTest, GeneratedStrEnumDefinition) {
3360e34f8dSMogball   EXPECT_EQ(0u, static_cast<uint64_t>(FooEnum::CaseA));
3460e34f8dSMogball   EXPECT_EQ(1u, static_cast<uint64_t>(FooEnum::CaseB));
359dd182e0SLei Zhang }
369dd182e0SLei Zhang 
TEST(EnumsGenTest,GeneratedI32EnumDefinition)379dd182e0SLei Zhang TEST(EnumsGenTest, GeneratedI32EnumDefinition) {
389dd182e0SLei Zhang   EXPECT_EQ(5u, static_cast<uint64_t>(I32Enum::Case5));
399dd182e0SLei Zhang   EXPECT_EQ(10u, static_cast<uint64_t>(I32Enum::Case10));
401be9fc66SLei Zhang }
411be9fc66SLei Zhang 
TEST(EnumsGenTest,GeneratedDenseMapInfo)421be9fc66SLei Zhang TEST(EnumsGenTest, GeneratedDenseMapInfo) {
4360e34f8dSMogball   llvm::DenseMap<FooEnum, std::string> myMap;
441be9fc66SLei Zhang 
4560e34f8dSMogball   myMap[FooEnum::CaseA] = "zero";
4660e34f8dSMogball   myMap[FooEnum::CaseB] = "one";
471be9fc66SLei Zhang 
4860e34f8dSMogball   EXPECT_EQ(myMap[FooEnum::CaseA], "zero");
4960e34f8dSMogball   EXPECT_EQ(myMap[FooEnum::CaseB], "one");
501be9fc66SLei Zhang }
511be9fc66SLei Zhang 
TEST(EnumsGenTest,GeneratedSymbolToStringFn)521be9fc66SLei Zhang TEST(EnumsGenTest, GeneratedSymbolToStringFn) {
5360e34f8dSMogball   EXPECT_EQ(ConvertToString(FooEnum::CaseA), "CaseA");
5460e34f8dSMogball   EXPECT_EQ(ConvertToString(FooEnum::CaseB), "CaseB");
551be9fc66SLei Zhang }
561be9fc66SLei Zhang 
TEST(EnumsGenTest,GeneratedStringToSymbolFn)571be9fc66SLei Zhang TEST(EnumsGenTest, GeneratedStringToSymbolFn) {
5860e34f8dSMogball   EXPECT_EQ(llvm::Optional<FooEnum>(FooEnum::CaseA), ConvertToEnum("CaseA"));
5960e34f8dSMogball   EXPECT_EQ(llvm::Optional<FooEnum>(FooEnum::CaseB), ConvertToEnum("CaseB"));
601be9fc66SLei Zhang   EXPECT_EQ(llvm::None, ConvertToEnum("X"));
611be9fc66SLei Zhang }
621be9fc66SLei Zhang 
TEST(EnumsGenTest,GeneratedUnderlyingType)631be9fc66SLei Zhang TEST(EnumsGenTest, GeneratedUnderlyingType) {
649dd182e0SLei Zhang   bool v = std::is_same<uint32_t, std::underlying_type<I32Enum>::type>::value;
651be9fc66SLei Zhang   EXPECT_TRUE(v);
661be9fc66SLei Zhang }
672fa86571SLei Zhang 
TEST(EnumsGenTest,GeneratedBitEnumDefinition)682fa86571SLei Zhang TEST(EnumsGenTest, GeneratedBitEnumDefinition) {
692fa86571SLei Zhang   EXPECT_EQ(0u, static_cast<uint32_t>(BitEnumWithNone::None));
7033185e66SJeremy Furtek   EXPECT_EQ(1u, static_cast<uint32_t>(BitEnumWithNone::Bit0));
7133185e66SJeremy Furtek   EXPECT_EQ(8u, static_cast<uint32_t>(BitEnumWithNone::Bit3));
72*4e5dee2fSjfurtek 
73*4e5dee2fSjfurtek   EXPECT_EQ(2u, static_cast<uint64_t>(BitEnum64_Test::Bit1));
74*4e5dee2fSjfurtek   EXPECT_EQ(144115188075855872u, static_cast<uint64_t>(BitEnum64_Test::Bit57));
752fa86571SLei Zhang }
762fa86571SLei Zhang 
TEST(EnumsGenTest,GeneratedSymbolToStringFnForBitEnum)772fa86571SLei Zhang TEST(EnumsGenTest, GeneratedSymbolToStringFnForBitEnum) {
78c2b7e4e8SBenjamin Kramer   EXPECT_EQ(stringifyBitEnumWithNone(BitEnumWithNone::None), "None");
7933185e66SJeremy Furtek   EXPECT_EQ(stringifyBitEnumWithNone(BitEnumWithNone::Bit0), "Bit0");
80c2b7e4e8SBenjamin Kramer   EXPECT_EQ(stringifyBitEnumWithNone(BitEnumWithNone::Bit3), "Bit3");
81c2b7e4e8SBenjamin Kramer   EXPECT_EQ(
8233185e66SJeremy Furtek       stringifyBitEnumWithNone(BitEnumWithNone::Bit0 | BitEnumWithNone::Bit3),
8333185e66SJeremy Furtek       "Bit0 | Bit3");
84*4e5dee2fSjfurtek 
85*4e5dee2fSjfurtek   EXPECT_EQ(stringifyBitEnum64_Test(BitEnum64_Test::Bit1), "Bit1");
86*4e5dee2fSjfurtek   EXPECT_EQ(
87*4e5dee2fSjfurtek       stringifyBitEnum64_Test(BitEnum64_Test::Bit1 | BitEnum64_Test::Bit57),
88*4e5dee2fSjfurtek       "Bit1|Bit57");
892fa86571SLei Zhang }
902fa86571SLei Zhang 
TEST(EnumsGenTest,GeneratedStringToSymbolForBitEnum)912fa86571SLei Zhang TEST(EnumsGenTest, GeneratedStringToSymbolForBitEnum) {
922fa86571SLei Zhang   EXPECT_EQ(symbolizeBitEnumWithNone("None"), BitEnumWithNone::None);
9333185e66SJeremy Furtek   EXPECT_EQ(symbolizeBitEnumWithNone("Bit0"), BitEnumWithNone::Bit0);
942fa86571SLei Zhang   EXPECT_EQ(symbolizeBitEnumWithNone("Bit3"), BitEnumWithNone::Bit3);
9533185e66SJeremy Furtek   EXPECT_EQ(symbolizeBitEnumWithNone("Bit3|Bit0"),
9633185e66SJeremy Furtek             BitEnumWithNone::Bit3 | BitEnumWithNone::Bit0);
972fa86571SLei Zhang 
982fa86571SLei Zhang   EXPECT_EQ(symbolizeBitEnumWithNone("Bit2"), llvm::None);
992fa86571SLei Zhang   EXPECT_EQ(symbolizeBitEnumWithNone("Bit3 | Bit4"), llvm::None);
1002fa86571SLei Zhang 
1012fa86571SLei Zhang   EXPECT_EQ(symbolizeBitEnumWithoutNone("None"), llvm::None);
1022fa86571SLei Zhang }
1032fa86571SLei Zhang 
TEST(EnumsGenTest,GeneratedSymbolToStringFnForGroupedBitEnum)10433185e66SJeremy Furtek TEST(EnumsGenTest, GeneratedSymbolToStringFnForGroupedBitEnum) {
10533185e66SJeremy Furtek   EXPECT_EQ(stringifyBitEnumWithGroup(BitEnumWithGroup::Bit0), "Bit0");
10633185e66SJeremy Furtek   EXPECT_EQ(stringifyBitEnumWithGroup(BitEnumWithGroup::Bit3), "Bit3");
10733185e66SJeremy Furtek   EXPECT_EQ(stringifyBitEnumWithGroup(BitEnumWithGroup::Bits0To3),
10833185e66SJeremy Furtek             "Bit0|Bit1|Bit2|Bit3|Bits0To3");
10933185e66SJeremy Furtek   EXPECT_EQ(stringifyBitEnumWithGroup(BitEnumWithGroup::Bit4), "Bit4");
11033185e66SJeremy Furtek   EXPECT_EQ(stringifyBitEnumWithGroup(
11133185e66SJeremy Furtek                 BitEnumWithGroup::Bit0 | BitEnumWithGroup::Bit1 |
11233185e66SJeremy Furtek                 BitEnumWithGroup::Bit2 | BitEnumWithGroup::Bit4),
11333185e66SJeremy Furtek             "Bit0|Bit1|Bit2|Bit4");
11433185e66SJeremy Furtek }
11533185e66SJeremy Furtek 
TEST(EnumsGenTest,GeneratedStringToSymbolForGroupedBitEnum)11633185e66SJeremy Furtek TEST(EnumsGenTest, GeneratedStringToSymbolForGroupedBitEnum) {
11733185e66SJeremy Furtek   EXPECT_EQ(symbolizeBitEnumWithGroup("Bit0"), BitEnumWithGroup::Bit0);
11833185e66SJeremy Furtek   EXPECT_EQ(symbolizeBitEnumWithGroup("Bit3"), BitEnumWithGroup::Bit3);
11933185e66SJeremy Furtek   EXPECT_EQ(symbolizeBitEnumWithGroup("Bit5"), llvm::None);
12033185e66SJeremy Furtek   EXPECT_EQ(symbolizeBitEnumWithGroup("Bit3|Bit0"),
12133185e66SJeremy Furtek             BitEnumWithGroup::Bit3 | BitEnumWithGroup::Bit0);
12233185e66SJeremy Furtek }
12333185e66SJeremy Furtek 
TEST(EnumsGenTest,GeneratedSymbolToStringFnForPrimaryGroupBitEnum)124*4e5dee2fSjfurtek TEST(EnumsGenTest, GeneratedSymbolToStringFnForPrimaryGroupBitEnum) {
125*4e5dee2fSjfurtek   EXPECT_EQ(stringifyBitEnumPrimaryGroup(
126*4e5dee2fSjfurtek                 BitEnumPrimaryGroup::Bit0 | BitEnumPrimaryGroup::Bit1 |
127*4e5dee2fSjfurtek                 BitEnumPrimaryGroup::Bit2 | BitEnumPrimaryGroup::Bit3),
128*4e5dee2fSjfurtek             "Bits0To3");
129*4e5dee2fSjfurtek   EXPECT_EQ(stringifyBitEnumPrimaryGroup(BitEnumPrimaryGroup::Bit0 |
130*4e5dee2fSjfurtek                                          BitEnumPrimaryGroup::Bit2 |
131*4e5dee2fSjfurtek                                          BitEnumPrimaryGroup::Bit3),
132*4e5dee2fSjfurtek             "Bit0, Bit2, Bit3");
133*4e5dee2fSjfurtek   EXPECT_EQ(stringifyBitEnumPrimaryGroup(BitEnumPrimaryGroup::Bit0 |
134*4e5dee2fSjfurtek                                          BitEnumPrimaryGroup::Bit4 |
135*4e5dee2fSjfurtek                                          BitEnumPrimaryGroup::Bit5),
136*4e5dee2fSjfurtek             "Bits4And5, Bit0");
137*4e5dee2fSjfurtek   EXPECT_EQ(stringifyBitEnumPrimaryGroup(
138*4e5dee2fSjfurtek                 BitEnumPrimaryGroup::Bit0 | BitEnumPrimaryGroup::Bit1 |
139*4e5dee2fSjfurtek                 BitEnumPrimaryGroup::Bit2 | BitEnumPrimaryGroup::Bit3 |
140*4e5dee2fSjfurtek                 BitEnumPrimaryGroup::Bit4 | BitEnumPrimaryGroup::Bit5),
141*4e5dee2fSjfurtek             "Bits0To5");
142*4e5dee2fSjfurtek }
143*4e5dee2fSjfurtek 
TEST(EnumsGenTest,GeneratedOperator)1442fa86571SLei Zhang TEST(EnumsGenTest, GeneratedOperator) {
14533185e66SJeremy Furtek   EXPECT_TRUE(bitEnumContains(BitEnumWithNone::Bit0 | BitEnumWithNone::Bit3,
14633185e66SJeremy Furtek                               BitEnumWithNone::Bit0));
14733185e66SJeremy Furtek   EXPECT_FALSE(bitEnumContains(BitEnumWithNone::Bit0 & BitEnumWithNone::Bit3,
14833185e66SJeremy Furtek                                BitEnumWithNone::Bit0));
1492fa86571SLei Zhang }
150fdc496a3SAlex Zinenko 
TEST(EnumsGenTest,GeneratedSymbolToCustomStringFn)151fdc496a3SAlex Zinenko TEST(EnumsGenTest, GeneratedSymbolToCustomStringFn) {
152fdc496a3SAlex Zinenko   EXPECT_EQ(stringifyPrettyIntEnum(PrettyIntEnum::Case1), "case_one");
153fdc496a3SAlex Zinenko   EXPECT_EQ(stringifyPrettyIntEnum(PrettyIntEnum::Case2), "case_two");
154fdc496a3SAlex Zinenko }
155fdc496a3SAlex Zinenko 
TEST(EnumsGenTest,GeneratedCustomStringToSymbolFn)156fdc496a3SAlex Zinenko TEST(EnumsGenTest, GeneratedCustomStringToSymbolFn) {
157fdc496a3SAlex Zinenko   auto one = symbolizePrettyIntEnum("case_one");
158fdc496a3SAlex Zinenko   EXPECT_TRUE(one);
159fdc496a3SAlex Zinenko   EXPECT_EQ(*one, PrettyIntEnum::Case1);
160fdc496a3SAlex Zinenko 
161fdc496a3SAlex Zinenko   auto two = symbolizePrettyIntEnum("case_two");
162fdc496a3SAlex Zinenko   EXPECT_TRUE(two);
163fdc496a3SAlex Zinenko   EXPECT_EQ(*two, PrettyIntEnum::Case2);
164fdc496a3SAlex Zinenko 
165fdc496a3SAlex Zinenko   auto none = symbolizePrettyIntEnum("Case1");
166fdc496a3SAlex Zinenko   EXPECT_FALSE(none);
167fdc496a3SAlex Zinenko }
168fee90542SVladislav Vinogradov 
TEST(EnumsGenTest,GeneratedIntAttributeClass)169fee90542SVladislav Vinogradov TEST(EnumsGenTest, GeneratedIntAttributeClass) {
170fee90542SVladislav Vinogradov   mlir::MLIRContext ctx;
171fee90542SVladislav Vinogradov   I32Enum rawVal = I32Enum::Case5;
172fee90542SVladislav Vinogradov 
173fee90542SVladislav Vinogradov   I32EnumAttr enumAttr = I32EnumAttr::get(&ctx, rawVal);
174fee90542SVladislav Vinogradov   EXPECT_NE(enumAttr, nullptr);
175fee90542SVladislav Vinogradov   EXPECT_EQ(enumAttr.getValue(), rawVal);
176fee90542SVladislav Vinogradov 
177fee90542SVladislav Vinogradov   mlir::Type intType = mlir::IntegerType::get(&ctx, 32);
178fee90542SVladislav Vinogradov   mlir::Attribute intAttr = mlir::IntegerAttr::get(intType, 5);
179fee90542SVladislav Vinogradov   EXPECT_TRUE(intAttr.isa<I32EnumAttr>());
180fee90542SVladislav Vinogradov   EXPECT_EQ(intAttr, enumAttr);
181fee90542SVladislav Vinogradov }
182fee90542SVladislav Vinogradov 
TEST(EnumsGenTest,GeneratedBitAttributeClass)183fee90542SVladislav Vinogradov TEST(EnumsGenTest, GeneratedBitAttributeClass) {
184fee90542SVladislav Vinogradov   mlir::MLIRContext ctx;
185fee90542SVladislav Vinogradov 
186fee90542SVladislav Vinogradov   mlir::Type intType = mlir::IntegerType::get(&ctx, 32);
187fee90542SVladislav Vinogradov   mlir::Attribute intAttr = mlir::IntegerAttr::get(
188fee90542SVladislav Vinogradov       intType,
18933185e66SJeremy Furtek       static_cast<uint32_t>(BitEnumWithNone::Bit0 | BitEnumWithNone::Bit3));
190fee90542SVladislav Vinogradov   EXPECT_TRUE(intAttr.isa<BitEnumWithNoneAttr>());
191fee90542SVladislav Vinogradov   EXPECT_TRUE(intAttr.isa<BitEnumWithoutNoneAttr>());
19233185e66SJeremy Furtek 
19333185e66SJeremy Furtek   intAttr = mlir::IntegerAttr::get(
19433185e66SJeremy Furtek       intType, static_cast<uint32_t>(BitEnumWithGroup::Bits0To3) | (1u << 6));
19533185e66SJeremy Furtek   EXPECT_FALSE(intAttr.isa<BitEnumWithGroupAttr>());
196fee90542SVladislav Vinogradov }
197