source: trunk/test/segment.cc @ 4032

Last change on this file since 4032 was 4032, checked in by Peter, 2 years ago

merge release 0.18.1 into trunk

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 14.6 KB
Line 
1// $Id: segment.cc 4032 2021-01-21 07:44:38Z peter $
2
3/*
4  Copyright (C) 2010, 2011, 2012, 2014, 2015, 2016, 2017, 2021 Peter Johansson
5
6  This file is part of the yat library, http://dev.thep.lu.se/yat
7
8  The yat library is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License as
10  published by the Free Software Foundation; either version 3 of the
11  License, or (at your option) any later version.
12
13  The yat library is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17
18  You should have received a copy of the GNU General Public License
19  along with yat. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include <config.h>
23
24#include "Suite.h"
25
26#include "yat/utility/Segment.h"
27#include "yat/utility/SegmentMap.h"
28#include "yat/utility/SegmentSet.h"
29
30using namespace theplu::yat;
31using namespace utility;
32void test_comp(test::Suite& suite);
33void test_compare(test::Suite& suite);
34void test_count(test::Suite&);
35void test_erase(test::Suite&);
36void test_includes(test::Suite&);
37void test_insert(test::Suite&);
38void test_insert_merge(test::Suite&);
39void test_make_segment(test::Suite&);
40void test_overlap(test::Suite&);
41void test_segment(test::Suite& suite);
42void test_operator(test::Suite& suite);
43void test_segment_map(test::Suite& suite);
44void test_segment_set(test::Suite& suite);
45void test_set_bound(test::Suite&);
46void test_union(test::Suite&);
47
48template<typename T>
49void avoid_pedantic_warning(T) {}
50
51int main(int argc, char* argv[])
52{
53  test::Suite suite(argc, argv);
54
55  test_comp(suite);
56  test_compare(suite);
57  test_count(suite);
58  test_erase(suite);
59  test_includes(suite);
60  test_insert(suite);
61  test_insert_merge(suite);
62  test_make_segment(suite);
63  test_overlap(suite);
64  test_segment(suite);
65  test_set_bound(suite);
66  test_union(suite);
67
68  test_segment_map(suite);
69  test_segment_set(suite);
70
71  return suite.return_value();
72}
73
74
75void test_comp(test::Suite& suite)
76{
77  Segment<double> key;
78  {
79    SegmentSet<double> set;
80    SegmentSet<double>::key_compare kcompare = set.key_comp();
81    if (kcompare(key, key))
82      suite.add(false);
83    test::avoid_compiler_warning(kcompare);
84    SegmentSet<double>::value_compare vcompare = set.value_comp();
85    if (vcompare(key, key))
86      suite.add(false);
87    test::avoid_compiler_warning(vcompare);
88  }
89
90  {
91    SegmentMap<double, std::string> map;
92    std::pair<const Segment<double>, std::string> value(key, "hello");
93    SegmentMap<double, std::string>::key_compare kcompare = map.key_comp();
94    if (kcompare(key, key))
95      suite.add(false);
96    test::avoid_compiler_warning(kcompare);
97    SegmentMap<double, std::string>::value_compare vcompare = map.value_comp();
98    if (vcompare(value, value))
99      suite.add(false);
100    test::avoid_compiler_warning(vcompare);
101  }
102}
103
104
105void test_compare_(test::Suite& suite, double lhs_begin, double lhs_end, 
106                   double rhs_begin, double rhs_end, int expected)
107{
108  int result = compare_3way(Segment<double>(lhs_begin,lhs_end), 
109                            Segment<double>(rhs_begin,rhs_end));
110  if (result!=expected) {
111    suite.add(false);
112    suite.err() << "error:"
113                << "[" << lhs_begin << ", " << lhs_end << ") vs "
114                << "[" << rhs_begin << ", " << rhs_end << ")\n"
115                << "result: " << result << "\n"
116                << "expected: " << expected << "\n"
117                << "\n";
118  }
119
120  compare_3way(lhs_begin, Segment<double>(rhs_begin,rhs_end));
121  compare_3way(Segment<double>(rhs_begin,rhs_end), lhs_begin);
122}
123
124void test_compare(test::Suite& suite, double lhs_begin, double lhs_end, 
125                  double rhs_begin, double rhs_end, int expected)
126{
127  test_compare_(suite, lhs_begin, lhs_end, rhs_begin, rhs_end, expected);
128  // test symmetry
129  test_compare_(suite, rhs_begin, rhs_end, lhs_begin, lhs_end, -expected);
130}
131
132void test_compare(test::Suite& suite)
133{
134  test_compare(suite, 0, 10, 20, 30, -1);
135  test_compare(suite, 0, 10, 10, 30, -1);
136  test_compare(suite, 0, 10, 5, 30, 0);
137  test_compare(suite, 0, 10, -5, 5, 0);
138  test_compare(suite, 0, 10, -5, 0, 1);
139  test_compare(suite, 0, 10, -5, -1, 1);
140  // zero sized
141  test_compare(suite, 0, 0, 20, 30, -1);
142  test_compare(suite, 0, 0, 0, 1, -1);
143  test_compare(suite, 0, 0, -5, 5, 0);
144  test_compare(suite, 0, 0, -5, 0, 1);
145  test_compare(suite, 0, 0, -5, -1, 1);
146
147  // zero sized on both sides
148  test_compare(suite, 0, 0, 1, 1, -1);
149  test_compare(suite, 0, 0, 0, 0, 0);
150  test_compare(suite, 0, 0, -1, -1, 1);
151}
152
153
154void test_erase(test::Suite& suite)
155{
156  suite.out() << "test_erase\n";
157  suite.out() << "  SegmentSet\n";
158  SegmentSet<double> set;
159  set.insert(Segment<double>(0,2));
160  set.insert(Segment<double>(10,20));
161  set.insert(Segment<double>(30,50));
162  SegmentSet<double>::iterator iter = set.find(15);
163  set.erase(iter);
164  if (!suite.add(set.size()==2))
165    suite.err() << "size: " << set.size() << " expected 2\n";
166  set.erase(set.begin(), set.end());
167  if (!suite.add(set.size()==0))
168    suite.err() << "size: " << set.size() << " expected 0\n";
169  suite.out() << "  SegmentMap\n";
170  typedef SegmentMap<double, std::string> Map;
171  Map map;
172  Map::key_type s(0,2);
173  map.insert(Map::value_type(s, "aha"));
174  map.erase(map.begin());
175  map.erase(map.begin(), map.end());
176}
177
178
179void test_insert(test::Suite& suite)
180{
181  Segment<double> segment;
182  Segment<double> segment2(0,2);
183
184  SegmentSet<double> set;
185  if (set.size()!=0) {
186    suite.add(false);
187    suite.err() << "expected size 0\n";
188  }
189  set.insert(segment2);
190  if (set.size()!=1) {
191    suite.add(false);
192    suite.err() << "expected size 1\n";
193  }
194  set.insert(segment2);
195  if (set.size()!=1) {
196    suite.add(false);
197    suite.err() << "expected size 1\n";
198  }
199  set.insert(Segment<double>(1,3));
200  if (set.size()!=1) {
201    suite.add(false);
202    suite.err() << "expected size 1\n";
203  }
204  else if (set.begin()->begin()!=0.0 || set.begin()->end()!=2.0) {
205    suite.add(false);
206    suite.err() << "error: expected segment to be [0, 2)\n"
207                << "found: [" << set.begin()->begin() 
208                << ", " << set.begin()->end() << ")\n";
209  }
210  if (!suite.add(set.find(0)!=set.end()))
211    suite.err() << "error: set.find(0): expected not end()\n";
212}
213
214void test_count(test::Suite& suite)
215{
216  SegmentSet<double> set;
217  set.insert(Segment<double>(0,2));
218  // test count
219  if (!suite.add(set.count(0)==1))
220    suite.err() << "error: set.count(0): expected 1\n";
221  if (!suite.add(set.count(1)==1))
222    suite.err() << "error: set.count(1): expected 1\n";
223  if (!suite.add(set.count(2)==0))
224    suite.err() << "error: set.count(2): expected 0\n";
225}
226
227void test_insert_merge(test::Suite& suite)
228{
229  SegmentSet<double> set;
230  set.insert(Segment<double>(0,2));
231  set.insert_merge(Segment<double>(3,5));
232  if (!suite.add(set.size()==2))
233    suite.err() << "error: set.size(): expected 2\n";
234
235  set.insert_merge(Segment<double>(12,13));
236  if (!suite.add(set.size()==3))
237    suite.err() << "error: set.size(): expected 3\n";
238
239  set.insert_merge(Segment<double>(1,4));
240  if (!suite.add(set.size()==2))
241    suite.err() << "error: set.size(): " << set.size() << " expected 2\n";
242
243  set.insert_merge(Segment<double>(0,100));
244  if (!suite.add(set.size()==1))
245    suite.err() << "error: set.size(): " << set.size() << " expected 1\n";
246  set.insert_merge(set.end(), Segment<double>(200, 1000));
247
248  SegmentSet<double> set2;
249  set2.insert_merge(set.begin(), set.end());
250  std::vector<Segment<double> > vec(set.size());
251  std::copy(set.begin(), set.end(), vec.begin());
252  set2.insert_merge(vec.begin(), vec.end());
253}
254
255
256void make_segment_foo(Segment<int> seg)
257{
258}
259
260
261void test_make_segment(test::Suite& suite)
262{
263  make_segment_foo(make_segment(12, 18));
264}
265
266
267void test_set_bound(test::Suite& suite)
268{
269  SegmentSet<double> set;
270  set.insert(Segment<double>(0,2));
271  set.begin();
272  set.end();
273  if (!suite.add(set.lower_bound(-1)==set.begin()))
274    suite.err() << "error: expected set.lower_bound to return begin()\n";
275  if (!suite.add(set.lower_bound(1)==set.begin()))
276    suite.err() << "error: expected set.lower_bound to return begin()\n";
277  if (!suite.add(set.lower_bound(2)==set.end()))
278    suite.err() << "error: expected set.lower_bound to return end()\n";
279
280  if (!suite.add(set.upper_bound(0)==set.end()))
281    suite.err() << "error: expected set.upper_bound to return end()\n";
282  if (!suite.add(set.upper_bound(2)==set.end()))
283    suite.err() << "error: expected set.upper_bound to return end()\n";
284
285  set.insert_merge(Segment<double>(3,4));
286  SegmentSet<double>::const_iterator i=set.lower_bound(3.5);
287  if (i->begin() != 3 || i->end() != 4) {
288    suite.add(false);
289    suite.out() << "found: " << i->begin() << " " << i->end() << "\n";
290    suite.out() << "expected: 3 4\n";
291  }
292
293  i=set.lower_bound(1);
294  if (i->begin() != 0 || i->end() != 2) {
295    suite.add(false);
296    suite.out() << "found: " << i->begin() << " " << i->end() << "\n";
297    suite.out() << "expected: 0 2\n";
298  }
299
300  set.clear();
301}
302
303
304void test_segment_map(test::Suite& suite)
305{
306  typedef SegmentMap<double, std::string> Map;
307  Map map;
308  Map::element_type x = 0.0;
309  avoid_pedantic_warning(x);
310  Map::key_type key = Segment<double>(1.0,2.0);
311  Map::mapped_type  mapped = "foofana";
312
313  map.insert(Map::value_type(key, mapped));
314  suite.add(map.find(1.5) != map.end());
315  suite.add(map.find(1.5)->second == "foofana");
316
317  Map::iterator i = map.begin();
318  i = map.end();
319  const Map const_map(map);
320  Map::const_iterator ci = const_map.begin();
321  ci = const_map.end();
322
323  suite.add(map.size()==1);
324  map.clear();
325  suite.add(map.empty()==true);
326  suite.add(map.size()==0);
327  map = const_map;
328  suite.add(map.size()==1);
329  suite.add(const_map.count(1.0)==1);
330  suite.add(const_map.count(0.0)==0);
331  suite.add(const_map.empty()==false);
332  suite.add(const_map.find(1.0)==const_map.begin());
333  suite.add(const_map.find(30.0)==const_map.end());
334  ci = const_map.lower_bound(0.0);
335  ci = const_map.upper_bound(0.0);
336  i = map.lower_bound(0.0);
337  i = map.upper_bound(0.0);
338}
339
340
341void test_segment_set(test::Suite& suite)
342{
343  SegmentSet<double> set;
344  Segment<double> segment(0.12,23.2);
345  set.insert_merge(segment);
346  set.insert_merge(Segment<double>(0.12,23.2));
347  SegmentSet<double>::iterator hint = set.begin();
348  set.insert_merge(hint, segment);
349  set.insert_merge(hint, Segment<double>(0.12,23.2));
350  SegmentSet<double>::const_iterator chint = set.begin();
351  set.insert_merge(chint, segment);
352  set.insert_merge(chint, Segment<double>(0.12,23.2));
353  std::vector<Segment<double>> vec(set.begin(), set.end());
354  set.insert_merge(vec.begin(), vec.end());
355
356  // test functions inherited from SegmentTree
357  SegmentSet<double>::const_iterator citer = set.begin();
358  SegmentSet<double>::const_iterator iter = set.begin();
359
360  citer = set.end();
361  iter = set.end();
362
363  if (set.count(0.13)!=1) {
364    suite.add(false);
365    suite.err() << "error: expected count = 1\n";
366  }
367  if (set.count(0.02)!=0) {
368    suite.add(false);
369    suite.err() << "error: expected count = 0\n";
370  }
371  if (set.empty()) {
372    suite.add(false);
373    suite.err() << "error: expected empty() return false";
374  }
375  if (set.find(0.15) == set.end()) {
376    suite.add(false);
377    suite.err() << "error: find returned end()";
378  }
379  set.erase(set.begin());
380  set.clear();
381  set.erase(set.begin(), set.end());
382
383  set.insert(segment);
384  set.insert(Segment<double>(102, 200));
385
386  iter = set.lower_bound(1.0);
387  citer = set.lower_bound(1.0);
388  iter = set.upper_bound(1.0);
389  citer = set.upper_bound(1.0);
390  SegmentSet<double>::size_type s = set.size();
391  test::avoid_compiler_warning(s);
392}
393
394
395void test_segment(test::Suite& suite)
396{
397  Segment<double> segment12(0,2);
398  Segment<double> segment13(1,3);
399  if (segment12==segment13) {
400    suite.add(false);
401    suite.err() << "segment12==segment13 : expected false\n";
402  }
403  if (!(segment12!=segment13)) {
404    suite.add(false);
405    suite.err() << "segment12!=segment13 : expected true\n";
406  }
407  Segment<double> segment14 = intersection(segment12, segment13);
408  suite.add(segment14.begin()==1);
409  suite.add(segment14.end()==2);
410
411  if (!suite.add(compare(Segment<double>(0,2), Segment<double>(3,4))))
412    suite.err() << "error: compare: expected 1\n";
413  if (!suite.add(compare_3way(Segment<double>(0,2), Segment<double>(3,4))==-1))
414    suite.err() << "error: compare_3way: expected -1\n";
415
416  if (!suite.add(compare(Segment<double>(0,2), Segment<double>(1,2))==false))
417    suite.err() << "error: compare: expected 0\n";
418  if (!suite.add(compare_3way(Segment<double>(0,2), Segment<double>(1,2))==0))
419    suite.err() << "error: compare_3way: expected 0\n";
420
421  if (!suite.add(compare(Segment<double>(3,4), Segment<double>(0,2))==false))
422    suite.err() << "error: compare: expected 0\n";
423  if (!suite.add(compare_3way(Segment<double>(3,4), Segment<double>(0,2))==1))
424    suite.err() << "error: compare_3way: expected 1\n";
425
426}
427
428
429void test_includes(test::Suite& suite, const Segment<int>& a,
430                   const Segment<int>& b, bool answer)
431{
432  if (includes(a, b) != answer) {
433    suite.add(false);
434    suite.err() << "error: includes: "
435                << "[" << a.begin() << ", "
436                << a.end() << ") "
437                << "[" << b.begin() << ", "
438                << b.end() << ") "
439                << "expected: " << answer << "\n";
440  }
441}
442
443
444void test_includes(test::Suite& suite)
445{
446  Segment<int> a(0, 10);
447  Segment<int> b(0, 5);
448  Segment<int> c(5, 10);
449
450  test_includes(suite, a, a, true);
451  test_includes(suite, a, b, false);
452  test_includes(suite, a, c, false);
453
454  test_includes(suite, b, a, true);
455  test_includes(suite, b, b, true);
456  test_includes(suite, b, c, false);
457
458  test_includes(suite, c, a, true);
459  test_includes(suite, c, b, false);
460  test_includes(suite, c, c, true);
461}
462
463
464void test_overlap(test::Suite& suite, const Segment<int>& a,
465                  const Segment<int>& b, bool answer)
466{
467  if (overlap(a, b) != answer) {
468    suite.add(false);
469    suite.err() << "error: overlap: "
470                << "[" << a.begin() << ", "
471                << a.end() << ") "
472                << "[" << b.begin() << ", "
473                << b.end() << ") "
474                << "expected: " << answer << "\n";
475  }
476}
477
478
479void test_overlap(test::Suite& suite)
480{
481  Segment<int> a(0, 10);
482  Segment<int> b(0, 5);
483  Segment<int> c(5, 10);
484
485  test_overlap(suite, a, a, true);
486  test_overlap(suite, a, b, true);
487  test_overlap(suite, a, c, true);
488
489  test_overlap(suite, b, a, true);
490  test_overlap(suite, b, b, true);
491  test_overlap(suite, b, c, false);
492
493  test_overlap(suite, c, a, true);
494  test_overlap(suite, c, b, false);
495  test_overlap(suite, c, c, true);
496}
497
498
499void test_union(test::Suite& suite, const Segment<int>& a,
500                const Segment<int>& b, const Segment<int>& answer)
501{
502  if (set_union(a, b) != answer) {
503    suite.add(false);
504    suite.err() << "error: union: "
505                << "[" << a.begin() << ", "
506                << a.end() << ") "
507                << "[" << b.begin() << ", "
508                << b.end() << ") "
509                << "expected: [" << answer.begin() << "," << answer.end()
510                << " )\n";
511  }
512}
513
514
515void test_union(test::Suite& suite)
516{
517  Segment<int> a(0, 10);
518  Segment<int> b(0, 5);
519  Segment<int> c(5, 12);
520
521  test_union(suite, a, a, a);
522  test_union(suite, a, b, a);
523  test_union(suite, a, c, Segment<int>(0,12));
524
525  test_union(suite, b, a, a);
526  test_union(suite, b, b, b);
527  test_union(suite, b, c, Segment<int>(0,12));
528
529  test_union(suite, c, a, Segment<int>(0,12));
530  test_union(suite, c, b, Segment<int>(0,12));
531  test_union(suite, c, c, c);
532}
Note: See TracBrowser for help on using the repository browser.