Home | History | Annotate | Download | only in ADT
      1 //===- llvm/unittest/ADT/SmallSetTest.cpp ------------------------------===//
      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 // SmallSet unit tests.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "llvm/ADT/SmallSet.h"
     15 #include "gtest/gtest.h"
     16 #include <string>
     17 
     18 using namespace llvm;
     19 
     20 TEST(SmallSetTest, Insert) {
     21 
     22   SmallSet<int, 4> s1;
     23 
     24   for (int i = 0; i < 4; i++)
     25     s1.insert(i);
     26 
     27   for (int i = 0; i < 4; i++)
     28     s1.insert(i);
     29 
     30   EXPECT_EQ(4u, s1.size());
     31 
     32   for (int i = 0; i < 4; i++)
     33     EXPECT_EQ(1u, s1.count(i));
     34 
     35   EXPECT_EQ(0u, s1.count(4));
     36 }
     37 
     38 TEST(SmallSetTest, Grow) {
     39   SmallSet<int, 4> s1;
     40 
     41   for (int i = 0; i < 8; i++)
     42     s1.insert(i);
     43 
     44   EXPECT_EQ(8u, s1.size());
     45 
     46   for (int i = 0; i < 8; i++)
     47     EXPECT_EQ(1u, s1.count(i));
     48 
     49   EXPECT_EQ(0u, s1.count(8));
     50 }
     51 
     52 TEST(SmallSetTest, Erase) {
     53   SmallSet<int, 4> s1;
     54 
     55   for (int i = 0; i < 8; i++)
     56     s1.insert(i);
     57 
     58   EXPECT_EQ(8u, s1.size());
     59 
     60   // Remove elements one by one and check if all other elements are still there.
     61   for (int i = 0; i < 8; i++) {
     62     EXPECT_EQ(1u, s1.count(i));
     63     EXPECT_TRUE(s1.erase(i));
     64     EXPECT_EQ(0u, s1.count(i));
     65     EXPECT_EQ(8u - i - 1, s1.size());
     66     for (int j = i + 1; j < 8; j++)
     67       EXPECT_EQ(1u, s1.count(j));
     68   }
     69 
     70   EXPECT_EQ(0u, s1.count(8));
     71 }
     72 
     73 TEST(SmallSetTest, IteratorInt) {
     74   SmallSet<int, 4> s1;
     75 
     76   // Test the 'small' case.
     77   for (int i = 0; i < 3; i++)
     78     s1.insert(i);
     79 
     80   std::vector<int> V(s1.begin(), s1.end());
     81   // Make sure the elements are in the expected order.
     82   std::sort(V.begin(), V.end());
     83   for (int i = 0; i < 3; i++)
     84     EXPECT_EQ(i, V[i]);
     85 
     86   // Test the 'big' case by adding a few more elements to switch to std::set
     87   // internally.
     88   for (int i = 3; i < 6; i++)
     89     s1.insert(i);
     90 
     91   V.assign(s1.begin(), s1.end());
     92   // Make sure the elements are in the expected order.
     93   std::sort(V.begin(), V.end());
     94   for (int i = 0; i < 6; i++)
     95     EXPECT_EQ(i, V[i]);
     96 }
     97 
     98 TEST(SmallSetTest, IteratorString) {
     99   // Test SmallSetIterator for SmallSet with a type with non-trivial
    100   // ctors/dtors.
    101   SmallSet<std::string, 2> s1;
    102 
    103   s1.insert("str 1");
    104   s1.insert("str 2");
    105   s1.insert("str 1");
    106 
    107   std::vector<std::string> V(s1.begin(), s1.end());
    108   std::sort(V.begin(), V.end());
    109   EXPECT_EQ(2u, s1.size());
    110   EXPECT_EQ("str 1", V[0]);
    111   EXPECT_EQ("str 2", V[1]);
    112 
    113   s1.insert("str 4");
    114   s1.insert("str 0");
    115   s1.insert("str 4");
    116 
    117   V.assign(s1.begin(), s1.end());
    118   // Make sure the elements are in the expected order.
    119   std::sort(V.begin(), V.end());
    120   EXPECT_EQ(4u, s1.size());
    121   EXPECT_EQ("str 0", V[0]);
    122   EXPECT_EQ("str 1", V[1]);
    123   EXPECT_EQ("str 2", V[2]);
    124   EXPECT_EQ("str 4", V[3]);
    125 }
    126 
    127 TEST(SmallSetTest, IteratorIncMoveCopy) {
    128   // Test SmallSetIterator for SmallSet with a type with non-trivial
    129   // ctors/dtors.
    130   SmallSet<std::string, 2> s1;
    131 
    132   s1.insert("str 1");
    133   s1.insert("str 2");
    134 
    135   auto Iter = s1.begin();
    136   EXPECT_EQ("str 1", *Iter);
    137   ++Iter;
    138   EXPECT_EQ("str 2", *Iter);
    139 
    140   s1.insert("str 4");
    141   s1.insert("str 0");
    142   auto Iter2 = s1.begin();
    143   Iter = std::move(Iter2);
    144   EXPECT_EQ("str 0", *Iter);
    145 
    146   auto Iter3 = s1.end();
    147   Iter3 = Iter2;
    148   EXPECT_EQ(Iter3, Iter2);
    149 }
    150