1 /*
   2  * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * ORACLE PROPRIETARY/CONFIDENTIAL.  Use is subject to license terms.
   4  */
   5 
   6 #include "precompiled.hpp"
   7 #include "gc/z/zList.inline.hpp"
   8 #include "unittest.hpp"
   9 
  10 #ifndef PRODUCT
  11 
  12 class ZTestEntry {
  13   friend class ZList<ZTestEntry>;
  14 
  15 private:
  16   const int             _id;
  17   ZListNode<ZTestEntry> _node;
  18 
  19 public:
  20   ZTestEntry(int id) :
  21       _id(id),
  22       _node() {}
  23 
  24   int id() const {
  25     return _id;
  26   }
  27 };
  28 
  29 class ZListTest : public ::testing::Test {
  30 protected:
  31   static void assert_sorted(ZList<ZTestEntry>* list) {
  32     // Iterate forward
  33     {
  34       int count = list->first()->id();
  35       ZListIterator<ZTestEntry> iter(list);
  36       for (ZTestEntry* entry; iter.next(&entry);) {
  37         ASSERT_EQ(entry->id(), count);
  38         count++;
  39       }
  40     }
  41 
  42     // Iterate backward
  43     {
  44       int count = list->last()->id();
  45       ZListReverseIterator<ZTestEntry> iter(list);
  46       for (ZTestEntry* entry; iter.next(&entry);) {
  47         EXPECT_EQ(entry->id(), count);
  48         count--;
  49       }
  50     }
  51   }
  52 };
  53 
  54 TEST_F(ZListTest, test_insert) {
  55   ZList<ZTestEntry> list;
  56   ZTestEntry e0(0);
  57   ZTestEntry e1(1);
  58   ZTestEntry e2(2);
  59   ZTestEntry e3(3);
  60   ZTestEntry e4(4);
  61   ZTestEntry e5(5);
  62 
  63   list.insert_first(&e2);
  64   list.insert_before(&e2, &e1);
  65   list.insert_after(&e2, &e3);
  66   list.insert_last(&e4);
  67   list.insert_first(&e0);
  68   list.insert_last(&e5);
  69 
  70   EXPECT_EQ(list.size(), 6u);
  71   assert_sorted(&list);
  72 }
  73 
  74 TEST_F(ZListTest, test_remove) {
  75   // Remove first
  76   {
  77     ZList<ZTestEntry> list;
  78     ZTestEntry e0(0);
  79     ZTestEntry e1(1);
  80     ZTestEntry e2(2);
  81     ZTestEntry e3(3);
  82     ZTestEntry e4(4);
  83     ZTestEntry e5(5);
  84 
  85     list.insert_last(&e0);
  86     list.insert_last(&e1);
  87     list.insert_last(&e2);
  88     list.insert_last(&e3);
  89     list.insert_last(&e4);
  90     list.insert_last(&e5);
  91 
  92     EXPECT_EQ(list.size(), 6u);
  93 
  94     for (int i = 0; i < 6; i++) {
  95       ZTestEntry* e = list.remove_first();
  96       EXPECT_EQ(e->id(), i);
  97     }
  98 
  99     EXPECT_EQ(list.size(), 0u);
 100   }
 101 
 102   // Remove last
 103   {
 104     ZList<ZTestEntry> list;
 105     ZTestEntry e0(0);
 106     ZTestEntry e1(1);
 107     ZTestEntry e2(2);
 108     ZTestEntry e3(3);
 109     ZTestEntry e4(4);
 110     ZTestEntry e5(5);
 111 
 112     list.insert_last(&e0);
 113     list.insert_last(&e1);
 114     list.insert_last(&e2);
 115     list.insert_last(&e3);
 116     list.insert_last(&e4);
 117     list.insert_last(&e5);
 118 
 119     EXPECT_EQ(list.size(), 6u);
 120 
 121     for (int i = 5; i >= 0; i--) {
 122       ZTestEntry* e = list.remove_last();
 123       EXPECT_EQ(e->id(), i);
 124     }
 125 
 126     EXPECT_EQ(list.size(), 0u);
 127   }
 128 }
 129 
 130 TEST_F(ZListTest, test_transfer) {
 131   // Transfer empty to empty
 132   {
 133     ZList<ZTestEntry> list0;
 134     ZList<ZTestEntry> list1;
 135 
 136     EXPECT_TRUE(list0.is_empty());
 137     EXPECT_TRUE(list1.is_empty());
 138 
 139     list0.transfer(&list1);
 140 
 141     EXPECT_TRUE(list0.is_empty());
 142     EXPECT_TRUE(list1.is_empty());
 143   }
 144 
 145   // Transfer non-empty to empty
 146   {
 147     ZList<ZTestEntry> list0;
 148     ZList<ZTestEntry> list1;
 149     ZTestEntry e0(0);
 150     ZTestEntry e1(1);
 151     ZTestEntry e2(2);
 152     ZTestEntry e3(3);
 153     ZTestEntry e4(4);
 154     ZTestEntry e5(5);
 155 
 156     list1.insert_last(&e0);
 157     list1.insert_last(&e1);
 158     list1.insert_last(&e2);
 159     list1.insert_last(&e3);
 160     list1.insert_last(&e4);
 161     list1.insert_last(&e5);
 162 
 163     EXPECT_EQ(list0.size(), 0u);
 164     EXPECT_EQ(list1.size(), 6u);
 165 
 166     list0.transfer(&list1);
 167 
 168     EXPECT_EQ(list0.size(), 6u);
 169     EXPECT_EQ(list1.size(), 0u);
 170 
 171     assert_sorted(&list0);
 172   }
 173 
 174   // Transfer non-empty to non-empty
 175   {
 176     ZList<ZTestEntry> list0;
 177     ZList<ZTestEntry> list1;
 178     ZTestEntry e0(0);
 179     ZTestEntry e1(1);
 180     ZTestEntry e2(2);
 181     ZTestEntry e3(3);
 182     ZTestEntry e4(4);
 183     ZTestEntry e5(5);
 184 
 185     list0.insert_last(&e0);
 186     list0.insert_last(&e1);
 187     list0.insert_last(&e2);
 188 
 189     list1.insert_last(&e3);
 190     list1.insert_last(&e4);
 191     list1.insert_last(&e5);
 192 
 193     EXPECT_EQ(list0.size(), 3u);
 194     EXPECT_EQ(list1.size(), 3u);
 195 
 196     list0.transfer(&list1);
 197 
 198     EXPECT_EQ(list0.size(), 6u);
 199     EXPECT_EQ(list1.size(), 0u);
 200 
 201     assert_sorted(&list0);
 202   }
 203 }
 204 
 205 #endif // PRODUCT