incomplete merge of master into windows (requires upcoming changes to master to be...
[ardour.git] / libs / evoral / test / RangeTest.cpp
1 #include "RangeTest.hpp"
2 #include "evoral/Range.hpp"
3 #include <stdlib.h>
4
5 CPPUNIT_TEST_SUITE_REGISTRATION (RangeTest);
6
7 using namespace Evoral;
8
9 void
10 RangeTest::coalesceTest ()
11 {
12         RangeList<int> fred;
13         fred.add (Range<int> (2, 4));
14         fred.add (Range<int> (5, 6));
15         fred.add (Range<int> (6, 8));
16
17         RangeList<int>::List jim = fred.get ();
18
19         RangeList<int>::List::iterator i = jim.begin ();
20         CPPUNIT_ASSERT_EQUAL (2, i->from);
21         CPPUNIT_ASSERT_EQUAL (4, i->to);
22
23         ++i;
24         CPPUNIT_ASSERT_EQUAL (5, i->from);
25         CPPUNIT_ASSERT_EQUAL (8, i->to);
26 }
27
28 /* Basic subtraction of a few smaller ranges from a larger one */
29 void
30 RangeTest::subtractTest1 ()
31 {
32         Range<int> fred (0, 10);
33
34         RangeList<int> jim;
35         jim.add (Range<int> (2, 4));
36         jim.add (Range<int> (7, 8));
37
38         RangeList<int> sheila = subtract (fred, jim);
39
40         RangeList<int>::List s = sheila.get ();
41         CPPUNIT_ASSERT_EQUAL (size_t (3), s.size ());
42
43         RangeList<int>::List::iterator i = s.begin ();
44         CPPUNIT_ASSERT_EQUAL (0, i->from);
45         CPPUNIT_ASSERT_EQUAL (1, i->to);
46
47         ++i;
48         CPPUNIT_ASSERT_EQUAL (4, i->from);
49         CPPUNIT_ASSERT_EQUAL (6, i->to);
50
51         ++i;
52         CPPUNIT_ASSERT_EQUAL (8, i->from);
53         CPPUNIT_ASSERT_EQUAL (10, i->to);
54 }
55
56 /* Test subtraction of a range B from a range A, where A and B do not overlap */
57 void
58 RangeTest::subtractTest2 ()
59 {
60         Range<int> fred (0, 10);
61
62         RangeList<int> jim;
63         jim.add (Range<int> (12, 19));
64
65         RangeList<int> sheila = subtract (fred, jim);
66
67         RangeList<int>::List s = sheila.get ();
68         CPPUNIT_ASSERT_EQUAL (size_t (1), s.size ());
69
70         RangeList<int>::List::iterator i = s.begin ();
71         CPPUNIT_ASSERT_EQUAL (0, i->from);
72         CPPUNIT_ASSERT_EQUAL (10, i->to);
73 }
74
75 /* Test subtraction of B from A, where B entirely overlaps A */
76 void
77 RangeTest::subtractTest3 ()
78 {
79         Range<int> fred (0, 10);
80
81         RangeList<int> jim;
82         jim.add (Range<int> (0, 12));
83
84         RangeList<int> sheila = subtract (fred, jim);
85
86         RangeList<int>::List s = sheila.get ();
87         CPPUNIT_ASSERT_EQUAL (size_t (0), s.size ());
88 }
89
90 /* A bit like subtractTest1, except some of the ranges
91    we are subtracting overlap.
92 */
93 void
94 RangeTest::subtractTest4 ()
95 {
96         Range<int> fred (0, 10);
97
98         RangeList<int> jim;
99         jim.add (Range<int> (2, 4));
100         jim.add (Range<int> (7, 8));
101         jim.add (Range<int> (8, 9));
102
103         RangeList<int> sheila = subtract (fred, jim);
104
105         RangeList<int>::List s = sheila.get ();
106         CPPUNIT_ASSERT_EQUAL (size_t (3), s.size ());
107
108         RangeList<int>::List::iterator i = s.begin ();
109         CPPUNIT_ASSERT_EQUAL (0, i->from);
110         CPPUNIT_ASSERT_EQUAL (1, i->to);
111
112         ++i;
113         CPPUNIT_ASSERT_EQUAL (4, i->from);
114         CPPUNIT_ASSERT_EQUAL (6, i->to);
115
116         ++i;
117         CPPUNIT_ASSERT_EQUAL (9, i->from);
118         CPPUNIT_ASSERT_EQUAL (10, i->to);
119 }
120
121 /* A bit like subtractTest1, except some of the ranges
122    we are subtracting overlap the start / end of the
123    initial range.
124 */
125 void
126 RangeTest::subtractTest5 ()
127 {
128         Range<int> fred (1, 12);
129
130         RangeList<int> jim;
131         jim.add (Range<int> (0, 4));
132         jim.add (Range<int> (6, 7));
133         jim.add (Range<int> (9, 42));
134
135         RangeList<int> sheila = subtract (fred, jim);
136
137         RangeList<int>::List s = sheila.get ();
138         CPPUNIT_ASSERT_EQUAL (size_t (2), s.size ());
139
140         RangeList<int>::List::iterator i = s.begin ();
141         CPPUNIT_ASSERT_EQUAL (4, i->from);
142         CPPUNIT_ASSERT_EQUAL (5, i->to);
143
144         ++i;
145         CPPUNIT_ASSERT_EQUAL (7, i->from);
146         CPPUNIT_ASSERT_EQUAL (8, i->to);
147 }