@@ -1,106 +1,154 | |||||
1 | #include <QObject> |
|
1 | #include <QObject> | |
2 | #include <QtTest> |
|
2 | #include <QtTest> | |
3 | #include <QUuid> |
|
3 | #include <QUuid> | |
4 | #include <limits> |
|
4 | #include <limits> | |
5 |
|
5 | |||
6 |
|
6 | |||
7 | #include <Data/DateTimeRange.h> |
|
7 | #include <Data/DateTimeRange.h> | |
8 | #include <Common/Numeric.h> |
|
8 | #include <Common/Numeric.h> | |
9 |
|
9 | |||
10 | Q_DECLARE_METATYPE(Seconds<double>); |
|
10 | Q_DECLARE_METATYPE(Seconds<double>); | |
11 |
|
11 | |||
12 | DateTimeRange computeZoom(QDateTime start, QDateTime stop, double zoom) |
|
12 | DateTimeRange computeZoom(QDateTime start, QDateTime stop, double zoom) | |
13 | { |
|
13 | { | |
14 | double start_epoch = start.toMSecsSinceEpoch(); |
|
14 | double start_epoch = start.toMSecsSinceEpoch(); | |
15 | double stop_epoch = stop.toMSecsSinceEpoch(); |
|
15 | double stop_epoch = stop.toMSecsSinceEpoch(); | |
16 | auto delta = stop_epoch - start_epoch; |
|
16 | auto delta = stop_epoch - start_epoch; | |
17 | auto dt_ms = (zoom-1.)*(double(delta))/2.; |
|
17 | auto dt_ms = (zoom-1.)*(double(delta))/2.; | |
18 | return DateTimeRange{(start_epoch - dt_ms)/1000., (stop_epoch + dt_ms)/1000.}; |
|
18 | return DateTimeRange{(start_epoch - dt_ms)/1000., (stop_epoch + dt_ms)/1000.}; | |
19 | } |
|
19 | } | |
20 |
|
20 | |||
21 | class TestDateTimeRange: public QObject { |
|
21 | class TestDateTimeRange: public QObject { | |
22 | Q_OBJECT |
|
22 | Q_OBJECT | |
23 |
|
23 | |||
24 | private slots: |
|
24 | private slots: | |
25 | void testRangeDelta_data() |
|
25 | void testRangeDelta_data() | |
26 | { |
|
26 | { | |
27 | QTest::addColumn<QDateTime>("tstart"); |
|
27 | QTest::addColumn<QDateTime>("tstart"); | |
28 | QTest::addColumn<QDateTime>("tend"); |
|
28 | QTest::addColumn<QDateTime>("tend"); | |
29 | QTest::addColumn<double>("expected"); |
|
29 | QTest::addColumn<double>("expected"); | |
30 | auto now = QDateTime::currentDateTime(); |
|
30 | auto now = QDateTime::currentDateTime(); | |
31 | auto yesterday = QDateTime::currentDateTime().addDays(-1); |
|
31 | auto yesterday = QDateTime::currentDateTime().addDays(-1); | |
32 | QTest::newRow("No delta") << now << now << 0.; |
|
32 | QTest::newRow("No delta") << now << now << 0.; | |
33 | QTest::newRow("One day delta") << yesterday << now << 60.*60.*24.; |
|
33 | QTest::newRow("One day delta") << yesterday << now << 60.*60.*24.; | |
34 | QTest::newRow("Minus one day delta") << now << yesterday << -60.*60.*24.; |
|
34 | QTest::newRow("Minus one day delta") << now << yesterday << -60.*60.*24.; | |
35 | } |
|
35 | } | |
36 |
|
36 | |||
37 | void testRangeDelta() |
|
37 | void testRangeDelta() | |
38 | { |
|
38 | { | |
39 | QFETCH(QDateTime,tstart); |
|
39 | QFETCH(QDateTime,tstart); | |
40 | QFETCH(QDateTime,tend); |
|
40 | QFETCH(QDateTime,tend); | |
41 | QFETCH(double,expected); |
|
41 | QFETCH(double,expected); | |
42 | auto range = DateTimeRange::fromDateTime(tstart, tend); |
|
42 | auto range = DateTimeRange::fromDateTime(tstart, tend); | |
43 | double delta = range.delta(); |
|
43 | double delta = range.delta(); | |
44 | // Since it is built from QDateTime don't expect better resolution |
|
44 | // Since it is built from QDateTime don't expect better resolution | |
45 | QVERIFY((delta-expected) <= 0.002); |
|
45 | QVERIFY((delta-expected) <= 0.002); | |
46 | } |
|
46 | } | |
47 |
|
47 | |||
48 | void testRangeShift_data() |
|
48 | void testRangeShift_data() | |
49 | { |
|
49 | { | |
50 | QTest::addColumn<DateTimeRange>("initial"); |
|
50 | QTest::addColumn<DateTimeRange>("initial"); | |
51 | QTest::addColumn<Seconds<double>>("shift"); |
|
51 | QTest::addColumn<Seconds<double>>("shift"); | |
52 | QTest::addColumn<DateTimeRange>("expected"); |
|
52 | QTest::addColumn<DateTimeRange>("expected"); | |
53 | auto now = QDateTime::currentDateTime(); |
|
53 | auto now = QDateTime::currentDateTime(); | |
54 | auto yestd = QDateTime::currentDateTime().addDays(-1); |
|
54 | auto yestd = QDateTime::currentDateTime().addDays(-1); | |
55 | auto range = DateTimeRange::fromDateTime(yestd, now); |
|
55 | auto range = DateTimeRange::fromDateTime(yestd, now); | |
56 | QTest::newRow("No shift") << range << Seconds<double>{0.} << range; |
|
56 | QTest::newRow("No shift") << range << Seconds<double>{0.} << range; | |
57 |
|
57 | |||
58 | QTest::newRow("One milisecond left") << range << Seconds<double>{-.001} << |
|
58 | QTest::newRow("One milisecond left") << range << Seconds<double>{-.001} << | |
59 | DateTimeRange::fromDateTime(yestd.addMSecs(-1.), now.addMSecs(-1.)); |
|
59 | DateTimeRange::fromDateTime(yestd.addMSecs(-1.), now.addMSecs(-1.)); | |
60 | QTest::newRow("One milisecond right") << range << Seconds<double>{.001} << |
|
60 | QTest::newRow("One milisecond right") << range << Seconds<double>{.001} << | |
61 | DateTimeRange::fromDateTime(yestd.addMSecs(1.), now.addMSecs(1.)); |
|
61 | DateTimeRange::fromDateTime(yestd.addMSecs(1.), now.addMSecs(1.)); | |
62 | QTest::newRow("One second left") << range << Seconds<double>{-1.} << |
|
62 | QTest::newRow("One second left") << range << Seconds<double>{-1.} << | |
63 | DateTimeRange::fromDateTime(yestd.addSecs(-1.), now.addSecs(-1.)); |
|
63 | DateTimeRange::fromDateTime(yestd.addSecs(-1.), now.addSecs(-1.)); | |
64 | QTest::newRow("One second right") << range << Seconds<double>{1.} << |
|
64 | QTest::newRow("One second right") << range << Seconds<double>{1.} << | |
65 | DateTimeRange::fromDateTime(yestd.addSecs(1.), now.addSecs(1.)); |
|
65 | DateTimeRange::fromDateTime(yestd.addSecs(1.), now.addSecs(1.)); | |
66 | QTest::newRow("One year left") << range << Seconds<double>{-365.*24.*60.*60.} << |
|
66 | QTest::newRow("One year left") << range << Seconds<double>{-365.*24.*60.*60.} << | |
67 | DateTimeRange::fromDateTime(yestd.addYears(-1.), now.addYears(-1.)); |
|
67 | DateTimeRange::fromDateTime(yestd.addYears(-1.), now.addYears(-1.)); | |
68 | QTest::newRow("One year right") << range << Seconds<double>{365.*24.*60.*60.} << |
|
68 | QTest::newRow("One year right") << range << Seconds<double>{365.*24.*60.*60.} << | |
69 | DateTimeRange::fromDateTime(yestd.addYears(1.), now.addYears(1.)); |
|
69 | DateTimeRange::fromDateTime(yestd.addYears(1.), now.addYears(1.)); | |
70 | } |
|
70 | } | |
71 | void testRangeShift() |
|
71 | void testRangeShift() | |
72 | { |
|
72 | { | |
73 | QFETCH(DateTimeRange,initial); |
|
73 | QFETCH(DateTimeRange,initial); | |
74 | QFETCH(Seconds<double>,shift); |
|
74 | QFETCH(Seconds<double>,shift); | |
75 | QFETCH(DateTimeRange,expected); |
|
75 | QFETCH(DateTimeRange,expected); | |
76 | QCOMPARE(initial+shift, expected); |
|
76 | QCOMPARE(initial+shift, expected); | |
77 | } |
|
77 | } | |
78 |
|
78 | |||
79 | void testRangeZoom_data() |
|
79 | void testRangeZoom_data() | |
80 | { |
|
80 | { | |
81 | QTest::addColumn<DateTimeRange>("initial"); |
|
81 | QTest::addColumn<DateTimeRange>("initial"); | |
82 | QTest::addColumn<double>("zoom"); |
|
82 | QTest::addColumn<double>("zoom"); | |
83 | QTest::addColumn<DateTimeRange>("expected"); |
|
83 | QTest::addColumn<DateTimeRange>("expected"); | |
84 | auto now = QDateTime::currentDateTime(); |
|
84 | auto now = QDateTime::currentDateTime(); | |
85 | auto yestd = QDateTime::currentDateTime().addDays(-1); |
|
85 | auto yestd = QDateTime::currentDateTime().addDays(-1); | |
86 | auto range = DateTimeRange::fromDateTime(yestd, now); |
|
86 | auto range = DateTimeRange::fromDateTime(yestd, now); | |
87 | QTest::newRow("No zoom") << range << 1. << range; |
|
87 | QTest::newRow("No zoom") << range << 1. << range; | |
88 |
|
88 | |||
89 | QTest::newRow("Zoom IN 0.001") << range << 1.001 << |
|
89 | QTest::newRow("Zoom IN 0.001") << range << 1.001 << | |
90 | computeZoom(yestd, now, 1.001); |
|
90 | computeZoom(yestd, now, 1.001); | |
91 | QTest::newRow("Zoom OUT 0.001") << range << 0.999 << |
|
91 | QTest::newRow("Zoom OUT 0.001") << range << 0.999 << | |
92 | computeZoom(yestd, now, 0.999); |
|
92 | computeZoom(yestd, now, 0.999); | |
93 | } |
|
93 | } | |
94 | void testRangeZoom() |
|
94 | void testRangeZoom() | |
95 | { |
|
95 | { | |
96 | QFETCH(DateTimeRange,initial); |
|
96 | QFETCH(DateTimeRange,initial); | |
97 | QFETCH(double,zoom); |
|
97 | QFETCH(double,zoom); | |
98 | QFETCH(DateTimeRange,expected); |
|
98 | QFETCH(DateTimeRange,expected); | |
99 | QCOMPARE(initial*zoom, expected); |
|
99 | QCOMPARE(initial*zoom, expected); | |
100 | } |
|
100 | } | |
101 |
|
101 | |||
|
102 | void testRangeContains_data() | |||
|
103 | { | |||
|
104 | QTest::addColumn<DateTimeRange>("range"); | |||
|
105 | QTest::addColumn<DateTimeRange>("range2"); | |||
|
106 | QTest::addColumn<bool>("contains"); | |||
|
107 | auto now = QDateTime::currentDateTime(); | |||
|
108 | auto yestd = QDateTime::currentDateTime().addDays(-1); | |||
|
109 | auto range = DateTimeRange::fromDateTime(yestd, now); | |||
|
110 | QTest::newRow("Same range") << range << range << true; | |||
|
111 | QTest::newRow("Smaller range") << range << range * 0.8 << true; | |||
|
112 | QTest::newRow("Bigger range") << range << range * 1.2 << false; | |||
|
113 | QTest::newRow("Shifted range with overlap") << range << range + Seconds<double>{1000.} << false; | |||
|
114 | QTest::newRow("Shifted range without overlap") << range << range + Seconds<double>{24.*60.*60.*10} << false; | |||
|
115 | ||||
|
116 | } | |||
|
117 | void testRangeContains() | |||
|
118 | { | |||
|
119 | QFETCH(DateTimeRange,range); | |||
|
120 | QFETCH(DateTimeRange,range2); | |||
|
121 | QFETCH(bool,contains); | |||
|
122 | QCOMPARE(range.contains(range2), contains); | |||
|
123 | } | |||
|
124 | ||||
|
125 | void testRangeIntersect_data() | |||
|
126 | { | |||
|
127 | QTest::addColumn<DateTimeRange>("range"); | |||
|
128 | QTest::addColumn<DateTimeRange>("range2"); | |||
|
129 | QTest::addColumn<bool>("contains"); | |||
|
130 | auto now = QDateTime::currentDateTime(); | |||
|
131 | auto yestd = QDateTime::currentDateTime().addDays(-1); | |||
|
132 | auto tomorrow = QDateTime::currentDateTime().addDays(1); | |||
|
133 | auto range = DateTimeRange::fromDateTime(yestd, now); | |||
|
134 | auto range2 = DateTimeRange::fromDateTime(now, tomorrow); | |||
|
135 | QTest::newRow("Same range") << range << range << true; | |||
|
136 | QTest::newRow("Smaller range") << range << range * 0.8 << true; | |||
|
137 | QTest::newRow("Bigger range") << range << range * 1.2 << true; | |||
|
138 | QTest::newRow("Shifted range with overlap") << range << range + Seconds<double>{1000.} << true; | |||
|
139 | QTest::newRow("Shifted range with overlaping boundary") << range << range2 << true; | |||
|
140 | QTest::newRow("Shifted range without overlap") << range << range + Seconds<double>{24.*60.*60.*10} << false; | |||
|
141 | ||||
|
142 | } | |||
|
143 | void testRangeIntersect() | |||
|
144 | { | |||
|
145 | QFETCH(DateTimeRange,range); | |||
|
146 | QFETCH(DateTimeRange,range2); | |||
|
147 | QFETCH(bool,contains); | |||
|
148 | QCOMPARE(range.intersect(range2), contains); | |||
|
149 | } | |||
102 | }; |
|
150 | }; | |
103 | QTEST_MAIN(TestDateTimeRange) |
|
151 | QTEST_MAIN(TestDateTimeRange) | |
104 |
|
152 | |||
105 |
|
153 | |||
106 | #include "TestDateTimeRange.moc" |
|
154 | #include "TestDateTimeRange.moc" |
General Comments 0
You need to be logged in to leave comments.
Login now