xref: /llvm-project/llvm/unittests/ADT/EnumeratedArrayTest.cpp (revision 6aa050a69041e610587c51032fa477dd3d6da787)
1f0af11d8Sbmahjour //===- llvm/unittest/ADT/EnumeratedArrayTest.cpp ----------------*- C++ -*-===//
2f0af11d8Sbmahjour //
3f0af11d8Sbmahjour // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f0af11d8Sbmahjour // See https://llvm.org/LICENSE.txt for license information.
5f0af11d8Sbmahjour // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f0af11d8Sbmahjour //
7f0af11d8Sbmahjour //===----------------------------------------------------------------------===//
8f0af11d8Sbmahjour //
9f0af11d8Sbmahjour // EnumeratedArray unit tests.
10f0af11d8Sbmahjour //
11f0af11d8Sbmahjour //===----------------------------------------------------------------------===//
12f0af11d8Sbmahjour 
13f0af11d8Sbmahjour #include "llvm/ADT/EnumeratedArray.h"
146608908bSJannik Silvanus #include "llvm/ADT/iterator_range.h"
156608908bSJannik Silvanus #include "gmock/gmock.h"
16f0af11d8Sbmahjour #include "gtest/gtest.h"
176608908bSJannik Silvanus #include <type_traits>
18f0af11d8Sbmahjour 
19f0af11d8Sbmahjour namespace llvm {
20f0af11d8Sbmahjour 
21f0af11d8Sbmahjour //===--------------------------------------------------------------------===//
22f0af11d8Sbmahjour // Test initialization and use of operator[] for both read and write.
23f0af11d8Sbmahjour //===--------------------------------------------------------------------===//
24f0af11d8Sbmahjour 
TEST(EnumeratedArray,InitAndIndex)25f0af11d8Sbmahjour TEST(EnumeratedArray, InitAndIndex) {
26f0af11d8Sbmahjour 
27f0af11d8Sbmahjour   enum class Colors { Red, Blue, Green, Last = Green };
28f0af11d8Sbmahjour 
29f0af11d8Sbmahjour   EnumeratedArray<float, Colors, Colors::Last, size_t> Array1;
30f0af11d8Sbmahjour 
31f0af11d8Sbmahjour   Array1[Colors::Red] = 1.0;
32f0af11d8Sbmahjour   Array1[Colors::Blue] = 2.0;
33f0af11d8Sbmahjour   Array1[Colors::Green] = 3.0;
34f0af11d8Sbmahjour 
35f0af11d8Sbmahjour   EXPECT_EQ(Array1[Colors::Red], 1.0);
36f0af11d8Sbmahjour   EXPECT_EQ(Array1[Colors::Blue], 2.0);
37f0af11d8Sbmahjour   EXPECT_EQ(Array1[Colors::Green], 3.0);
38f0af11d8Sbmahjour 
39f0af11d8Sbmahjour   EnumeratedArray<bool, Colors> Array2(true);
40f0af11d8Sbmahjour 
41f0af11d8Sbmahjour   EXPECT_TRUE(Array2[Colors::Red]);
42f0af11d8Sbmahjour   EXPECT_TRUE(Array2[Colors::Blue]);
43f0af11d8Sbmahjour   EXPECT_TRUE(Array2[Colors::Green]);
44f0af11d8Sbmahjour 
45f0af11d8Sbmahjour   Array2[Colors::Red] = true;
46f0af11d8Sbmahjour   Array2[Colors::Blue] = false;
47f0af11d8Sbmahjour   Array2[Colors::Green] = true;
48f0af11d8Sbmahjour 
49f0af11d8Sbmahjour   EXPECT_TRUE(Array2[Colors::Red]);
50f0af11d8Sbmahjour   EXPECT_FALSE(Array2[Colors::Blue]);
51f0af11d8Sbmahjour   EXPECT_TRUE(Array2[Colors::Green]);
526608908bSJannik Silvanus 
536608908bSJannik Silvanus   EnumeratedArray<float, Colors, Colors::Last, size_t> Array3 = {10.0, 11.0,
546608908bSJannik Silvanus                                                                  12.0};
556608908bSJannik Silvanus   EXPECT_EQ(Array3[Colors::Red], 10.0);
566608908bSJannik Silvanus   EXPECT_EQ(Array3[Colors::Blue], 11.0);
576608908bSJannik Silvanus   EXPECT_EQ(Array3[Colors::Green], 12.0);
58f0af11d8Sbmahjour }
59f0af11d8Sbmahjour 
606608908bSJannik Silvanus //===--------------------------------------------------------------------===//
616608908bSJannik Silvanus // Test size and empty function
626608908bSJannik Silvanus //===--------------------------------------------------------------------===//
636608908bSJannik Silvanus 
TEST(EnumeratedArray,Size)646608908bSJannik Silvanus TEST(EnumeratedArray, Size) {
656608908bSJannik Silvanus 
666608908bSJannik Silvanus   enum class Colors { Red, Blue, Green, Last = Green };
676608908bSJannik Silvanus 
686608908bSJannik Silvanus   EnumeratedArray<float, Colors, Colors::Last, size_t> Array;
696608908bSJannik Silvanus   const auto &ConstArray = Array;
706608908bSJannik Silvanus 
716608908bSJannik Silvanus   EXPECT_EQ(ConstArray.size(), 3u);
726608908bSJannik Silvanus   EXPECT_EQ(ConstArray.empty(), false);
736608908bSJannik Silvanus }
746608908bSJannik Silvanus 
756608908bSJannik Silvanus //===--------------------------------------------------------------------===//
766608908bSJannik Silvanus // Test iterators
776608908bSJannik Silvanus //===--------------------------------------------------------------------===//
786608908bSJannik Silvanus 
TEST(EnumeratedArray,Iterators)796608908bSJannik Silvanus TEST(EnumeratedArray, Iterators) {
806608908bSJannik Silvanus 
816608908bSJannik Silvanus   enum class Colors { Red, Blue, Green, Last = Green };
826608908bSJannik Silvanus 
836608908bSJannik Silvanus   EnumeratedArray<float, Colors, Colors::Last, size_t> Array;
846608908bSJannik Silvanus   const auto &ConstArray = Array;
856608908bSJannik Silvanus 
866608908bSJannik Silvanus   Array[Colors::Red] = 1.0;
876608908bSJannik Silvanus   Array[Colors::Blue] = 2.0;
886608908bSJannik Silvanus   Array[Colors::Green] = 3.0;
896608908bSJannik Silvanus 
906608908bSJannik Silvanus   EXPECT_THAT(Array, testing::ElementsAre(1.0, 2.0, 3.0));
916608908bSJannik Silvanus   EXPECT_THAT(ConstArray, testing::ElementsAre(1.0, 2.0, 3.0));
926608908bSJannik Silvanus 
936608908bSJannik Silvanus   EXPECT_THAT(make_range(Array.rbegin(), Array.rend()),
946608908bSJannik Silvanus               testing::ElementsAre(3.0, 2.0, 1.0));
956608908bSJannik Silvanus   EXPECT_THAT(make_range(ConstArray.rbegin(), ConstArray.rend()),
966608908bSJannik Silvanus               testing::ElementsAre(3.0, 2.0, 1.0));
976608908bSJannik Silvanus }
986608908bSJannik Silvanus 
996608908bSJannik Silvanus //===--------------------------------------------------------------------===//
1006608908bSJannik Silvanus // Test typedefs
1016608908bSJannik Silvanus //===--------------------------------------------------------------------===//
1026608908bSJannik Silvanus 
1036608908bSJannik Silvanus namespace {
1046608908bSJannik Silvanus 
1056608908bSJannik Silvanus enum class Colors { Red, Blue, Green, Last = Green };
1066608908bSJannik Silvanus 
1076608908bSJannik Silvanus using Array = EnumeratedArray<float, Colors, Colors::Last, size_t>;
1086608908bSJannik Silvanus 
109*6aa050a6SNathan James static_assert(std::is_same_v<Array::value_type, float>,
1106608908bSJannik Silvanus               "Incorrect value_type type");
111*6aa050a6SNathan James static_assert(std::is_same_v<Array::reference, float &>,
1126608908bSJannik Silvanus               "Incorrect reference type!");
113*6aa050a6SNathan James static_assert(std::is_same_v<Array::pointer, float *>,
1146608908bSJannik Silvanus               "Incorrect pointer type!");
115*6aa050a6SNathan James static_assert(std::is_same_v<Array::const_reference, const float &>,
1166608908bSJannik Silvanus               "Incorrect const_reference type!");
117*6aa050a6SNathan James static_assert(std::is_same_v<Array::const_pointer, const float *>,
1186608908bSJannik Silvanus               "Incorrect const_pointer type!");
1196608908bSJannik Silvanus } // namespace
1206608908bSJannik Silvanus 
121f0af11d8Sbmahjour } // namespace llvm
122