test_list.c (6092B)
1 /* Copyright (C) 2013-2023, 2025 Vincent Forest (vaplv@free.fr) 2 * 3 * The RSys library is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published 5 * by the Free Software Foundation, either version 3 of the License, or 6 * (at your option) any later version. 7 * 8 * The RSys library is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with the RSys library. If not, see <http://www.gnu.org/licenses/>. */ 15 16 #include "list.h" 17 #include "mem_allocator.h" 18 #include "rsys.h" 19 20 int 21 main(int argc, char** argv) 22 { 23 struct elmt { 24 struct list_node node; 25 char c; 26 } elmt0, elmt1, elmt2; 27 struct list_node list, list1; 28 struct list_node* n = NULL; 29 struct list_node* tmp = NULL; 30 int i = 0; 31 32 (void)argc; 33 (void)argv; 34 35 list_init(&list); 36 list_init(&list1); 37 list_init(&elmt0.node); 38 list_init(&elmt1.node); 39 list_init(&elmt2.node); 40 41 CHK(is_list_empty(&list) == 1); 42 43 elmt0.c = 'a'; 44 list_add(&list, &elmt0.node); 45 CHK(is_list_empty(&list) == 0); 46 CHK(list_head(&list) == &elmt0.node); 47 48 elmt1.c = 'b'; 49 list_add(&list, &elmt1.node); 50 CHK(is_list_empty(&list) == 0); 51 CHK(elmt1.node.next == &elmt0.node); 52 CHK(elmt1.node.prev == &list); 53 CHK(elmt1.node.next->prev == &elmt1.node); 54 CHK(list_head(&list) == &elmt1.node); 55 56 elmt2.c = 'c'; 57 list_add_tail(&list, &elmt2.node); 58 CHK(is_list_empty(&list) == 0); 59 CHK(elmt2.node.next == &list); 60 CHK(elmt2.node.prev == &elmt0.node); 61 CHK(elmt2.node.prev->prev == &elmt1.node); 62 CHK(elmt1.node.next->next == &elmt2.node); 63 CHK(elmt0.node.next == &elmt2.node); 64 CHK(list_head(&list) == &elmt1.node); 65 CHK(list_tail(&list) == &elmt2.node); 66 67 list_del(&elmt0.node); 68 CHK(is_list_empty(&list) == 0); 69 CHK(elmt2.node.next == &list); 70 CHK(elmt2.node.prev == &elmt1.node); 71 CHK(elmt1.node.next == &elmt2.node); 72 CHK(elmt1.node.prev == &list); 73 CHK(list_head(&list) == &elmt1.node); 74 CHK(list_tail(&list) == &elmt2.node); 75 76 list_del(&elmt2.node); 77 CHK(is_list_empty(&list) == 0); 78 CHK(elmt1.node.next == &list); 79 CHK(elmt1.node.prev == &list); 80 CHK(list_head(&list) == &elmt1.node); 81 CHK(list_tail(&list) == &elmt1.node); 82 83 list_del(&elmt1.node); 84 CHK(is_list_empty(&list) == 1); 85 86 list_add(&list, &elmt2.node); 87 list_add(&list, &elmt1.node); 88 list_add(&list, &elmt0.node); 89 CHK(is_list_empty(&list) == 0); 90 CHK(elmt2.node.next == &list); 91 CHK(elmt2.node.prev == &elmt1.node); 92 CHK(elmt1.node.next == &elmt2.node); 93 CHK(elmt1.node.prev == &elmt0.node); 94 CHK(elmt0.node.next == &elmt1.node); 95 CHK(elmt0.node.prev == &list); 96 CHK(list_head(&list) == &elmt0.node); 97 CHK(list_tail(&list) == &elmt2.node); 98 99 CHK(is_list_empty(&list1) == 1); 100 list_move(&elmt1.node, &list1); 101 CHK(is_list_empty(&list) == 0); 102 CHK(is_list_empty(&list1) == 0); 103 CHK(elmt2.node.next == &list); 104 CHK(elmt2.node.prev == &elmt0.node); 105 CHK(elmt1.node.next == &list1); 106 CHK(elmt1.node.prev == &list1); 107 CHK(elmt0.node.next == &elmt2.node); 108 CHK(elmt0.node.prev == &list); 109 CHK(list_head(&list) == &elmt0.node); 110 CHK(list_tail(&list) == &elmt2.node); 111 CHK(list_head(&list1) == &elmt1.node); 112 CHK(list_tail(&list1) == &elmt1.node); 113 114 list_move_tail(&elmt2.node, &list1); 115 CHK(is_list_empty(&list) == 0); 116 CHK(is_list_empty(&list1) == 0); 117 CHK(elmt2.node.next == &list1); 118 CHK(elmt2.node.prev == &elmt1.node); 119 CHK(elmt1.node.next == &elmt2.node); 120 CHK(elmt1.node.prev == &list1); 121 CHK(elmt0.node.next == &list); 122 CHK(elmt0.node.prev == &list); 123 CHK(list_head(&list) == &elmt0.node); 124 CHK(list_tail(&list) == &elmt0.node); 125 CHK(list_head(&list1) == &elmt1.node); 126 CHK(list_tail(&list1) == &elmt2.node); 127 128 list_move(&elmt0.node, &list1); 129 CHK(is_list_empty(&list) == 1); 130 CHK(is_list_empty(&list1) == 0); 131 CHK(elmt2.node.next == &list1); 132 CHK(elmt2.node.prev == &elmt1.node); 133 CHK(elmt1.node.next == &elmt2.node); 134 CHK(elmt1.node.prev == &elmt0.node); 135 CHK(elmt0.node.next == &elmt1.node); 136 CHK(elmt0.node.prev == &list1); 137 CHK(list_head(&list1) == &elmt0.node); 138 CHK(list_tail(&list1) == &elmt2.node); 139 140 i = 0; 141 LIST_FOR_EACH(n, &list1) { 142 struct elmt* e = CONTAINER_OF(n, struct elmt, node); 143 CHK(e->c == 'a' + i); 144 ++i; 145 } 146 CHK(i == 3); 147 148 i = 3; 149 LIST_FOR_EACH_REVERSE(n, &list1) { 150 struct elmt* e = CONTAINER_OF(n, struct elmt, node); 151 --i; 152 CHK(e->c == 'a' + i); 153 } 154 CHK(i == 0); 155 156 i = 0; 157 LIST_FOR_EACH_SAFE(n, tmp, &list1) { 158 struct elmt* e = NULL; 159 list_move_tail(n, &list); 160 e = CONTAINER_OF(n, struct elmt, node); 161 CHK(e->c == 'a' + i); 162 ++i; 163 } 164 CHK(i == 3); 165 CHK(is_list_empty(&list1) == 1); 166 CHK(is_list_empty(&list) == 0); 167 168 i = 3; 169 LIST_FOR_EACH_REVERSE_SAFE(n, tmp, &list) { 170 struct elmt* e = NULL; 171 list_move(n, &list1); 172 e = CONTAINER_OF(n, struct elmt, node); 173 --i; 174 CHK(e->c == 'a' + i); 175 } 176 CHK(i == 0); 177 CHK(is_list_empty(&list1) == 0); 178 CHK(is_list_empty(&list) == 1); 179 180 i = 0; 181 LIST_FOR_EACH(n, &list1) { 182 struct elmt* e = CONTAINER_OF(n, struct elmt, node); 183 CHK(e->c == 'a' + i); 184 ++i; 185 } 186 CHK(i == 3); 187 188 list_move(&elmt1.node, &list1); 189 CHK(elmt2.node.next == &list1); 190 CHK(elmt2.node.prev == &elmt0.node); 191 CHK(elmt1.node.next == &elmt0.node); 192 CHK(elmt1.node.prev == &list1); 193 CHK(elmt0.node.next == &elmt2.node); 194 CHK(elmt0.node.prev == &elmt1.node); 195 CHK(list_head(&list1) == &elmt1.node); 196 CHK(list_tail(&list1) == &elmt2.node); 197 198 list_move_tail(&elmt0.node, &list1); 199 CHK(elmt2.node.next == &elmt0.node); 200 CHK(elmt2.node.prev == &elmt1.node); 201 CHK(elmt1.node.next == &elmt2.node); 202 CHK(elmt1.node.prev == &list1); 203 CHK(elmt0.node.next == &list1); 204 CHK(elmt0.node.prev == &elmt2.node); 205 CHK(list_head(&list1) == &elmt1.node); 206 CHK(list_tail(&list1) == &elmt0.node); 207 208 CHK(MEM_ALLOCATED_SIZE(&mem_default_allocator) == 0); 209 210 return 0; 211 }