Fix some bugs when testing opensds ansible
[stor4nfv.git] / src / ceph / src / test / test_xlist.cc
1 #include <algorithm>
2 #include <iterator>
3 #include <vector>
4 #include "include/xlist.h"
5
6 #include "gtest/gtest.h"
7
8
9 struct Item {
10   xlist<Item*>::item xitem;
11   int val;
12
13   explicit Item(int v) :
14     xitem(this),
15     val(v)
16   {}
17 };
18
19 class XlistTest : public testing::Test
20 {
21 protected:
22   typedef xlist<Item*> ItemList;
23   typedef std::vector<Item*> Items;
24   typedef std::vector<ItemList::item*> Refs;
25   Items items;
26   // for filling up an ItemList
27   Refs refs;
28
29   void SetUp() override {
30     for (int i = 0; i < 13; i++) {
31       items.push_back(new Item(i));
32       refs.push_back(&items.back()->xitem);
33     }
34   }
35   void TearDown() override {
36     for (Items::iterator i = items.begin(); i != items.end(); ++i) {
37       delete *i;
38     }
39     items.clear();
40   }
41 };
42
43 TEST_F(XlistTest, capability) {
44   ItemList list;
45   ASSERT_TRUE(list.empty());
46   ASSERT_EQ(list.size(), 0);
47
48   std::copy(refs.begin(), refs.end(), std::back_inserter(list));
49   ASSERT_EQ((size_t)list.size(), refs.size());
50
51   list.clear();
52   ASSERT_TRUE(list.empty());
53   ASSERT_EQ(list.size(), 0);
54 }
55
56 TEST_F(XlistTest, traverse) {
57   ItemList list;
58   std::copy(refs.begin(), refs.end(), std::back_inserter(list));
59
60   // advance until iterator::end()
61   size_t index = 0;
62   for (ItemList::iterator i = list.begin(); !i.end(); ++i) {
63     ASSERT_EQ(*i, items[index]);
64     index++;
65   }
66   // advance until i == v.end()
67   index = 0;
68   for (ItemList::iterator i = list.begin(); i != list.end(); ++i) {
69     ASSERT_EQ(*i, items[index]);
70     index++;
71   }
72   list.clear();
73 }
74
75 TEST_F(XlistTest, move_around) {
76   Item item1(42), item2(17);
77   ItemList list;
78
79   // only a single element in the list
80   list.push_back(&item1.xitem);
81   ASSERT_EQ(&item1, list.front());
82   ASSERT_EQ(&item1, list.back());
83
84   list.push_back(&item2.xitem);
85   ASSERT_EQ(&item1, list.front());
86   ASSERT_EQ(&item2, list.back());
87
88   // move item2 to the front
89   list.push_front(&item2.xitem);
90   ASSERT_EQ(&item2, list.front());
91   ASSERT_EQ(&item1, list.back());
92
93   // and move it back
94   list.push_back(&item2.xitem);
95   ASSERT_EQ(&item1, list.front());
96   ASSERT_EQ(&item2, list.back());
97
98   list.clear();
99 }
100
101 TEST_F(XlistTest, item_queries) {
102   Item item(42);
103   ItemList list;
104   list.push_back(&item.xitem);
105
106   ASSERT_TRUE(item.xitem.is_on_list());
107   ASSERT_EQ(&list, item.xitem.get_list());
108
109   ASSERT_TRUE(item.xitem.remove_myself());
110   ASSERT_FALSE(item.xitem.is_on_list());
111   ASSERT_TRUE(item.xitem.get_list() == NULL);
112 }
113
114 // Local Variables:
115 // compile-command: "cd .. ;
116 //   make unittest_xlist &&
117 //   ./unittest_xlist"
118 // End: