122 lines · cpp
1//===- llvm/unittest/ADT/EnumeratedArrayTest.cpp ----------------*- C++ -*-===//2//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-exception6//7//===----------------------------------------------------------------------===//8//9// EnumeratedArray unit tests.10//11//===----------------------------------------------------------------------===//12 13#include "llvm/ADT/EnumeratedArray.h"14#include "llvm/ADT/iterator_range.h"15#include "gmock/gmock.h"16#include "gtest/gtest.h"17#include <type_traits>18 19namespace llvm {20 21//===--------------------------------------------------------------------===//22// Test initialization and use of operator[] for both read and write.23//===--------------------------------------------------------------------===//24 25TEST(EnumeratedArray, InitAndIndex) {26 27 enum class Colors { Red, Blue, Green, Last = Green };28 29 EnumeratedArray<float, Colors, Colors::Last, size_t> Array1;30 31 Array1[Colors::Red] = 1.0;32 Array1[Colors::Blue] = 2.0;33 Array1[Colors::Green] = 3.0;34 35 EXPECT_EQ(Array1[Colors::Red], 1.0);36 EXPECT_EQ(Array1[Colors::Blue], 2.0);37 EXPECT_EQ(Array1[Colors::Green], 3.0);38 39 EnumeratedArray<bool, Colors> Array2(true);40 41 EXPECT_TRUE(Array2[Colors::Red]);42 EXPECT_TRUE(Array2[Colors::Blue]);43 EXPECT_TRUE(Array2[Colors::Green]);44 45 Array2[Colors::Red] = true;46 Array2[Colors::Blue] = false;47 Array2[Colors::Green] = true;48 49 EXPECT_TRUE(Array2[Colors::Red]);50 EXPECT_FALSE(Array2[Colors::Blue]);51 EXPECT_TRUE(Array2[Colors::Green]);52 53 EnumeratedArray<float, Colors, Colors::Last, size_t> Array3 = {10.0, 11.0,54 12.0};55 EXPECT_EQ(Array3[Colors::Red], 10.0);56 EXPECT_EQ(Array3[Colors::Blue], 11.0);57 EXPECT_EQ(Array3[Colors::Green], 12.0);58}59 60//===--------------------------------------------------------------------===//61// Test size and empty function62//===--------------------------------------------------------------------===//63 64TEST(EnumeratedArray, Size) {65 66 enum class Colors { Red, Blue, Green, Last = Green };67 68 EnumeratedArray<float, Colors, Colors::Last, size_t> Array;69 const auto &ConstArray = Array;70 71 EXPECT_EQ(ConstArray.size(), 3u);72 EXPECT_EQ(ConstArray.empty(), false);73}74 75//===--------------------------------------------------------------------===//76// Test iterators77//===--------------------------------------------------------------------===//78 79TEST(EnumeratedArray, Iterators) {80 81 enum class Colors { Red, Blue, Green, Last = Green };82 83 EnumeratedArray<float, Colors, Colors::Last, size_t> Array;84 const auto &ConstArray = Array;85 86 Array[Colors::Red] = 1.0;87 Array[Colors::Blue] = 2.0;88 Array[Colors::Green] = 3.0;89 90 EXPECT_THAT(Array, testing::ElementsAre(1.0, 2.0, 3.0));91 EXPECT_THAT(ConstArray, testing::ElementsAre(1.0, 2.0, 3.0));92 93 EXPECT_THAT(make_range(Array.rbegin(), Array.rend()),94 testing::ElementsAre(3.0, 2.0, 1.0));95 EXPECT_THAT(make_range(ConstArray.rbegin(), ConstArray.rend()),96 testing::ElementsAre(3.0, 2.0, 1.0));97}98 99//===--------------------------------------------------------------------===//100// Test typedefs101//===--------------------------------------------------------------------===//102 103namespace {104 105enum class Colors { Red, Blue, Green, Last = Green };106 107using Array = EnumeratedArray<float, Colors, Colors::Last, size_t>;108 109static_assert(std::is_same_v<Array::value_type, float>,110 "Incorrect value_type type");111static_assert(std::is_same_v<Array::reference, float &>,112 "Incorrect reference type!");113static_assert(std::is_same_v<Array::pointer, float *>,114 "Incorrect pointer type!");115static_assert(std::is_same_v<Array::const_reference, const float &>,116 "Incorrect const_reference type!");117static_assert(std::is_same_v<Array::const_pointer, const float *>,118 "Incorrect const_pointer type!");119} // namespace120 121} // namespace llvm122