1 #include "RangeTest.hpp"
2 #include "evoral/Range.hpp"
5 CPPUNIT_TEST_SUITE_REGISTRATION (RangeTest);
7 using namespace Evoral;
10 RangeTest::coalesceTest ()
13 fred.add (Range<int> (2, 4));
14 fred.add (Range<int> (5, 6));
15 fred.add (Range<int> (6, 8));
17 RangeList<int>::List jim = fred.get ();
19 RangeList<int>::List::iterator i = jim.begin ();
20 CPPUNIT_ASSERT_EQUAL (2, i->from);
21 CPPUNIT_ASSERT_EQUAL (4, i->to);
24 CPPUNIT_ASSERT_EQUAL (5, i->from);
25 CPPUNIT_ASSERT_EQUAL (8, i->to);
28 /* Basic subtraction of a few smaller ranges from a larger one */
30 RangeTest::subtractTest1 ()
32 Range<int> fred (0, 10);
35 jim.add (Range<int> (2, 4));
36 jim.add (Range<int> (7, 8));
38 RangeList<int> sheila = subtract (fred, jim);
40 RangeList<int>::List s = sheila.get ();
41 CPPUNIT_ASSERT_EQUAL (size_t (3), s.size ());
43 RangeList<int>::List::iterator i = s.begin ();
44 CPPUNIT_ASSERT_EQUAL (0, i->from);
45 CPPUNIT_ASSERT_EQUAL (1, i->to);
48 CPPUNIT_ASSERT_EQUAL (4, i->from);
49 CPPUNIT_ASSERT_EQUAL (6, i->to);
52 CPPUNIT_ASSERT_EQUAL (8, i->from);
53 CPPUNIT_ASSERT_EQUAL (10, i->to);
56 /* Test subtraction of a range B from a range A, where A and B do not overlap */
58 RangeTest::subtractTest2 ()
60 Range<int> fred (0, 10);
63 jim.add (Range<int> (12, 19));
65 RangeList<int> sheila = subtract (fred, jim);
67 RangeList<int>::List s = sheila.get ();
68 CPPUNIT_ASSERT_EQUAL (size_t (1), s.size ());
70 RangeList<int>::List::iterator i = s.begin ();
71 CPPUNIT_ASSERT_EQUAL (0, i->from);
72 CPPUNIT_ASSERT_EQUAL (10, i->to);
75 /* Test subtraction of B from A, where B entirely overlaps A */
77 RangeTest::subtractTest3 ()
79 Range<int> fred (0, 10);
82 jim.add (Range<int> (0, 12));
84 RangeList<int> sheila = subtract (fred, jim);
86 RangeList<int>::List s = sheila.get ();
87 CPPUNIT_ASSERT_EQUAL (size_t (0), s.size ());
90 /* A bit like subtractTest1, except some of the ranges
91 we are subtracting overlap.
94 RangeTest::subtractTest4 ()
96 Range<int> fred (0, 10);
99 jim.add (Range<int> (2, 4));
100 jim.add (Range<int> (7, 8));
101 jim.add (Range<int> (8, 9));
103 RangeList<int> sheila = subtract (fred, jim);
105 RangeList<int>::List s = sheila.get ();
106 CPPUNIT_ASSERT_EQUAL (size_t (3), s.size ());
108 RangeList<int>::List::iterator i = s.begin ();
109 CPPUNIT_ASSERT_EQUAL (0, i->from);
110 CPPUNIT_ASSERT_EQUAL (1, i->to);
113 CPPUNIT_ASSERT_EQUAL (4, i->from);
114 CPPUNIT_ASSERT_EQUAL (6, i->to);
117 CPPUNIT_ASSERT_EQUAL (9, i->from);
118 CPPUNIT_ASSERT_EQUAL (10, i->to);
121 /* A bit like subtractTest1, except some of the ranges
122 we are subtracting overlap the start / end of the
126 RangeTest::subtractTest5 ()
128 Range<int> fred (1, 12);
131 jim.add (Range<int> (0, 4));
132 jim.add (Range<int> (6, 7));
133 jim.add (Range<int> (9, 42));
135 RangeList<int> sheila = subtract (fred, jim);
137 RangeList<int>::List s = sheila.get ();
138 CPPUNIT_ASSERT_EQUAL (size_t (2), s.size ());
140 RangeList<int>::List::iterator i = s.begin ();
141 CPPUNIT_ASSERT_EQUAL (4, i->from);
142 CPPUNIT_ASSERT_EQUAL (5, i->to);
145 CPPUNIT_ASSERT_EQUAL (7, i->from);
146 CPPUNIT_ASSERT_EQUAL (8, i->to);
149 /* Test coverage() with all possible types of overlap.
153 RangeTest::coverageTest ()
157 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 1, 1), Evoral::OverlapNone);
158 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 1, 2), Evoral::OverlapNone);
159 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 1, 3), Evoral::OverlapStart);
160 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 1, 5), Evoral::OverlapStart);
161 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 1, 7), Evoral::OverlapExternal);
162 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 1, 9), Evoral::OverlapExternal);
165 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 3, 3), Evoral::OverlapStart);
166 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 3, 5), Evoral::OverlapStart);
167 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 3, 7), Evoral::OverlapExternal);
168 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 3, 9), Evoral::OverlapExternal);
171 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 4, 4), Evoral::OverlapInternal);
172 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 4, 6), Evoral::OverlapInternal);
173 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 4, 7), Evoral::OverlapEnd);
174 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 4, 8), Evoral::OverlapEnd);
176 // b starts at end of a
177 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 7, 7), Evoral::OverlapEnd);
178 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 7, 9), Evoral::OverlapEnd);
180 // b starts after end of a
181 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 8, 8), Evoral::OverlapNone);
182 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 8, 9), Evoral::OverlapNone);
184 // zero-length range a
185 CPPUNIT_ASSERT_EQUAL (coverage(3, 3, 2, 4), Evoral::OverlapExternal);
186 CPPUNIT_ASSERT_EQUAL (coverage(3, 3, 1, 2), Evoral::OverlapNone);
187 CPPUNIT_ASSERT_EQUAL (coverage(3, 3, 3, 3), Evoral::OverlapExternal);
188 CPPUNIT_ASSERT_EQUAL (coverage(3, 3, 8, 9), Evoral::OverlapNone);
190 // negative length range a
191 // XXX these are debatable - should we just consider start & end to be
192 // swapped if end < start?
193 CPPUNIT_ASSERT_EQUAL (coverage(4, 3, 1, 2), Evoral::OverlapNone);
194 CPPUNIT_ASSERT_EQUAL (coverage(4, 3, 2, 3), Evoral::OverlapNone);
195 CPPUNIT_ASSERT_EQUAL (coverage(4, 3, 2, 4), Evoral::OverlapNone);
196 CPPUNIT_ASSERT_EQUAL (coverage(4, 3, 3, 3), Evoral::OverlapNone);
197 CPPUNIT_ASSERT_EQUAL (coverage(4, 3, 8, 9), Evoral::OverlapNone);
199 // negative length range b
201 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 1, 0), Evoral::OverlapNone);
203 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 3, 2), Evoral::OverlapNone);
205 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 4, 3), Evoral::OverlapNone);
206 // b starts at end of a
207 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 7, 5), Evoral::OverlapNone);
208 // b starts after end of a
209 CPPUNIT_ASSERT_EQUAL (coverage(3, 7, 8, 7), Evoral::OverlapNone);