1 //===- EnumsGenTest.cpp - TableGen EnumsGen Tests -------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "mlir/IR/BuiltinAttributes.h"
10 #include "mlir/IR/BuiltinTypes.h"
11 #include "mlir/IR/MLIRContext.h"
12 #include "mlir/Support/LLVM.h"
14 #include "llvm/ADT/DenseMap.h"
15 #include "llvm/ADT/StringExtras.h"
17 #include "gmock/gmock.h"
19 #include <type_traits>
21 /// Pull in generated enum utility declarations and definitions.
22 #include "EnumsGenTest.h.inc"
24 #include "EnumsGenTest.cpp.inc"
26 /// Test namespaces and enum class/utility names.
27 using Outer::Inner::ConvertToEnum
;
28 using Outer::Inner::ConvertToString
;
29 using Outer::Inner::FooEnum
;
31 TEST(EnumsGenTest
, GeneratedStrEnumDefinition
) {
32 EXPECT_EQ(0u, static_cast<uint64_t>(FooEnum::CaseA
));
33 EXPECT_EQ(1u, static_cast<uint64_t>(FooEnum::CaseB
));
36 TEST(EnumsGenTest
, GeneratedI32EnumDefinition
) {
37 EXPECT_EQ(5u, static_cast<uint64_t>(I32Enum::Case5
));
38 EXPECT_EQ(10u, static_cast<uint64_t>(I32Enum::Case10
));
41 TEST(EnumsGenTest
, GeneratedDenseMapInfo
) {
42 llvm::DenseMap
<FooEnum
, std::string
> myMap
;
44 myMap
[FooEnum::CaseA
] = "zero";
45 myMap
[FooEnum::CaseB
] = "one";
47 EXPECT_EQ(myMap
[FooEnum::CaseA
], "zero");
48 EXPECT_EQ(myMap
[FooEnum::CaseB
], "one");
51 TEST(EnumsGenTest
, GeneratedSymbolToStringFn
) {
52 EXPECT_EQ(ConvertToString(FooEnum::CaseA
), "CaseA");
53 EXPECT_EQ(ConvertToString(FooEnum::CaseB
), "CaseB");
56 TEST(EnumsGenTest
, GeneratedStringToSymbolFn
) {
57 EXPECT_EQ(std::optional
<FooEnum
>(FooEnum::CaseA
), ConvertToEnum("CaseA"));
58 EXPECT_EQ(std::optional
<FooEnum
>(FooEnum::CaseB
), ConvertToEnum("CaseB"));
59 EXPECT_EQ(std::nullopt
, ConvertToEnum("X"));
62 TEST(EnumsGenTest
, GeneratedUnderlyingType
) {
63 bool v
= std::is_same
<uint32_t, std::underlying_type
<I32Enum
>::type
>::value
;
67 TEST(EnumsGenTest
, GeneratedBitEnumDefinition
) {
68 EXPECT_EQ(0u, static_cast<uint32_t>(BitEnumWithNone::None
));
69 EXPECT_EQ(1u, static_cast<uint32_t>(BitEnumWithNone::Bit0
));
70 EXPECT_EQ(8u, static_cast<uint32_t>(BitEnumWithNone::Bit3
));
72 EXPECT_EQ(2u, static_cast<uint64_t>(BitEnum64_Test::Bit1
));
73 EXPECT_EQ(144115188075855872u, static_cast<uint64_t>(BitEnum64_Test::Bit57
));
76 TEST(EnumsGenTest
, GeneratedSymbolToStringFnForBitEnum
) {
77 EXPECT_EQ(stringifyBitEnumWithNone(BitEnumWithNone::None
), "None");
78 EXPECT_EQ(stringifyBitEnumWithNone(BitEnumWithNone::Bit0
), "Bit0");
79 EXPECT_EQ(stringifyBitEnumWithNone(BitEnumWithNone::Bit3
), "Bit3");
81 stringifyBitEnumWithNone(BitEnumWithNone::Bit0
| BitEnumWithNone::Bit3
),
84 EXPECT_EQ(stringifyBitEnum64_Test(BitEnum64_Test::Bit1
), "Bit1");
86 stringifyBitEnum64_Test(BitEnum64_Test::Bit1
| BitEnum64_Test::Bit57
),
90 TEST(EnumsGenTest
, GeneratedStringToSymbolForBitEnum
) {
91 EXPECT_EQ(symbolizeBitEnumWithNone("None"), BitEnumWithNone::None
);
92 EXPECT_EQ(symbolizeBitEnumWithNone("Bit0"), BitEnumWithNone::Bit0
);
93 EXPECT_EQ(symbolizeBitEnumWithNone("Bit3"), BitEnumWithNone::Bit3
);
94 EXPECT_EQ(symbolizeBitEnumWithNone("Bit3|Bit0"),
95 BitEnumWithNone::Bit3
| BitEnumWithNone::Bit0
);
97 EXPECT_EQ(symbolizeBitEnumWithNone("Bit2"), std::nullopt
);
98 EXPECT_EQ(symbolizeBitEnumWithNone("Bit3 | Bit4"), std::nullopt
);
100 EXPECT_EQ(symbolizeBitEnumWithoutNone("None"), std::nullopt
);
103 TEST(EnumsGenTest
, GeneratedSymbolToStringFnForGroupedBitEnum
) {
104 EXPECT_EQ(stringifyBitEnumWithGroup(BitEnumWithGroup::Bit0
), "Bit0");
105 EXPECT_EQ(stringifyBitEnumWithGroup(BitEnumWithGroup::Bit3
), "Bit3");
106 EXPECT_EQ(stringifyBitEnumWithGroup(BitEnumWithGroup::Bits0To3
),
107 "Bit0|Bit1|Bit2|Bit3|Bits0To3");
108 EXPECT_EQ(stringifyBitEnumWithGroup(BitEnumWithGroup::Bit4
), "Bit4");
109 EXPECT_EQ(stringifyBitEnumWithGroup(
110 BitEnumWithGroup::Bit0
| BitEnumWithGroup::Bit1
|
111 BitEnumWithGroup::Bit2
| BitEnumWithGroup::Bit4
),
112 "Bit0|Bit1|Bit2|Bit4");
115 TEST(EnumsGenTest
, GeneratedStringToSymbolForGroupedBitEnum
) {
116 EXPECT_EQ(symbolizeBitEnumWithGroup("Bit0"), BitEnumWithGroup::Bit0
);
117 EXPECT_EQ(symbolizeBitEnumWithGroup("Bit3"), BitEnumWithGroup::Bit3
);
118 EXPECT_EQ(symbolizeBitEnumWithGroup("Bit5"), std::nullopt
);
119 EXPECT_EQ(symbolizeBitEnumWithGroup("Bit3|Bit0"),
120 BitEnumWithGroup::Bit3
| BitEnumWithGroup::Bit0
);
123 TEST(EnumsGenTest
, GeneratedSymbolToStringFnForPrimaryGroupBitEnum
) {
124 EXPECT_EQ(stringifyBitEnumPrimaryGroup(
125 BitEnumPrimaryGroup::Bit0
| BitEnumPrimaryGroup::Bit1
|
126 BitEnumPrimaryGroup::Bit2
| BitEnumPrimaryGroup::Bit3
),
128 EXPECT_EQ(stringifyBitEnumPrimaryGroup(BitEnumPrimaryGroup::Bit0
|
129 BitEnumPrimaryGroup::Bit2
|
130 BitEnumPrimaryGroup::Bit3
),
132 EXPECT_EQ(stringifyBitEnumPrimaryGroup(BitEnumPrimaryGroup::Bit0
|
133 BitEnumPrimaryGroup::Bit4
|
134 BitEnumPrimaryGroup::Bit5
),
136 EXPECT_EQ(stringifyBitEnumPrimaryGroup(
137 BitEnumPrimaryGroup::Bit0
| BitEnumPrimaryGroup::Bit1
|
138 BitEnumPrimaryGroup::Bit2
| BitEnumPrimaryGroup::Bit3
|
139 BitEnumPrimaryGroup::Bit4
| BitEnumPrimaryGroup::Bit5
),
143 TEST(EnumsGenTest
, GeneratedOperator
) {
144 EXPECT_TRUE(bitEnumContainsAll(BitEnumWithNone::Bit0
| BitEnumWithNone::Bit3
,
145 BitEnumWithNone::Bit0
));
146 EXPECT_FALSE(bitEnumContainsAll(BitEnumWithNone::Bit0
& BitEnumWithNone::Bit3
,
147 BitEnumWithNone::Bit0
));
150 TEST(EnumsGenTest
, GeneratedSymbolToCustomStringFn
) {
151 EXPECT_EQ(stringifyPrettyIntEnum(PrettyIntEnum::Case1
), "case_one");
152 EXPECT_EQ(stringifyPrettyIntEnum(PrettyIntEnum::Case2
), "case_two");
155 TEST(EnumsGenTest
, GeneratedCustomStringToSymbolFn
) {
156 auto one
= symbolizePrettyIntEnum("case_one");
158 EXPECT_EQ(*one
, PrettyIntEnum::Case1
);
160 auto two
= symbolizePrettyIntEnum("case_two");
162 EXPECT_EQ(*two
, PrettyIntEnum::Case2
);
164 auto none
= symbolizePrettyIntEnum("Case1");
168 TEST(EnumsGenTest
, GeneratedIntAttributeClass
) {
169 mlir::MLIRContext ctx
;
170 I32Enum rawVal
= I32Enum::Case5
;
172 I32EnumAttr enumAttr
= I32EnumAttr::get(&ctx
, rawVal
);
173 EXPECT_NE(enumAttr
, nullptr);
174 EXPECT_EQ(enumAttr
.getValue(), rawVal
);
176 mlir::Type intType
= mlir::IntegerType::get(&ctx
, 32);
177 mlir::Attribute intAttr
= mlir::IntegerAttr::get(intType
, 5);
178 EXPECT_TRUE(llvm::isa
<I32EnumAttr
>(intAttr
));
179 EXPECT_EQ(intAttr
, enumAttr
);
182 TEST(EnumsGenTest
, GeneratedBitAttributeClass
) {
183 mlir::MLIRContext ctx
;
185 mlir::Type intType
= mlir::IntegerType::get(&ctx
, 32);
186 mlir::Attribute intAttr
= mlir::IntegerAttr::get(
188 static_cast<uint32_t>(BitEnumWithNone::Bit0
| BitEnumWithNone::Bit3
));
189 EXPECT_TRUE(llvm::isa
<BitEnumWithNoneAttr
>(intAttr
));
190 EXPECT_TRUE(llvm::isa
<BitEnumWithoutNoneAttr
>(intAttr
));
192 intAttr
= mlir::IntegerAttr::get(
193 intType
, static_cast<uint32_t>(BitEnumWithGroup::Bits0To3
) | (1u << 6));
194 EXPECT_FALSE(llvm::isa
<BitEnumWithGroupAttr
>(intAttr
));