1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
2 
3 /*
4     Sonic Visualiser
5     An audio file viewer and annotation editor.
6     Centre for Digital Music, Queen Mary, University of London.
7 
8     This program 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 2 of the
11     License, or (at your option) any later version.  See the file
12     COPYING included with this distribution for more information.
13 */
14 
15 #ifndef TEST_EVENT_SERIES_H
16 #define TEST_EVENT_SERIES_H
17 
18 #include "../EventSeries.h"
19 
20 #include <QObject>
21 #include <QtTest>
22 
23 #include <iostream>
24 
25 using namespace std;
26 
27 class TestEventSeries : public QObject
28 {
29     Q_OBJECT
30 
31 private slots:
empty()32     void empty() {
33 
34         EventSeries s;
35         QCOMPARE(s.isEmpty(), true);
36         QCOMPARE(s.count(), 0);
37 
38         Event p(10, QString());
39         QCOMPARE(s.contains(p), false);
40         QCOMPARE(s.getEventsCovering(400), EventVector());
41     }
42 
singleEvent()43     void singleEvent() {
44 
45         EventSeries s;
46         Event p(10, QString());
47         s.add(p);
48         QCOMPARE(s.isEmpty(), false);
49         QCOMPARE(s.count(), 1);
50         QCOMPARE(s.contains(p), true);
51 
52         s.remove(p);
53         QCOMPARE(s.isEmpty(), true);
54         QCOMPARE(s.count(), 0);
55         QCOMPARE(s.contains(p), false);
56     }
57 
duplicateEvents()58     void duplicateEvents() {
59 
60         EventSeries s;
61         Event p(10, QString());
62         s.add(p);
63         s.add(p);
64         QCOMPARE(s.isEmpty(), false);
65         QCOMPARE(s.count(), 2);
66         QCOMPARE(s.contains(p), true);
67 
68         s.remove(p);
69         QCOMPARE(s.isEmpty(), false);
70         QCOMPARE(s.count(), 1);
71         QCOMPARE(s.contains(p), true);
72 
73         s.remove(p);
74         QCOMPARE(s.isEmpty(), true);
75         QCOMPARE(s.count(), 0);
76         QCOMPARE(s.contains(p), false);
77     }
78 
singleEventCover()79     void singleEventCover() {
80 
81         EventSeries s;
82         Event p(10, QString());
83         s.add(p);
84         EventVector cover;
85         cover.push_back(p);
86         QCOMPARE(s.getEventsCovering(10), cover);
87         QCOMPARE(s.getEventsCovering(11), EventVector());
88         QCOMPARE(s.getEventsCovering(9), EventVector());
89     }
90 
singleEventSpan()91     void singleEventSpan() {
92 
93         EventSeries s;
94         Event p(10, QString());
95         s.add(p);
96         EventVector span;
97         span.push_back(p);
98         QCOMPARE(s.getEventsSpanning(10, 2), span);
99         QCOMPARE(s.getEventsSpanning(9, 2), span);
100         QCOMPARE(s.getEventsSpanning(8, 2), EventVector());
101         QCOMPARE(s.getEventsSpanning(7, 2), EventVector());
102         QCOMPARE(s.getEventsSpanning(11, 2), EventVector());
103     }
104 
identicalEventsCover()105     void identicalEventsCover() {
106 
107         EventSeries s;
108         Event p(10, QString());
109         s.add(p);
110         s.add(p);
111 
112         EventVector cover;
113         cover.push_back(p);
114         cover.push_back(p);
115         QCOMPARE(s.getEventsCovering(10), cover);
116         QCOMPARE(s.getEventsCovering(11), EventVector());
117         QCOMPARE(s.getEventsCovering(9), EventVector());
118 
119         s.remove(p);
120         cover.clear();
121         cover.push_back(p);
122         QCOMPARE(s.getEventsCovering(10), cover);
123         QCOMPARE(s.getEventsCovering(11), EventVector());
124         QCOMPARE(s.getEventsCovering(9), EventVector());
125     }
126 
identicalEventsSpan()127     void identicalEventsSpan() {
128 
129         EventSeries s;
130         Event p(10, QString());
131         s.add(p);
132         s.add(p);
133 
134         EventVector span;
135         span.push_back(p);
136         span.push_back(p);
137         QCOMPARE(s.getEventsSpanning(10, 2), span);
138         QCOMPARE(s.getEventsSpanning(9, 2), span);
139         QCOMPARE(s.getEventsSpanning(8, 2), EventVector());
140         QCOMPARE(s.getEventsSpanning(11, 2), EventVector());
141     }
142 
similarEventsCover()143     void similarEventsCover() {
144 
145         EventSeries s;
146         Event a(10, QString("a"));
147         Event b(10, QString("b"));
148         s.add(a);
149         s.add(b);
150         EventVector cover;
151         cover.push_back(a);
152         cover.push_back(b);
153         QCOMPARE(s.getEventsCovering(10), cover);
154         QCOMPARE(s.getEventsCovering(11), EventVector());
155         QCOMPARE(s.getEventsCovering(9), EventVector());
156     }
157 
similarEventsSpan()158     void similarEventsSpan() {
159 
160         EventSeries s;
161         Event a(10, QString("a"));
162         Event b(10, QString("b"));
163         s.add(a);
164         s.add(b);
165         EventVector span;
166         span.push_back(a);
167         span.push_back(b);
168         QCOMPARE(s.getEventsSpanning(10, 2), span);
169         QCOMPARE(s.getEventsSpanning(9, 2), span);
170         QCOMPARE(s.getEventsSpanning(11, 2), EventVector());
171         QCOMPARE(s.getEventsSpanning(8, 2), EventVector());
172     }
173 
singleEventWithDurationCover()174     void singleEventWithDurationCover() {
175 
176         EventSeries s;
177         Event p(10, 1.0, 20, QString());
178         s.add(p);
179         EventVector cover;
180         cover.push_back(p);
181         QCOMPARE(s.getEventsCovering(10), cover);
182         QCOMPARE(s.getEventsCovering(11), cover);
183         QCOMPARE(s.getEventsCovering(29), cover);
184         QCOMPARE(s.getEventsCovering(30), EventVector());
185         QCOMPARE(s.getEventsCovering(9), EventVector());
186     }
187 
singleEventWithDurationSpan()188     void singleEventWithDurationSpan() {
189 
190         EventSeries s;
191         Event p(10, 1.0, 20, QString());
192         s.add(p);
193         EventVector span;
194         span.push_back(p);
195         QCOMPARE(s.getEventsSpanning(9, 2), span);
196         QCOMPARE(s.getEventsSpanning(8, 2), EventVector());
197         QCOMPARE(s.getEventsSpanning(19, 4), span);
198         QCOMPARE(s.getEventsSpanning(29, 2), span);
199         QCOMPARE(s.getEventsSpanning(30, 2), EventVector());
200     }
201 
identicalEventsWithDurationCover()202     void identicalEventsWithDurationCover() {
203 
204         EventSeries s;
205         Event p(10, 1.0, 20, QString());
206         s.add(p);
207         s.add(p);
208         EventVector cover;
209         cover.push_back(p);
210         cover.push_back(p);
211         QCOMPARE(s.getEventsCovering(10), cover);
212         QCOMPARE(s.getEventsCovering(11), cover);
213         QCOMPARE(s.getEventsCovering(29), cover);
214         QCOMPARE(s.getEventsCovering(30), EventVector());
215         QCOMPARE(s.getEventsCovering(9), EventVector());
216 
217         s.remove(p);
218         cover.clear();
219         cover.push_back(p);
220         QCOMPARE(s.getEventsCovering(10), cover);
221         QCOMPARE(s.getEventsCovering(11), cover);
222         QCOMPARE(s.getEventsCovering(29), cover);
223         QCOMPARE(s.getEventsCovering(30), EventVector());
224         QCOMPARE(s.getEventsCovering(9), EventVector());
225     }
226 
identicalEventsWithDurationSpan()227     void identicalEventsWithDurationSpan() {
228 
229         EventSeries s;
230         Event p(10, 1.0, 20, QString());
231         s.add(p);
232         s.add(p);
233         EventVector span;
234         span.push_back(p);
235         span.push_back(p);
236         QCOMPARE(s.getEventsSpanning(9, 2), span);
237         QCOMPARE(s.getEventsSpanning(10, 2), span);
238         QCOMPARE(s.getEventsSpanning(11, 2), span);
239         QCOMPARE(s.getEventsSpanning(29, 2), span);
240         QCOMPARE(s.getEventsSpanning(30, 2), EventVector());
241         QCOMPARE(s.getEventsSpanning(8, 2), EventVector());
242     }
243 
multipleEventsCover()244     void multipleEventsCover() {
245 
246         EventSeries s;
247         Event a(10, QString("a"));
248         Event b(11, QString("b"));
249         Event c(40, QString("c"));
250         s.add(c);
251         s.add(a);
252         s.add(b);
253         s.remove(a);
254         s.add(a);
255         s.add(c);
256         s.remove(c);
257         QCOMPARE(s.count(), 3);
258         EventVector cover;
259         cover.push_back(a);
260         QCOMPARE(s.getEventsCovering(10), cover);
261         cover.clear();
262         cover.push_back(c);
263         QCOMPARE(s.getEventsCovering(40), cover);
264         QCOMPARE(s.getEventsCovering(9), EventVector());
265     }
266 
multipleEventsSpan()267     void multipleEventsSpan() {
268 
269         EventSeries s;
270         Event a(10, QString("a"));
271         Event b(11, QString("b"));
272         Event c(40, QString("c"));
273         s.add(c);
274         s.add(a);
275         s.add(b);
276         EventVector span;
277         span.push_back(a);
278         span.push_back(b);
279         QCOMPARE(s.getEventsSpanning(10, 2), span);
280         span.clear();
281         span.push_back(c);
282         QCOMPARE(s.getEventsSpanning(39, 3), span);
283         QCOMPARE(s.getEventsSpanning(9, 1), EventVector());
284         QCOMPARE(s.getEventsSpanning(10, 0), EventVector());
285     }
286 
multipleEventsEndFrame()287     void multipleEventsEndFrame() {
288 
289         EventSeries s;
290         Event a(10, QString("a"));
291         Event b(11, QString("b"));
292         Event c(40, QString("c"));
293         s.add(c);
294         s.add(a);
295         s.add(b);
296         s.add(b);
297         QCOMPARE(s.getEndFrame(), sv_frame_t(40));
298         s.remove(c);
299         QCOMPARE(s.getEndFrame(), sv_frame_t(11));
300         s.remove(b);
301         QCOMPARE(s.getEndFrame(), sv_frame_t(11));
302         s.remove(a);
303         QCOMPARE(s.getEndFrame(), sv_frame_t(11));
304         s.remove(b);
305         QCOMPARE(s.getEndFrame(), sv_frame_t(0));
306     }
307 
disjointEventsWithDurationCover()308     void disjointEventsWithDurationCover() {
309 
310         EventSeries s;
311         Event a(10, 1.0f, 20, QString("a"));
312         Event b(100, 1.2f, 30, QString("b"));
313         s.add(a);
314         s.add(b);
315         QCOMPARE(s.getEventsCovering(0), EventVector());
316         QCOMPARE(s.getEventsCovering(10), EventVector({ a }));
317         QCOMPARE(s.getEventsCovering(15), EventVector({ a }));
318         QCOMPARE(s.getEventsCovering(30), EventVector());
319         QCOMPARE(s.getEventsCovering(99), EventVector());
320         QCOMPARE(s.getEventsCovering(100), EventVector({ b }));
321         QCOMPARE(s.getEventsCovering(120), EventVector({ b }));
322         QCOMPARE(s.getEventsCovering(130), EventVector());
323     }
324 
disjointEventsWithDurationSpan()325     void disjointEventsWithDurationSpan() {
326 
327         EventSeries s;
328         Event a(10, 1.0f, 20, QString("a"));
329         Event b(100, 1.2f, 30, QString("b"));
330         s.add(a);
331         s.add(b);
332         QCOMPARE(s.getEventsSpanning(0, 10), EventVector());
333         QCOMPARE(s.getEventsSpanning(10, 10), EventVector({ a }));
334         QCOMPARE(s.getEventsSpanning(15, 85), EventVector({ a }));
335         QCOMPARE(s.getEventsSpanning(30, 5), EventVector());
336         QCOMPARE(s.getEventsSpanning(99, 1), EventVector());
337         QCOMPARE(s.getEventsSpanning(100, 1), EventVector({ b }));
338         QCOMPARE(s.getEventsSpanning(120, 20), EventVector({ b }));
339         QCOMPARE(s.getEventsSpanning(130, 109), EventVector());
340     }
341 
overlappingEventsWithAndWithoutDurationCover()342     void overlappingEventsWithAndWithoutDurationCover() {
343 
344         EventSeries s;
345         Event p(20, QString("p"));
346         Event a(10, 1.0f, 20, QString("a"));
347         s.add(p);
348         s.add(a);
349         EventVector cover;
350         cover.push_back(a);
351         QCOMPARE(s.getEventsCovering(15), cover);
352         QCOMPARE(s.getEventsCovering(25), cover);
353         cover.clear();
354         cover.push_back(p);
355         cover.push_back(a);
356         QCOMPARE(s.getEventsCovering(20), cover);
357     }
358 
overlappingEventsWithAndWithoutDurationSpan()359     void overlappingEventsWithAndWithoutDurationSpan() {
360 
361         EventSeries s;
362         Event p(20, QString("p"));
363         Event a(10, 1.0f, 20, QString("a"));
364         s.add(p);
365         s.add(a);
366         EventVector span;
367         span.push_back(a);
368         QCOMPARE(s.getEventsSpanning(5, 10), span);
369         QCOMPARE(s.getEventsSpanning(25, 5), span);
370         span.clear();
371         span.push_back(p);
372         span.push_back(a);
373         QCOMPARE(s.getEventsSpanning(20, 1), span);
374     }
375 
overlappingEventsWithDurationCover()376     void overlappingEventsWithDurationCover() {
377 
378         EventSeries s;
379         Event a(20, 1.0f, 10, QString("a"));
380         Event b(10, 1.0f, 20, QString("b"));
381         Event c(10, 1.0f, 40, QString("c"));
382         s.add(a);
383         s.add(b);
384         s.add(c);
385         QCOMPARE(s.getEventsCovering(10), EventVector({ b, c }));
386         QCOMPARE(s.getEventsCovering(20), EventVector({ b, c, a }));
387         QCOMPARE(s.getEventsCovering(25), EventVector({ b, c, a }));
388         QCOMPARE(s.getEventsCovering(30), EventVector({ c }));
389         QCOMPARE(s.getEventsCovering(40), EventVector({ c }));
390         QCOMPARE(s.getEventsCovering(50), EventVector());
391     }
392 
overlappingEventsWithDurationSpan()393     void overlappingEventsWithDurationSpan() {
394 
395         EventSeries s;
396         Event a(20, 1.0f, 10, QString("a"));
397         Event b(10, 1.0f, 20, QString("b"));
398         Event c(10, 1.0f, 40, QString("c"));
399         s.add(a);
400         s.add(b);
401         s.add(c);
402         QCOMPARE(s.getEventsSpanning(10, 5), EventVector({ b, c }));
403         QCOMPARE(s.getEventsSpanning(20, 15), EventVector({ b, c, a }));
404         QCOMPARE(s.getEventsSpanning(0, 100), EventVector({ b, c, a }));
405         QCOMPARE(s.getEventsSpanning(25, 4), EventVector({ b, c, a }));
406         QCOMPARE(s.getEventsSpanning(30, 4), EventVector({ c }));
407         QCOMPARE(s.getEventsSpanning(40, 15), EventVector({ c }));
408         QCOMPARE(s.getEventsSpanning(50, 10), EventVector());
409     }
410 
eventPatternCover()411     void eventPatternCover() {
412 
413         EventSeries s;
414         Event a(0, 1.0f, 18, QString("a"));
415         Event b(3, 2.0f, 6, QString("b"));
416         Event c(5, 3.0f, 2, QString("c"));
417         Event cc(5, 3.1f, 2, QString("cc"));
418         Event d(6, 4.0f, 10, QString("d"));
419         Event dd(6, 4.5f, 10, QString("dd"));
420         Event e(14, 5.0f, 3, QString("e"));
421         s.add(b);
422         s.add(c);
423         s.add(d);
424         s.add(a);
425         s.add(cc);
426         s.add(dd);
427         s.add(e);
428         QCOMPARE(s.getEventsCovering(8), EventVector({ a, b, d, dd }));
429     }
430 
eventPatternSpan()431     void eventPatternSpan() {
432 
433         EventSeries s;
434         Event a(0, 1.0f, 18, QString("a"));
435         Event b(3, 2.0f, 6, QString("b"));
436         Event c(5, 3.0f, 2, QString("c"));
437         Event cc(5, 3.1f, 2, QString("cc"));
438         Event d(6, 4.0f, 10, QString("d"));
439         Event dd(6, 4.5f, 10, QString("dd"));
440         Event e(14, 5.0f, 3, QString("e"));
441         s.add(b);
442         s.add(c);
443         s.add(d);
444         s.add(a);
445         s.add(cc);
446         s.add(dd);
447         s.add(e);
448         QCOMPARE(s.getEventsSpanning(6, 2), EventVector({ a, b, c, cc, d, dd }));
449     }
450 
eventPatternWithin()451     void eventPatternWithin() {
452 
453         EventSeries s;
454         Event a(0, 1.0f, 18, QString("a"));
455         Event b(3, 2.0f, 6, QString("b"));
456         Event c(5, 3.0f, 2, QString("c"));
457         Event cc(5, 3.1f, 2, QString("cc"));
458         Event d(6, 4.0f, 10, QString("d"));
459         Event dd(6, 4.5f, 10, QString("dd"));
460         Event e(14, 5.0f, 3, QString("e"));
461         s.add(b);
462         s.add(c);
463         s.add(d);
464         s.add(a);
465         s.add(cc);
466         s.add(dd);
467         s.add(e);
468         QCOMPARE(s.getEventsWithin(2, 7), EventVector({ b, c, cc }));
469     }
470 
eventPatternWithinWithOverspill()471     void eventPatternWithinWithOverspill() {
472 
473         EventSeries s;
474         Event a(0, 1.0f, 18, QString("a"));
475         Event b(3, 2.0f, 6, QString("b"));
476         Event c(5, 3.0f, 2, QString("c"));
477         Event cc(5, 3.1f, 2, QString("cc"));
478         Event d(6, 4.0f, 10, QString("d"));
479         Event dd(6, 4.5f, 10, QString("dd"));
480         Event e(14, 5.0f, 3, QString("e"));
481         s.add(b);
482         s.add(c);
483         s.add(d);
484         s.add(a);
485         s.add(cc);
486         s.add(dd);
487         s.add(e);
488         QCOMPARE(s.getEventsWithin(0, 0, 0), EventVector());
489         QCOMPARE(s.getEventsWithin(0, 0, 1), EventVector({ a }));
490         QCOMPARE(s.getEventsWithin(0, 0, 2), EventVector({ a, b }));
491         QCOMPARE(s.getEventsWithin(20, 1, 0), EventVector());
492         QCOMPARE(s.getEventsWithin(20, 1, 1), EventVector({ e }));
493         QCOMPARE(s.getEventsWithin(20, 1, 2), EventVector({ dd, e }));
494         QCOMPARE(s.getEventsWithin(2, 7, 0), EventVector({ b, c, cc }));
495         QCOMPARE(s.getEventsWithin(2, 7, 1), EventVector({ a, b, c, cc, d }));
496         QCOMPARE(s.getEventsWithin(2, 7, 2), EventVector({ a, b, c, cc, d, dd }));
497         QCOMPARE(s.getEventsWithin(2, 7, 3), EventVector({ a, b, c, cc, d, dd, e }));
498         QCOMPARE(s.getEventsWithin(2, 7, 4), EventVector({ a, b, c, cc, d, dd, e }));
499     }
500 
eventPatternStartingWithin()501     void eventPatternStartingWithin() {
502 
503         EventSeries s;
504         Event a(0, 1.0f, 18, QString("a"));
505         Event b(3, 2.0f, 6, QString("b"));
506         Event c(5, 3.0f, 2, QString("c"));
507         Event cc(5, 3.1f, 2, QString("cc"));
508         Event d(6, 4.0f, 10, QString("d"));
509         Event dd(6, 4.5f, 10, QString("dd"));
510         Event e(14, 5.0f, 3, QString("e"));
511         s.add(b);
512         s.add(c);
513         s.add(d);
514         s.add(a);
515         s.add(cc);
516         s.add(dd);
517         s.add(e);
518         QCOMPARE(s.getEventsStartingWithin(2, 7),
519                  EventVector({ b, c, cc, d, dd }));
520     }
521 
eventPatternStartingAt()522     void eventPatternStartingAt() {
523 
524         EventSeries s;
525         Event a(0, 1.0f, 18, QString("a"));
526         Event b(3, 2.0f, 6, QString("b"));
527         Event c(5, 3.0f, 2, QString("c"));
528         Event cc(5, 3.1f, 2, QString("cc"));
529         Event d(6, 4.0f, 10, QString("d"));
530         Event dd(6, 4.5f, 10, QString("dd"));
531         Event e(14, 5.0f, 3, QString("e"));
532         s.add(b);
533         s.add(c);
534         s.add(d);
535         s.add(a);
536         s.add(cc);
537         s.add(dd);
538         s.add(e);
539         QCOMPARE(s.getEventsStartingAt(2), EventVector());
540         QCOMPARE(s.getEventsStartingAt(5), EventVector({ c, cc }));
541     }
542 
eventPatternEndFrame()543     void eventPatternEndFrame() {
544 
545         EventSeries s;
546         Event a(0, 1.0f, 18, QString("a"));
547         Event b(3, 2.0f, 6, QString("b"));
548         Event c(5, 3.0f, 2, QString("c"));
549         Event cc(5, 3.1f, 2, QString("cc"));
550         Event d(6, 4.0f, 10, QString("d"));
551         Event dd(6, 4.5f, 10, QString("dd"));
552         Event e(14, 5.0f, 3, QString("e"));
553         s.add(b);
554         s.add(c);
555         s.add(d);
556         s.add(a);
557         s.add(cc);
558         s.add(dd);
559         s.add(e);
560         QCOMPARE(s.getEndFrame(), sv_frame_t(18));
561     }
562 
eventPatternAddRemove()563     void eventPatternAddRemove() {
564 
565         // This is mostly here to exercise the innards of EventSeries
566         // and check it doesn't crash out with any internal
567         // consistency problems
568 
569         EventSeries s;
570         Event a(0, 1.0f, 18, QString("a"));
571         Event b(3, 2.0f, 6, QString("b"));
572         Event c(5, 3.0f, 2, QString("c"));
573         Event cc(5, 3.1f, 2, QString("cc"));
574         Event d(6, 4.0f, 10, QString("d"));
575         Event dd(6, 4.5f, 10, QString("dd"));
576         Event e(14, 5.0f, 3, QString("e"));
577         s.add(b);
578         s.add(c);
579         s.add(d);
580         s.add(a);
581         s.add(cc);
582         s.add(dd);
583         s.add(e);
584         QCOMPARE(s.count(), 7);
585         s.remove(d);
586         QCOMPARE(s.getEventsCovering(8), EventVector({ a, b, dd }));
587         QCOMPARE(s.getEndFrame(), sv_frame_t(18));
588         s.remove(e);
589         s.remove(a);
590         QCOMPARE(s.getEventsCovering(8), EventVector({ b, dd }));
591         QCOMPARE(s.getEndFrame(), sv_frame_t(16));
592         s.remove(cc);
593         s.remove(c);
594         s.remove(dd);
595         QCOMPARE(s.getEventsCovering(8), EventVector({ b }));
596         QCOMPARE(s.getEndFrame(), sv_frame_t(9));
597         s.remove(b);
598         QCOMPARE(s.getEventsCovering(8), EventVector());
599         QCOMPARE(s.count(), 0);
600         QCOMPARE(s.isEmpty(), true);
601         QCOMPARE(s.getEndFrame(), sv_frame_t(0));
602     }
603 
preceding()604     void preceding() {
605 
606         EventSeries s;
607         Event a(0, 1.0f, 18, QString("a"));
608         Event b(3, 2.0f, 6, QString("b"));
609         Event c(5, 3.0f, 2, QString("c"));
610         Event cc(5, 3.1f, 2, QString("cc"));
611         Event d(6, 4.0f, 10, QString("d"));
612         Event dd(6, 4.5f, 10, QString("dd"));
613         Event e(14, 5.0f, 3, QString("e"));
614         s.add(b);
615         s.add(c);
616         s.add(d);
617         s.add(d); // again
618         s.add(a);
619         s.add(cc);
620         s.add(dd);
621         s.add(e);
622         Event p;
623         QCOMPARE(s.getEventPreceding(e, p), true);
624         QCOMPARE(p, dd);
625         QCOMPARE(s.getEventPreceding(p, p), true);
626         QCOMPARE(p, d);
627         QCOMPARE(s.getEventPreceding(p, p), true);
628         QCOMPARE(p, cc);
629         QCOMPARE(s.getEventPreceding(p, p), true);
630         QCOMPARE(p, c);
631         QCOMPARE(s.getEventPreceding(p, p), true);
632         QCOMPARE(p, b);
633         QCOMPARE(s.getEventPreceding(p, p), true);
634         QCOMPARE(p, a);
635         QCOMPARE(s.getEventPreceding(p, p), false);
636     }
637 
following()638     void following() {
639 
640         EventSeries s;
641         Event a(0, 1.0f, 18, QString("a"));
642         Event b(3, 2.0f, 6, QString("b"));
643         Event c(5, 3.0f, 2, QString("c"));
644         Event cc(5, 3.1f, 2, QString("cc"));
645         Event d(6, 4.0f, 10, QString("d"));
646         Event dd(6, 4.5f, 10, QString("dd"));
647         Event e(14, 5.0f, 3, QString("e"));
648         s.add(b);
649         s.add(c);
650         s.add(d);
651         s.add(d); // again
652         s.add(a);
653         s.add(cc);
654         s.add(dd);
655         s.add(e);
656         Event p;
657         QCOMPARE(s.getEventFollowing(a, p), true);
658         QCOMPARE(p, b);
659         QCOMPARE(s.getEventFollowing(p, p), true);
660         QCOMPARE(p, c);
661         QCOMPARE(s.getEventFollowing(p, p), true);
662         QCOMPARE(p, cc);
663         QCOMPARE(s.getEventFollowing(p, p), true);
664         QCOMPARE(p, d);
665         QCOMPARE(s.getEventFollowing(p, p), true);
666         QCOMPARE(p, dd);
667         QCOMPARE(s.getEventFollowing(p, p), true);
668         QCOMPARE(p, e);
669         QCOMPARE(s.getEventFollowing(p, p), false);
670     }
671 
matchingForward()672     void matchingForward() {
673 
674         EventSeries s;
675         Event p;
676         QCOMPARE(s.getNearestEventMatching
677                  (6, [](Event e) { return e.getDuration() < 4; },
678                   EventSeries::Forward, p), false);
679         Event a(0, 1.0f, 18, QString("a"));
680         Event b(3, 2.0f, 6, QString("b"));
681         Event c(5, 3.0f, 2, QString("c"));
682         Event cc(5, 3.1f, 2, QString("cc"));
683         Event d(6, 4.0f, 10, QString("d"));
684         Event dd(6, 4.5f, 10, QString("dd"));
685         Event e(14, 5.0f, 3, QString("e"));
686         s.add(b);
687         s.add(c);
688         s.add(d);
689         s.add(d); // again
690         s.add(a);
691         s.add(cc);
692         s.add(dd);
693         s.add(e);
694         QCOMPARE(s.getNearestEventMatching
695                  (0, [](Event e) { return e.getDuration() < 4; },
696                   EventSeries::Forward, p), true);
697         QCOMPARE(p, c);
698         QCOMPARE(s.getNearestEventMatching
699                  (6, [](Event e) { return e.getDuration() < 4; },
700                   EventSeries::Forward, p), true);
701         QCOMPARE(p, e);
702         QCOMPARE(s.getNearestEventMatching
703                  (6, [](Event e) { return e.getDuration() > 4; },
704                   EventSeries::Forward, p), true);
705         QCOMPARE(p, d);
706         QCOMPARE(s.getNearestEventMatching
707                  (20, [](Event e) { return e.getDuration() > 4; },
708                   EventSeries::Forward, p), false);
709     }
710 
matchingBackward()711     void matchingBackward() {
712 
713         EventSeries s;
714         Event p;
715         QCOMPARE(s.getNearestEventMatching
716                  (6, [](Event e) { return e.getDuration() < 4; },
717                   EventSeries::Backward, p), false);
718         Event a(0, 1.0f, 18, QString("a"));
719         Event b(3, 2.0f, 6, QString("b"));
720         Event c(5, 3.0f, 2, QString("c"));
721         Event cc(5, 3.1f, 2, QString("cc"));
722         Event d(6, 4.0f, 10, QString("d"));
723         Event dd(6, 4.5f, 10, QString("dd"));
724         Event e(14, 5.0f, 3, QString("e"));
725         s.add(b);
726         s.add(c);
727         s.add(d);
728         s.add(d); // again
729         s.add(a);
730         s.add(cc);
731         s.add(dd);
732         s.add(e);
733         QCOMPARE(s.getNearestEventMatching
734                  (0, [](Event e) { return e.getDuration() < 4; },
735                   EventSeries::Backward, p), false);
736         QCOMPARE(s.getNearestEventMatching
737                  (6, [](Event e) { return e.getDuration() > 4; },
738                   EventSeries::Backward, p), true);
739         QCOMPARE(p, b);
740         QCOMPARE(s.getNearestEventMatching
741                  (20, [](Event e) { return e.getDuration() > 4; },
742                   EventSeries::Backward, p), true);
743         QCOMPARE(p, dd);
744     }
745 };
746 
747 #endif
748