capnproto

FORK: Cap'n Proto serialization/RPC system - core tools and C++ library
git clone https://git.neptards.moe/neptards/capnproto.git
Log | Files | Refs | README | LICENSE

list-test.c++ (4260B)


      1 // Copyright (c) 2021 Cloudflare, Inc. and contributors
      2 // Licensed under the MIT License:
      3 //
      4 // Permission is hereby granted, free of charge, to any person obtaining a copy
      5 // of this software and associated documentation files (the "Software"), to deal
      6 // in the Software without restriction, including without limitation the rights
      7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      8 // copies of the Software, and to permit persons to whom the Software is
      9 // furnished to do so, subject to the following conditions:
     10 //
     11 // The above copyright notice and this permission notice shall be included in
     12 // all copies or substantial portions of the Software.
     13 //
     14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     20 // THE SOFTWARE.
     21 
     22 #include "list.h"
     23 #include <kj/test.h>
     24 
     25 namespace kj {
     26 namespace {
     27 
     28 struct TestElement {
     29   int i;
     30   ListLink<TestElement> link;
     31 
     32   TestElement(int i): i(i) {}
     33 };
     34 
     35 KJ_TEST("List") {
     36   List<TestElement, &TestElement::link> list;
     37   KJ_EXPECT(list.empty());
     38   KJ_EXPECT(list.size() == 0);
     39 
     40   TestElement foo(123);
     41   TestElement bar(456);
     42 
     43   {
     44     list.add(foo);
     45     KJ_DEFER(list.remove(foo));
     46     KJ_EXPECT(!list.empty());
     47     KJ_EXPECT(list.size() == 1);
     48     KJ_EXPECT(list.front().i == 123);
     49 
     50     {
     51       list.add(bar);
     52       KJ_EXPECT(list.size() == 2);
     53       KJ_DEFER(list.remove(bar));
     54 
     55       {
     56         auto iter = list.begin();
     57         KJ_ASSERT(iter != list.end());
     58         KJ_EXPECT(iter->i == 123);
     59         ++iter;
     60         KJ_ASSERT(iter != list.end());
     61         KJ_EXPECT(iter->i == 456);
     62         iter->i = 321;
     63         KJ_EXPECT(bar.i == 321);
     64         ++iter;
     65         KJ_ASSERT(iter == list.end());
     66       }
     67 
     68       const List<TestElement, &TestElement::link>& clist = list;
     69 
     70       {
     71         auto iter = clist.begin();
     72         KJ_ASSERT(iter != clist.end());
     73         KJ_EXPECT(iter->i == 123);
     74         ++iter;
     75         KJ_ASSERT(iter != clist.end());
     76         KJ_EXPECT(iter->i == 321);
     77         ++iter;
     78         KJ_ASSERT(iter == clist.end());
     79       }
     80     }
     81 
     82     KJ_EXPECT(list.size() == 1);
     83 
     84     KJ_EXPECT(!list.empty());
     85     KJ_EXPECT(list.front().i == 123);
     86 
     87     {
     88       auto iter = list.begin();
     89       KJ_ASSERT(iter != list.end());
     90       KJ_EXPECT(iter->i == 123);
     91       ++iter;
     92       KJ_ASSERT(iter == list.end());
     93     }
     94   }
     95 
     96   KJ_EXPECT(list.empty());
     97   KJ_EXPECT(list.size() == 0);
     98 
     99   {
    100     list.add(bar);
    101     KJ_DEFER(list.remove(bar));
    102     KJ_EXPECT(!list.empty());
    103     KJ_EXPECT(list.size() == 1);
    104     KJ_EXPECT(list.front().i == 321);
    105 
    106     {
    107       auto iter = list.begin();
    108       KJ_ASSERT(iter != list.end());
    109       KJ_EXPECT(iter->i == 321);
    110       ++iter;
    111       KJ_ASSERT(iter == list.end());
    112     }
    113   }
    114 
    115   KJ_EXPECT(list.empty());
    116   KJ_EXPECT(list.size() == 0);
    117 }
    118 
    119 KJ_TEST("List remove while iterating") {
    120   List<TestElement, &TestElement::link> list;
    121   KJ_EXPECT(list.empty());
    122 
    123   TestElement foo(123);
    124   list.add(foo);
    125   KJ_DEFER(list.remove(foo));
    126 
    127   TestElement bar(456);
    128   list.add(bar);
    129 
    130   TestElement baz(789);
    131   list.add(baz);
    132   KJ_DEFER(list.remove(baz));
    133 
    134   KJ_EXPECT(foo.link.isLinked());
    135   KJ_EXPECT(bar.link.isLinked());
    136   KJ_EXPECT(baz.link.isLinked());
    137 
    138   {
    139     auto iter = list.begin();
    140     KJ_ASSERT(iter != list.end());
    141     KJ_EXPECT(iter->i == 123);
    142     ++iter;
    143 
    144     KJ_ASSERT(iter != list.end());
    145     KJ_EXPECT(iter->i == 456);
    146     list.remove(*iter);
    147     ++iter;
    148 
    149     KJ_ASSERT(iter != list.end());
    150     KJ_EXPECT(iter->i == 789);
    151     ++iter;
    152 
    153     KJ_EXPECT(iter == list.end());
    154   }
    155 
    156   KJ_EXPECT(foo.link.isLinked());
    157   KJ_EXPECT(!bar.link.isLinked());
    158   KJ_EXPECT(baz.link.isLinked());
    159 
    160   {
    161     auto iter = list.begin();
    162     KJ_ASSERT(iter != list.end());
    163     KJ_EXPECT(iter->i == 123);
    164     ++iter;
    165 
    166     KJ_ASSERT(iter != list.end());
    167     KJ_EXPECT(iter->i == 789);
    168     ++iter;
    169 
    170     KJ_EXPECT(iter == list.end());
    171   }
    172 }
    173 
    174 }  // namespace
    175 }  // namespace kj