Add MapVector::rbegin(), MapVector::rend() to completment MapVector::begin(), MapVect...
[oota-llvm.git] / unittests / ADT / MapVectorTest.cpp
1 //===- unittest/ADT/MapVectorTest.cpp - MapVector unit tests ----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "gtest/gtest.h"
11 #include "llvm/ADT/MapVector.h"
12 #include "llvm/ADT/iterator_range.h"
13 #include <utility>
14
15 using namespace llvm;
16
17 TEST(MapVectorTest, insert_pop) {
18   MapVector<int, int> MV;
19   std::pair<MapVector<int, int>::iterator, bool> R;
20
21   R = MV.insert(std::make_pair(1, 2));
22   ASSERT_EQ(R.first, MV.begin());
23   EXPECT_EQ(R.first->first, 1);
24   EXPECT_EQ(R.first->second, 2);
25   EXPECT_TRUE(R.second);
26
27   R = MV.insert(std::make_pair(1, 3));
28   ASSERT_EQ(R.first, MV.begin());
29   EXPECT_EQ(R.first->first, 1);
30   EXPECT_EQ(R.first->second, 2);
31   EXPECT_FALSE(R.second);
32
33   R = MV.insert(std::make_pair(4, 5));
34   ASSERT_NE(R.first, MV.end());
35   EXPECT_EQ(R.first->first, 4);
36   EXPECT_EQ(R.first->second, 5);
37   EXPECT_TRUE(R.second);
38
39   EXPECT_EQ(MV.size(), 2u);
40   EXPECT_EQ(MV[1], 2);
41   EXPECT_EQ(MV[4], 5);
42
43   MV.pop_back();
44   EXPECT_EQ(MV.size(), 1u);
45   EXPECT_EQ(MV[1], 2);
46
47   R = MV.insert(std::make_pair(4, 7));
48   ASSERT_NE(R.first, MV.end());
49   EXPECT_EQ(R.first->first, 4);
50   EXPECT_EQ(R.first->second, 7);
51   EXPECT_TRUE(R.second);  
52
53   EXPECT_EQ(MV.size(), 2u);
54   EXPECT_EQ(MV[1], 2);
55   EXPECT_EQ(MV[4], 7);
56 }
57
58 TEST(MapVectorTest, erase) {
59   MapVector<int, int> MV;
60
61   MV.insert(std::make_pair(1, 2));
62   MV.insert(std::make_pair(3, 4));
63   MV.insert(std::make_pair(5, 6));
64   ASSERT_EQ(MV.size(), 3u);
65
66   MV.erase(MV.find(1));
67   ASSERT_EQ(MV.size(), 2u);
68   ASSERT_EQ(MV.find(1), MV.end());
69   ASSERT_EQ(MV[3], 4);
70   ASSERT_EQ(MV[5], 6);
71
72   ASSERT_EQ(MV.erase(3), 1u);
73   ASSERT_EQ(MV.size(), 1u);
74   ASSERT_EQ(MV.find(3), MV.end());
75   ASSERT_EQ(MV[5], 6);
76
77   ASSERT_EQ(MV.erase(79), 0u);
78   ASSERT_EQ(MV.size(), 1u);
79 }
80
81 TEST(MapVectorTest, remove_if) {
82   MapVector<int, int> MV;
83
84   MV.insert(std::make_pair(1, 11));
85   MV.insert(std::make_pair(2, 12));
86   MV.insert(std::make_pair(3, 13));
87   MV.insert(std::make_pair(4, 14));
88   MV.insert(std::make_pair(5, 15));
89   MV.insert(std::make_pair(6, 16));
90   ASSERT_EQ(MV.size(), 6u);
91
92   MV.remove_if([](const std::pair<int, int> &Val) { return Val.second % 2; });
93   ASSERT_EQ(MV.size(), 3u);
94   ASSERT_EQ(MV.find(1), MV.end());
95   ASSERT_EQ(MV.find(3), MV.end());
96   ASSERT_EQ(MV.find(5), MV.end());
97   ASSERT_EQ(MV[2], 12);
98   ASSERT_EQ(MV[4], 14);
99   ASSERT_EQ(MV[6], 16);
100 }
101
102 TEST(MapVectorTest, iteration_test) {
103   MapVector<int, int> MV;
104
105   MV.insert(std::make_pair(1, 11));
106   MV.insert(std::make_pair(2, 12));
107   MV.insert(std::make_pair(3, 13));
108   MV.insert(std::make_pair(4, 14));
109   MV.insert(std::make_pair(5, 15));
110   MV.insert(std::make_pair(6, 16));
111   ASSERT_EQ(MV.size(), 6u);
112
113   int count = 1;
114   for (auto P : make_range(MV.begin(), MV.end())) {
115     ASSERT_EQ(P.first, count);
116     count++;
117   }
118
119   count = 6;
120   for (auto P : make_range(MV.rbegin(), MV.rend())) {
121     ASSERT_EQ(P.first, count);
122     count--;
123   }
124 }