source: mainline/uspace/lib/c/test/dyn_array.c@ c2d50c8

Last change on this file since c2d50c8 was c2d50c8, checked in by Matthieu Riolo <matthieu.riolo@…>, 6 years ago

dyn_array: Add concat and clear_range operations

  • Property mode set to 100644
File size: 6.3 KB
Line 
1/*
2 * Copyright (c) 2015 Michal Koutny
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <adt/dyn_array.h>
30#include <assert.h>
31#include <pcut/pcut.h>
32
33PCUT_INIT
34
35PCUT_TEST_SUITE(dyn_array);
36
37typedef int data_t;
38static dyn_array_t da;
39
40PCUT_TEST_BEFORE {
41 dyn_array_initialize(&da, data_t);
42 int rc = dyn_array_reserve(&da, 3);
43 assert(rc == EOK);
44}
45
46PCUT_TEST_AFTER {
47 dyn_array_destroy(&da);
48}
49
50PCUT_TEST(initialization) {
51 PCUT_ASSERT_INT_EQUALS(da.capacity, 3);
52 PCUT_ASSERT_INT_EQUALS(da.size, 0);
53}
54
55PCUT_TEST(append) {
56 dyn_array_append(&da, data_t, 42);
57 dyn_array_append(&da, data_t, 666);
58
59 PCUT_ASSERT_INT_EQUALS(2, da.size);
60 PCUT_ASSERT_INT_EQUALS(42, dyn_array_at(&da, data_t, 0));
61 PCUT_ASSERT_INT_EQUALS(666, dyn_array_at(&da, data_t, 1));
62}
63
64PCUT_TEST(assign) {
65 dyn_array_append(&da, data_t, 42);
66 dyn_array_at(&da, data_t, 0) = 112;
67
68 PCUT_ASSERT_INT_EQUALS(112, dyn_array_at(&da, data_t, 0));
69}
70
71PCUT_TEST(remove) {
72 dyn_array_append(&da, data_t, 10);
73 dyn_array_append(&da, data_t, 11);
74
75 dyn_array_remove(&da, 0);
76
77 PCUT_ASSERT_INT_EQUALS(1, da.size);
78 PCUT_ASSERT_INT_EQUALS(11, dyn_array_at(&da, data_t, 0));
79}
80
81PCUT_TEST(insert) {
82 dyn_array_append(&da, data_t, 10);
83 dyn_array_append(&da, data_t, 11);
84 dyn_array_append(&da, data_t, 12);
85 dyn_array_insert(&da, data_t, 1, 99);
86
87 PCUT_ASSERT_INT_EQUALS(4, da.size);
88 PCUT_ASSERT_INT_EQUALS(10, dyn_array_at(&da, data_t, 0));
89 PCUT_ASSERT_INT_EQUALS(99, dyn_array_at(&da, data_t, 1));
90 PCUT_ASSERT_INT_EQUALS(11, dyn_array_at(&da, data_t, 2));
91 PCUT_ASSERT_INT_EQUALS(12, dyn_array_at(&da, data_t, 3));
92}
93
94PCUT_TEST(capacity_grow) {
95 dyn_array_append(&da, data_t, 42);
96 dyn_array_append(&da, data_t, 666);
97 dyn_array_append(&da, data_t, 42);
98 dyn_array_append(&da, data_t, 666);
99
100 PCUT_ASSERT_TRUE(da.capacity > 3);
101}
102
103PCUT_TEST(capacity_shrink) {
104 dyn_array_append(&da, data_t, 42);
105 dyn_array_append(&da, data_t, 666);
106 dyn_array_append(&da, data_t, 42);
107
108 dyn_array_remove(&da, 0);
109 dyn_array_remove(&da, 0);
110 dyn_array_remove(&da, 0);
111
112 PCUT_ASSERT_TRUE(da.capacity < 3);
113}
114
115PCUT_TEST(iterator) {
116 for (int i = 0; i < 10; ++i) {
117 dyn_array_append(&da, data_t, i*i);
118 }
119
120 int i = 0;
121 dyn_array_foreach(da, data_t, it) {
122 PCUT_ASSERT_INT_EQUALS(i*i, *it);
123 ++i;
124 }
125}
126
127PCUT_TEST(find) {
128 dyn_array_append(&da, data_t, 10);
129 dyn_array_append(&da, data_t, 11);
130 dyn_array_append(&da, data_t, 12);
131 dyn_array_append(&da, data_t, 99);
132
133 PCUT_ASSERT_INT_EQUALS(0, dyn_array_find(&da, data_t, 10));
134 PCUT_ASSERT_INT_EQUALS(3, dyn_array_find(&da, data_t, 99));
135 PCUT_ASSERT_INT_EQUALS(4, dyn_array_find(&da, data_t, 666));
136}
137
138PCUT_TEST(clear_range_middle) {
139 dyn_array_append(&da, data_t, 10);
140 dyn_array_append(&da, data_t, 11);
141 dyn_array_append(&da, data_t, 12);
142 dyn_array_append(&da, data_t, 99);
143
144 dyn_array_clear_range(&da, 1, 3);
145 PCUT_ASSERT_INT_EQUALS(2, da.size);
146 PCUT_ASSERT_INT_EQUALS(10, dyn_array_at(&da, data_t, 0));
147 PCUT_ASSERT_INT_EQUALS(99, dyn_array_at(&da, data_t, 1));
148}
149
150PCUT_TEST(clear_range_begin) {
151 dyn_array_append(&da, data_t, 10);
152 dyn_array_append(&da, data_t, 11);
153 dyn_array_append(&da, data_t, 12);
154 dyn_array_append(&da, data_t, 99);
155
156 dyn_array_clear_range(&da, 0, 2);
157 PCUT_ASSERT_INT_EQUALS(2, da.size);
158 PCUT_ASSERT_INT_EQUALS(12, dyn_array_at(&da, data_t, 0));
159 PCUT_ASSERT_INT_EQUALS(99, dyn_array_at(&da, data_t, 1));
160}
161
162PCUT_TEST(clear_range_end) {
163 dyn_array_append(&da, data_t, 10);
164 dyn_array_append(&da, data_t, 11);
165 dyn_array_append(&da, data_t, 12);
166 dyn_array_append(&da, data_t, 99);
167
168 dyn_array_clear_range(&da, 2, 4);
169 PCUT_ASSERT_INT_EQUALS(2, da.size);
170 PCUT_ASSERT_INT_EQUALS(10, dyn_array_at(&da, data_t, 0));
171 PCUT_ASSERT_INT_EQUALS(11, dyn_array_at(&da, data_t, 1));
172}
173
174PCUT_TEST(clear_range_empty) {
175 dyn_array_append(&da, data_t, 10);
176 dyn_array_append(&da, data_t, 99);
177
178 dyn_array_clear_range(&da, 0, 0);
179 PCUT_ASSERT_INT_EQUALS(2, da.size);
180 PCUT_ASSERT_INT_EQUALS(10, dyn_array_at(&da, data_t, 0));
181 PCUT_ASSERT_INT_EQUALS(99, dyn_array_at(&da, data_t, 1));
182}
183
184PCUT_TEST(concat_simple) {
185 dyn_array_append(&da, data_t, 10);
186 dyn_array_append(&da, data_t, 99);
187
188 dyn_array_t da2;
189 dyn_array_initialize(&da2, data_t);
190 dyn_array_append(&da2, data_t, 30);
191 dyn_array_append(&da2, data_t, 31);
192
193 dyn_array_concat(&da, &da2);
194 PCUT_ASSERT_INT_EQUALS(4, da.size);
195 PCUT_ASSERT_INT_EQUALS(2, da2.size);
196
197 PCUT_ASSERT_INT_EQUALS(10, dyn_array_at(&da, data_t, 0));
198 PCUT_ASSERT_INT_EQUALS(99, dyn_array_at(&da, data_t, 1));
199 PCUT_ASSERT_INT_EQUALS(30, dyn_array_at(&da, data_t, 2));
200 PCUT_ASSERT_INT_EQUALS(31, dyn_array_at(&da, data_t, 3));
201
202 dyn_array_destroy(&da2);
203}
204PCUT_TEST(concat_self) {
205 dyn_array_append(&da, data_t, 10);
206 dyn_array_append(&da, data_t, 99);
207
208 dyn_array_concat(&da, &da);
209 PCUT_ASSERT_INT_EQUALS(4, da.size);
210
211 PCUT_ASSERT_INT_EQUALS(10, dyn_array_at(&da, data_t, 0));
212 PCUT_ASSERT_INT_EQUALS(99, dyn_array_at(&da, data_t, 1));
213 PCUT_ASSERT_INT_EQUALS(10, dyn_array_at(&da, data_t, 2));
214 PCUT_ASSERT_INT_EQUALS(99, dyn_array_at(&da, data_t, 3));
215}
216
217PCUT_EXPORT(dyn_array);
Note: See TracBrowser for help on using the repository browser.