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