Line data Source code
1 : /*
2 : * Present - Date/Time Library
3 : *
4 : * Tests for the DayDelta C++ class and C-compatible methods
5 : *
6 : * Licensed under the MIT License.
7 : * For details, see LICENSE.
8 : */
9 :
10 : #include "catch.hpp"
11 : #include "test-utils.hpp"
12 :
13 : #include "present.h"
14 :
15 : /**
16 : * Shortcut macro to compare the number of days.
17 : * Expects that the delta is called "d".
18 : */
19 : #define IS(test_delta_days) \
20 : CHECK(d.data_.delta_days == test_delta_days);
21 :
22 :
23 : /**
24 : * This test case tests all of the "from_" methods (which also tests the C
25 : * "DayDelta_from_..." methods).
26 : */
27 4 : TEST_CASE("DayDelta creators", "[day-delta]") {
28 : DayDelta d;
29 :
30 3 : SECTION("creating from a number of days") {
31 1 : d = DayDelta::from_days(1);
32 1 : IS(1);
33 1 : d = DayDelta::from_days(-1);
34 1 : IS(-1);
35 1 : d = DayDelta::from_days(0);
36 1 : IS(0);
37 1 : d = DayDelta::from_days(2147483647);
38 1 : IS(2147483647);
39 1 : d = DayDelta::from_days(-2147483647);
40 1 : IS(-2147483647);
41 :
42 1 : d = DayDelta_from_days(13);
43 1 : IS(13);
44 :
45 1 : DayDelta_ptr_from_days(&d, -11);
46 1 : IS(-11);
47 3 : }
48 :
49 3 : SECTION("creating from a number of weeks") {
50 1 : d = DayDelta::from_weeks(1);
51 1 : IS(7);
52 1 : d = DayDelta::from_weeks(5);
53 1 : IS(35);
54 1 : d = DayDelta::from_weeks(-1);
55 1 : IS(-7);
56 1 : d = DayDelta::from_weeks(-11);
57 1 : IS(-77);
58 1 : d = DayDelta::from_weeks(0);
59 1 : IS(0);
60 1 : d = DayDelta::from_weeks(306783378);
61 1 : IS(2147483646);
62 1 : d = DayDelta::from_weeks(-306783378);
63 1 : IS(-2147483646);
64 :
65 1 : d = DayDelta_from_weeks(7);
66 1 : IS(49);
67 :
68 1 : DayDelta_ptr_from_weeks(&d, -9);
69 1 : IS(-63);
70 3 : }
71 :
72 3 : SECTION("creating with 0 days") {
73 1 : d = DayDelta::zero();
74 1 : IS(0);
75 :
76 1 : d = DayDelta_zero();
77 1 : IS(0);
78 :
79 1 : DayDelta_ptr_zero(&d);
80 1 : IS(0);
81 3 : }
82 3 : }
83 :
84 2 : TEST_CASE("DayDelta accessors", "[day-delta]") {
85 1 : DayDelta d1 = DayDelta::from_days(5),
86 1 : d2 = DayDelta::from_days(7),
87 1 : d3 = DayDelta::from_days(-14),
88 1 : d4 = DayDelta::from_days(-20),
89 1 : d5 = DayDelta::zero();
90 :
91 1 : CHECK(d1.days() == 5);
92 1 : CHECK(d2.days() == 7);
93 1 : CHECK(d3.days() == -14);
94 1 : CHECK(d4.days() == -20);
95 1 : CHECK(d5.days() == 0);
96 :
97 1 : CHECK(d1.weeks() == 0);
98 1 : CHECK(d2.weeks() == 1);
99 1 : CHECK(d3.weeks() == -2);
100 1 : CHECK(d4.weeks() == -2);
101 1 : CHECK(d5.weeks() == 0);
102 :
103 1 : CHECK(d1.weeks_decimal() == 0.7142857142857143);
104 1 : CHECK(d2.weeks_decimal() == 1.0);
105 1 : CHECK(d3.weeks_decimal() == -2.0);
106 1 : CHECK(d4.weeks_decimal() == -2.857142857142857);
107 1 : CHECK(d5.weeks_decimal() == 0.0);
108 :
109 1 : CHECK(d1.to_TimeDelta() == TimeDelta::from_days(5));
110 1 : CHECK(d2.to_TimeDelta() == TimeDelta::from_days(7));
111 1 : CHECK(d3.to_TimeDelta() == TimeDelta::from_days(-14));
112 1 : CHECK(d4.to_TimeDelta() == TimeDelta::from_days(-20));
113 1 : CHECK(d5.to_TimeDelta() == TimeDelta::from_days(0));
114 1 : }
115 :
116 7 : TEST_CASE("DayDelta arithmetic operators", "[day-delta]") {
117 6 : DayDelta d1 = DayDelta::from_days(8),
118 6 : d2 = DayDelta::from_days(-21),
119 6 : d3 = DayDelta::zero();
120 :
121 6 : SECTION("is_negative()") {
122 1 : CHECK(!d1.is_negative());
123 1 : CHECK(d2.is_negative());
124 1 : CHECK(!d3.is_negative());
125 6 : }
126 :
127 6 : SECTION("negate()") {
128 1 : d1.negate();
129 1 : CHECK(d1.days() == -8);
130 1 : CHECK(d1.weeks() == -1);
131 1 : d1.negate();
132 1 : CHECK(d1.days() == 8);
133 1 : CHECK(d1.weeks() == 1);
134 :
135 1 : d2.negate();
136 1 : CHECK(d2.days() == 21);
137 1 : CHECK(d2.weeks() == 3);
138 1 : d2.negate();
139 1 : CHECK(d2.days() == -21);
140 1 : CHECK(d2.weeks() == -3);
141 :
142 1 : d3.negate();
143 1 : CHECK(!d3.is_negative());
144 1 : d3.negate();
145 1 : CHECK(!d3.is_negative());
146 6 : }
147 :
148 6 : SECTION("operator-") {
149 : DayDelta d;
150 :
151 1 : d = -d1;
152 1 : IS(-8);
153 1 : d = -d2;
154 1 : IS(21);
155 1 : d = -d3;
156 1 : IS(0);
157 6 : }
158 :
159 6 : SECTION("operator++ / operator--") {
160 : DayDelta d;
161 :
162 1 : d = DayDelta::from_days(5);
163 1 : IS(5);
164 1 : CHECK((d++).days() == 5);
165 1 : IS(6);
166 1 : CHECK((++d).days() == 7);
167 1 : IS(7);
168 1 : CHECK((d--).days() == 7);
169 1 : IS(6);
170 1 : CHECK((--d).days() == 5);
171 1 : IS(5);
172 6 : }
173 :
174 6 : SECTION("scaling") {
175 : DayDelta d;
176 :
177 1 : d = DayDelta::from_days(5);
178 1 : IS(5);
179 1 : d *= 6;
180 1 : IS(30);
181 1 : d /= 10;
182 1 : IS(3);
183 :
184 1 : d = DayDelta::from_days(-10);
185 1 : IS(-10);
186 1 : d *= 6;
187 1 : IS(-60);
188 1 : d /= 25;
189 1 : IS(-2);
190 :
191 1 : d = DayDelta::from_days(9);
192 1 : IS(9);
193 1 : CHECK((d * 3).days() == 27);
194 1 : IS(9);
195 1 : CHECK((d * -5).days() == -45);
196 1 : IS(9);
197 1 : CHECK((d / 4).days() == 2);
198 1 : IS(9);
199 1 : CHECK((d / -3).days() == -3);
200 1 : IS(9);
201 :
202 1 : d = DayDelta::from_days(-43);
203 1 : IS(-43);
204 1 : CHECK((d * 2).days() == -86);
205 1 : IS(-43);
206 1 : CHECK((d * -4).days() == 172);
207 1 : IS(-43);
208 1 : CHECK((d / 6).days() == -7);
209 1 : IS(-43);
210 1 : CHECK((d / -7).days() == 6);
211 1 : IS(-43);
212 6 : }
213 :
214 6 : SECTION("addition / subtraction") {
215 : DayDelta d;
216 :
217 1 : d = DayDelta::from_days(5);
218 1 : IS(5);
219 1 : d += DayDelta::from_days(8);
220 1 : IS(13);
221 1 : d += DayDelta::from_days(-4);
222 1 : IS(9);
223 1 : d -= DayDelta::from_days(12);
224 1 : IS(-3);
225 1 : d -= DayDelta::from_days(-5);
226 1 : IS(2);
227 :
228 1 : d = DayDelta::from_days(-13);
229 1 : IS(-13);
230 1 : CHECK((d + DayDelta::from_days(4)).days() == -9);
231 1 : IS(-13);
232 1 : CHECK((d + DayDelta::from_days(-7)).days() == -20);
233 1 : IS(-13);
234 1 : CHECK((d - DayDelta::from_days(8)).days() == -21);
235 1 : IS(-13);
236 1 : CHECK((d - DayDelta::from_days(-34)).days() == 21);
237 1 : IS(-13);
238 6 : }
239 6 : }
240 :
241 2 : TEST_CASE("DayDelta comparison operators", "[day-delta]") {
242 1 : DayDelta d1 = DayDelta::from_days(19),
243 1 : d2 = DayDelta::from_days(21),
244 1 : d3 = DayDelta::from_days(-13),
245 1 : d4 = DayDelta::from_days(-13),
246 1 : d5 = DayDelta::zero();
247 :
248 1 : TimeDelta td1 = TimeDelta::from_days(19),
249 1 : td2 = TimeDelta::from_days(21),
250 1 : td3 = TimeDelta::from_days(-13),
251 1 : td4 = TimeDelta::from_days(-13),
252 1 : td5 = TimeDelta::zero();
253 :
254 1 : CHECK(DayDelta::compare(d1, d2) < 0);
255 1 : CHECK(DayDelta::compare(d1, d3) > 0);
256 1 : CHECK(DayDelta::compare(d1, d5) > 0);
257 1 : CHECK(DayDelta::compare(d3, d4) == 0);
258 1 : CHECK(DayDelta::compare(d4, d3) == 0);
259 1 : CHECK(DayDelta::compare(d5, d5) == 0);
260 :
261 1 : CHECK(DayDelta::compare(d1, td2) < 0);
262 1 : CHECK(DayDelta::compare(d1, td3) > 0);
263 1 : CHECK(DayDelta::compare(d1, td5) > 0);
264 1 : CHECK(DayDelta::compare(d3, td4) == 0);
265 1 : CHECK(DayDelta::compare(d4, td3) == 0);
266 1 : CHECK(DayDelta::compare(d5, td5) == 0);
267 :
268 1 : CHECK(DayDelta::compare(td1, d2) < 0);
269 1 : CHECK(DayDelta::compare(td1, d3) > 0);
270 1 : CHECK(DayDelta::compare(td1, d5) > 0);
271 1 : CHECK(DayDelta::compare(td3, d4) == 0);
272 1 : CHECK(DayDelta::compare(td4, d3) == 0);
273 1 : CHECK(DayDelta::compare(td5, d5) == 0);
274 :
275 1 : CHECK(d3 == d4); CHECK(d3 == td4);
276 1 : CHECK(d4 == d3); CHECK(d4 == td3);
277 1 : CHECK(!(d1 == d2)); CHECK(!(d1 == td2));
278 1 : CHECK(!(d1 == d5)); CHECK(!(d1 == td5));
279 1 : CHECK(d1 != d2); CHECK(d1 != td2);
280 1 : CHECK(d5 != d1); CHECK(d5 != td1);
281 :
282 1 : CHECK(d1 < d2); CHECK(d1 < td2);
283 1 : CHECK(d3 < d1); CHECK(d3 < td1);
284 1 : CHECK(!(d5 < d4)); CHECK(!(d5 < td4));
285 1 : CHECK(!(d3 < d4)); CHECK(!(d3 < td4));
286 :
287 1 : CHECK(d1 <= d2); CHECK(d1 <= td2);
288 1 : CHECK(d3 <= d2); CHECK(d3 <= td2);
289 1 : CHECK(!(d5 <= d4)); CHECK(!(d5 <= td4));
290 1 : CHECK(d3 <= d4); CHECK(d3 <= td4);
291 :
292 1 : CHECK(d1 > d3); CHECK(d1 > td3);
293 1 : CHECK(d2 > d1); CHECK(d2 > td1);
294 1 : CHECK(d5 > d3); CHECK(d5 > td3);
295 1 : CHECK(!(d3 > d4)); CHECK(!(d3 > td4));
296 1 : CHECK(!(d3 > d2)); CHECK(!(d3 > td2));
297 1 : CHECK(!(d1 > d2)); CHECK(!(d1 > td2));
298 :
299 1 : CHECK(d1 >= d3); CHECK(d1 >= td3);
300 1 : CHECK(d2 >= d1); CHECK(d2 >= td1);
301 1 : CHECK(d5 >= d3); CHECK(d5 >= td3);
302 1 : CHECK(d3 >= d4); CHECK(d3 >= td4);
303 1 : CHECK(!(d5 >= d2)); CHECK(!(d5 >= td2));
304 4 : }
305 :
|