root/hydranode/hnbase/test/test-range.cpp

Revision 2613, 12.2 kB (checked in by madcat, 3 years ago)

Copyright notice update for 2006.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 /*
2  *  Copyright (C) 2004-2006 Alo Sarv <madcat_@users.sourceforge.net>
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 /** \file test-range.cpp Regress-test for Range API */
20
21 #ifndef DOXYGEN_SHOULD_SKIP_THIS
22
23 #include <hnbase/range.h>
24 #include <hnbase/rangelist.h>
25 #include <boost/test/unit_test.hpp>
26 #include <iostream>
27
28 void test_base() {
29         Range16 r(0, 5);
30
31         BOOST_CHECK(r.length() == 6);
32         BOOST_CHECK(r.begin() == 0);
33         BOOST_CHECK(r.end() == 5);
34
35         BOOST_CHECK(r.contains(0));
36         BOOST_CHECK(r.contains(3));
37         BOOST_CHECK(r.contains(5));
38         BOOST_CHECK(!r.contains(6));
39         BOOST_CHECK(!r.contains(100));
40
41         BOOST_CHECK_THROW(r.begin(6), std::exception);
42         BOOST_CHECK_NO_THROW(r.begin(5));
43         BOOST_CHECK(r.length() == 1);
44         BOOST_CHECK_NO_THROW(r.end(10));
45         BOOST_CHECK(r.begin() == 5);
46         BOOST_CHECK(r.end() == 10);
47         BOOST_CHECK(r.length() == 6);
48
49         Range16 r1(0, 5);
50         Range16 r2(0, 2);
51         BOOST_CHECK(r1.contains(r2));
52         BOOST_CHECK(r1.contains(0, 0));
53         BOOST_CHECK(r1.contains(Range16(5, 5)));
54         BOOST_CHECK(r1.contains(5, 6));
55         BOOST_CHECK(!r1.contains(6, 6));
56
57         BOOST_CHECK(r1.containsFull(r2));
58         BOOST_CHECK(r1.containsFull(0, 4));
59         BOOST_CHECK(r1.containsFull(0, 5));
60         BOOST_CHECK(!r1.containsFull(0, 6));
61         BOOST_CHECK(r1.containsFull(5, 5));
62         BOOST_CHECK(r1.containsFull(Range16(1, 5)));
63         BOOST_CHECK(!r1.containsFull(Range16(6, 6)));
64         BOOST_CHECK(!r1.containsFull(5, 10));
65
66         Range16 r3(20, 30);
67         Range16 r4( 3, 10);
68         BOOST_CHECK(!r3.contains(r4));
69         BOOST_CHECK(!r3.borders(r4));
70
71         // test comparison operators
72         BOOST_CHECK(r1 != r2);
73         BOOST_CHECK(r2 != r1);
74         BOOST_CHECK(r3 != r4);
75 //      BOOST_CHECK(r3 > r4);
76 //      BOOST_CHECK(r4 < r3);
77 }
78
79 void test_merge() {
80         RangeList16 rl;
81         rl.push(0, 5);
82         BOOST_CHECK(rl.size() == 1);
83         // duplicates are allowed
84         BOOST_CHECK(rl.push(0, 1));
85         BOOST_CHECK(rl.push(5, 5));
86         BOOST_CHECK(rl.push(0, 100));
87         BOOST_CHECK(rl.size() == 4);
88         rl.clear();
89         rl.merge(0, 5);
90         BOOST_CHECK(rl.size() == 1);
91         rl.merge(5, 6);
92         BOOST_CHECK(rl.size() == 1);
93         rl.merge(7, 10);
94         BOOST_CHECK(rl.size() == 1);
95         rl.erase(5, 6);
96         BOOST_CHECK(rl.size() == 2);
97         rl.erase(3, 6);
98         BOOST_CHECK(rl.size() == 2);
99         rl.erase(0, 10);
100         BOOST_CHECK(rl.size() == 0);
101         rl.merge(0, 4);
102         rl.merge(5, 10);
103         rl.merge(4, 4);
104         BOOST_CHECK(rl.size() == 1);
105 }
106
107 void test_more() {
108         RangeList16 r;
109         typedef Range16 RR;
110         typedef RangeList16::CIter CIter;
111
112         CIter i;
113
114         /**************************** PART I: Adding *************************/
115         BOOST_CHECK_NO_THROW(r.merge(RR(5, 10)));
116         i = r.begin();
117         BOOST_CHECK((*i).begin() == 5);
118         BOOST_CHECK((*i).end() == 10);
119
120         BOOST_CHECK_NO_THROW(r.merge(RR(20, 30)));
121         i++;
122         BOOST_CHECK((*i).begin() == 20);
123         BOOST_CHECK((*i).end() == 30);
124         BOOST_CHECK(r.size() == 2);
125
126         // RC_CONTAINS_END
127         BOOST_CHECK_NO_THROW(r.merge(RR(3, 6)));
128         i = r.begin();
129         BOOST_CHECK((*i).begin() == 3);
130         BOOST_CHECK((*i).end() == 10);
131         i++;
132         BOOST_CHECK((*i).begin() == 20);
133         BOOST_CHECK((*i).end() == 30);
134         BOOST_CHECK(r.size() == 2);
135
136         // RC_CONTAINS_FULL - list shouldn't be changed
137         BOOST_CHECK_NO_THROW(r.merge(RR(4, 8)));
138         BOOST_CHECK_NO_THROW(r.merge(RR(3, 4)));
139         i = r.begin();
140         BOOST_CHECK((*i).begin() == 3);
141         BOOST_CHECK((*i).end() == 10);
142         i++;
143         BOOST_CHECK((*i).begin() == 20);
144         BOOST_CHECK((*i).end() == 30);
145         BOOST_CHECK(r.size() == 2);
146
147         // RC_CONTAINS_BEGIN
148         BOOST_CHECK_NO_THROW(r.merge(RR(8, 12)));
149         i = r.begin();
150         BOOST_CHECK((*i).begin() == 3);
151         BOOST_CHECK((*i).end() == 12);
152         i++;
153         BOOST_CHECK((*i).begin() == 20);
154         BOOST_CHECK((*i).end() == 30);
155         BOOST_CHECK(r.size() == 2);
156
157         // RC_BORDER_BEGIN
158         BOOST_CHECK_NO_THROW(r.merge(RR(15, 19)));
159         i = r.begin();
160         BOOST_CHECK((*i).begin() == 3);
161         BOOST_CHECK((*i).end() == 12);
162         i++;
163         BOOST_CHECK((*i).begin() == 15);
164         BOOST_CHECK((*i).end() == 30);
165         BOOST_CHECK(r.size() == 2);
166
167         // RC_BORDER_END
168         BOOST_CHECK_NO_THROW(r.merge(RR(31, 35)));
169         i = r.begin();
170         BOOST_CHECK((*i).begin() == 3);
171         BOOST_CHECK((*i).end() == 12);
172         i++;
173         BOOST_CHECK((*i).begin() == 15);
174         BOOST_CHECK((*i).end() == 35);
175         BOOST_CHECK(r.size() == 2);
176
177         // RC_BORDER_END
178         BOOST_CHECK_NO_THROW(r.merge(RR(35, 37)));
179         i = r.begin();
180         BOOST_CHECK((*i).begin() == 3);
181         BOOST_CHECK((*i).end() == 12);
182         i++;
183         BOOST_CHECK((*i).begin() == 15);
184         BOOST_CHECK((*i).end() == 37);
185         BOOST_CHECK(r.size() == 2);
186
187         // Insert between the two existing ranges
188         BOOST_CHECK_NO_THROW(r.merge(RR(13, 14)));
189         i = r.begin();
190         BOOST_CHECK((*i).begin() == 3);
191         BOOST_CHECK((*i).end() == 37);
192         BOOST_CHECK(r.size() == 1);
193
194         /************************** PART II: Erasing *************************/
195         // splitting existing range into two
196         BOOST_CHECK_NO_THROW(r.erase(RR(10, 12)));
197
198         i = r.begin();
199         BOOST_CHECK((*i).begin() == 3);
200         BOOST_CHECK((*i).end() == 9);
201         i++;
202         BOOST_CHECK((*i).begin() == 13);
203         BOOST_CHECK((*i).end() == 37);
204         BOOST_CHECK(r.size() == 2);
205
206         // removing range that doesnt exist
207         BOOST_CHECK_NO_THROW(r.erase(RR(10, 12)));
208
209         i = r.begin();
210         BOOST_CHECK((*i).begin() == 3);
211         BOOST_CHECK((*i).end() == 9);
212         i++;
213         BOOST_CHECK((*i).begin() == 13);
214         BOOST_CHECK((*i).end() == 37);
215         BOOST_CHECK(r.size() == 2);
216
217         // RC_CONTAINS_END
218         BOOST_CHECK_NO_THROW(r.erase(RR(9, 12)));
219         i = r.begin();
220         BOOST_CHECK((*i).begin() == 3);
221         BOOST_CHECK((*i).end() == 8);
222         i++;
223         BOOST_CHECK((*i).begin() == 13);
224         BOOST_CHECK((*i).end() == 37);
225         BOOST_CHECK(r.size() == 2);
226
227         BOOST_CHECK_NO_THROW(r.erase(RR(30, 40)));
228         i = r.begin();
229         BOOST_CHECK((*i).begin() == 3);
230         BOOST_CHECK((*i).end() == 8);
231         i++;
232         BOOST_CHECK((*i).begin() == 13);
233         BOOST_CHECK((*i).end() == 29);
234         BOOST_CHECK(r.size() == 2);
235
236         // RC_CONTAINS_END
237         BOOST_CHECK_NO_THROW(r.erase(RR(10, 15)));
238         i = r.begin();
239         BOOST_CHECK((*i).begin() == 3);
240         BOOST_CHECK((*i).end() == 8);
241         i++;
242         BOOST_CHECK((*i).begin() == 16);
243         BOOST_CHECK((*i).end() == 29);
244         BOOST_CHECK(r.size() == 2);
245
246         // RC_AROUND
247         BOOST_CHECK_NO_THROW(r.erase(RR(1, 10)));
248         i = r.begin();
249         BOOST_CHECK((*i).begin() == 16);
250         BOOST_CHECK((*i).end() == 29);
251         BOOST_CHECK(r.size() == 1);
252
253         // Split again
254         BOOST_CHECK_NO_THROW(r.erase(RR(20, 21)));
255         i = r.begin();
256         BOOST_CHECK((*i).begin() == 16);
257         BOOST_CHECK((*i).end() == 19);
258         i++;
259         BOOST_CHECK((*i).begin() == 22);
260         BOOST_CHECK((*i).end() == 29);
261         BOOST_CHECK(r.size() == 2);
262
263         // Complex erasing - cuts into two existing ranges
264         BOOST_CHECK_NO_THROW(r.erase(RR(18, 25)));
265         i = r.begin();
266         BOOST_CHECK((*i).begin() == 16);
267         BOOST_CHECK((*i).end() == 17);
268         i++;
269         BOOST_CHECK((*i).begin() == 26);
270         BOOST_CHECK((*i).end() == 29);
271         BOOST_CHECK(r.size() == 2);
272
273         BOOST_CHECK_NO_THROW(r.merge(RR(16, 20)));
274         // Complex merging - overlap with two existing ranges
275         BOOST_CHECK_NO_THROW(r.merge(RR(18, 28)));
276         i = r.begin();
277         BOOST_CHECK((*i).begin() == 16);
278         BOOST_CHECK((*i).end() == 29);
279         BOOST_CHECK(r.size() == 1);
280
281         // Range of size 1
282         BOOST_CHECK_NO_THROW(r.merge(RR(30, 30)));
283         i = r.begin();
284         BOOST_CHECK(r.size() == 1);
285         BOOST_CHECK((*i).begin() == 16);
286         BOOST_CHECK((*i).end() == 30);
287
288         // Another range of size 1
289         BOOST_CHECK_NO_THROW(r.merge(RR(15, 15)));
290         i = r.begin();
291         BOOST_CHECK(r.size() == 1);
292         BOOST_CHECK((*i).begin() == 15);
293         BOOST_CHECK((*i).end() == 30);
294
295         // Another range of size 1, this time inserting INTO existing range
296         BOOST_CHECK_NO_THROW(r.merge(RR(20, 20)));
297         // List shouldn't have been changed
298         i = r.begin();
299         BOOST_CHECK(r.size() == 1);
300         BOOST_CHECK((*i).begin() == 15);
301         BOOST_CHECK((*i).end() == 30);
302
303         // Add range of size 1 into random place
304         BOOST_CHECK_NO_THROW(r.merge(RR(10, 10)));
305         i = r.begin();
306         BOOST_CHECK(r.size() == 2);
307         BOOST_CHECK((*i).begin() == 10);
308         BOOST_CHECK((*i).end() == 10);
309         ++i;
310         BOOST_CHECK((*i).begin() == 15);
311         BOOST_CHECK((*i).end() == 30);
312 }
313
314 void test_getfree() {
315         RangeList16 rl;
316         rl.merge(0, 5);
317         Range16 ret(rl.getFirstFree(5));
318         BOOST_CHECK(ret.begin() == 6);
319         BOOST_CHECK(ret.end() == 10);
320         rl.merge(ret);
321         ret = rl.getFirstFree(10);
322         BOOST_CHECK(ret.begin() == 11);
323         BOOST_CHECK(ret.end() == 20);
324         rl.erase(0, 100);
325         BOOST_CHECK(rl.empty());
326         ret = rl.getFirstFree(10);
327         BOOST_CHECK(ret.begin() == 0);
328         BOOST_CHECK(ret.end() == 9);
329         rl.merge(ret);
330         rl.merge(11, 14);
331         ret = rl.getFirstFree(10);
332         BOOST_CHECK(ret.begin() == 10);
333         BOOST_CHECK(ret.end() == 10);
334         rl.merge(ret);
335         BOOST_CHECK(rl.size() == 1);
336 }
337
338 void test_contains() {
339         RangeList16 rl;
340         rl.merge(0, 5);
341         rl.merge(6, 10);
342         rl.merge(12, 15);
343         rl.merge(21, 26);
344         BOOST_CHECK(rl.size() == 3);
345         BOOST_CHECK(rl.contains(Range16(0)));
346         BOOST_CHECK(rl.contains(Range16(4)));
347         BOOST_CHECK(rl.contains(Range16(6)));
348         BOOST_CHECK(rl.contains(Range16(10)));
349         BOOST_CHECK(!rl.contains(Range16(11)));
350         BOOST_CHECK(rl.contains(Range16(12)));
351         BOOST_CHECK(!rl.contains(Range16(16)));
352         BOOST_CHECK(rl.contains(Range16(21)));
353         BOOST_CHECK(rl.contains(Range16(26)));
354         BOOST_CHECK(!rl.contains(Range16(27)));
355
356         BOOST_CHECK(rl.getContains(0, 0) != rl.end());
357         BOOST_CHECK(rl.getContains(5, 5) != rl.end());
358         BOOST_CHECK(rl.getContains(12, 15) != rl.end());
359         BOOST_CHECK(rl.getContains(0, 0)->begin() == 0);
360         BOOST_CHECK(rl.getContains(0, 0)->end() == 10);
361         BOOST_CHECK(rl.getContains(0, 5)->begin() == 0);
362         BOOST_CHECK(rl.getContains(0, 5)->end() == 10);
363         BOOST_CHECK(rl.getContains(12, 13)->begin() == 12);
364         BOOST_CHECK(rl.getContains(12, 13)->end() == 15);
365         BOOST_CHECK(rl.getContains(16, 16) == rl.end());
366         BOOST_CHECK(rl.getContains(12, 20) != rl.end());
367         BOOST_CHECK(rl.getContains(12, 20)->begin() == 12);
368         BOOST_CHECK(rl.getContains(12, 20)->end() == 15);
369
370         rl.push(0, 15);
371         BOOST_CHECK(rl.contains(Range16(0)));
372         BOOST_CHECK(rl.contains(Range16(5)));
373         BOOST_CHECK(rl.contains(Range16(11)));
374         BOOST_CHECK(rl.contains(Range16(12)));
375         BOOST_CHECK(rl.contains(Range16(13)));
376
377         rl.clear();
378         rl.merge(0, 5);
379         rl.merge(10, 15);
380         rl.merge(20, 25);
381         BOOST_CHECK(rl.contains(0, 2));
382         BOOST_CHECK(rl.contains(3, 4));
383         BOOST_CHECK(rl.contains(0, 5));
384         BOOST_CHECK(rl.contains(5, 6));
385         BOOST_CHECK(!rl.contains(6, 9));
386         BOOST_CHECK(rl.contains(6, 10));
387         BOOST_CHECK(rl.contains(Range16(10)));
388         BOOST_CHECK(rl.contains(10, 10));
389         BOOST_CHECK(rl.contains(10, 13));
390         BOOST_CHECK(rl.contains(0, 20));
391         BOOST_CHECK(!rl.contains(26, 28));
392 }
393
394 void test_even_more() {
395         RangeList16 rl;
396         rl.merge(0, 100);
397         rl.erase(0, 50);
398         BOOST_CHECK(rl.size() == 1);
399         BOOST_CHECK(rl.front().begin() == 51);
400         BOOST_CHECK(rl.front().end() == 100);
401         rl.clear();
402         rl.merge(0, 29);
403         rl.merge(34, 50);
404         rl.merge(53, 100);
405         BOOST_CHECK(rl.getContains(30, 33) == rl.end());
406         BOOST_CHECK(rl.getContains(30, 60)->begin() == 34);
407         BOOST_CHECK(rl.getContains(30, 60)->end() == 50);
408         BOOST_CHECK(rl.getContains(30, 100) != rl.end());
409         rl.erase(rl.getContains(30, 60));
410         BOOST_CHECK(rl.getContains(30, 60)->begin() == 53);
411         BOOST_CHECK(rl.getContains(30, 60)->end() == 100);
412         rl.erase(rl.getContains(55, 55));
413         BOOST_CHECK(rl.size() == 1);
414         BOOST_CHECK(rl.begin()->begin() == 0);
415         BOOST_CHECK(rl.begin()->end() == 29);
416
417         RangeList32 rl2;
418         rl2.merge(0ul, 1044496385ul);
419         rl2.merge(1044496387ul, 4294967290ul);
420         BOOST_CHECK(rl2.contains(Range32(123567ul)));
421         BOOST_CHECK(rl2.contains(Range32(1044496385ul)));
422         BOOST_CHECK(rl2.contains(Range32(123123245ul)));
423         BOOST_CHECK(rl2.contains(Range32(1044496384ul)));
424         BOOST_CHECK(rl2.contains(Range32(1044496387ul)));
425         BOOST_CHECK(rl2.contains(Range32(2669731838ul)));
426         BOOST_CHECK(rl2.contains(Range32(2669731840ul)));
427         BOOST_CHECK(rl2.contains(Range32(2669731700ul)));
428         BOOST_CHECK(!rl2.contains(Range32(1044496386ul)));
429 }
430
431 boost::unit_test::test_suite* init_unit_test_suite(int, char*[]) {
432         std::cerr << "Range Management Subsystem: ";
433         boost::unit_test::test_suite *test = 0;
434         test = BOOST_TEST_SUITE("Range Management Subsystem");
435         test->add(BOOST_TEST_CASE(&test_base));
436         test->add(BOOST_TEST_CASE(&test_merge));
437         test->add(BOOST_TEST_CASE(&test_more));
438         test->add(BOOST_TEST_CASE(&test_getfree));
439         test->add(BOOST_TEST_CASE(&test_contains));
440         test->add(BOOST_TEST_CASE(&test_even_more));
441         return test;
442 }
443
444 #endif
Note: See TracBrowser for help on using the browser.