Serenity Operating System
1/*
2 * Copyright (c) 2021, Ben Wiederhake <BenWiederhake.GitHub@gmx.de>
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <LibTest/TestCase.h>
8
9#include <AK/Time.h>
10#include <sys/time.h>
11
12#define EXPECT_TIME(t, s, ns) \
13 do { \
14 auto ts = (t).to_timespec(); \
15 EXPECT_EQ(ts.tv_sec, (s)); \
16 EXPECT_EQ(ts.tv_nsec, (ns)); \
17 } while (0)
18
19TEST_CASE(is_sane)
20{
21 auto t0 = Time::from_seconds(0);
22 auto t2 = Time::from_seconds(2);
23 auto t5 = Time::from_seconds(5);
24 auto tn3 = Time::from_seconds(-3);
25 EXPECT(t0 == t0);
26 EXPECT(t2 == t2);
27 EXPECT(t5 == t5);
28 EXPECT(t0 != t2);
29 EXPECT(t2 != tn3);
30 EXPECT(t2 != t5);
31 EXPECT_TIME(t0, 0, 0);
32 EXPECT_TIME(t2, 2, 0);
33 EXPECT_TIME(t5, 5, 0);
34 EXPECT_TIME(t2 + t5, 7, 0);
35 EXPECT_TIME(tn3 + t2, -1, 0);
36 EXPECT_TIME(tn3 + t5, 2, 0);
37}
38
39TEST_CASE(limits)
40{
41 EXPECT_TIME(Time::min(), (i64)-0x8000'0000'0000'0000, 0);
42 EXPECT_TIME(Time::max(), 0x7fff'ffff'ffff'ffff, 999'999'999);
43}
44
45TEST_CASE(seconds_parsing)
46{
47 EXPECT_TIME(Time::from_seconds(0), 0, 0);
48 EXPECT_TIME(Time::from_seconds(42), 42, 0);
49 EXPECT_TIME(Time::from_seconds(-1), -1, 0);
50
51 // "6.4.4.1.5: The type of an integer constant is the first of the corresponding list in which its value can be represented."
52 // In the case of "0x8000'0000", the list is "int, unsigned int, …", and unsigned int (u32) matches.
53 // Then the unary minus: On unsigned 32-bit integers, -0x8000'0000 == 0x8000'0000, which only then is made signed again.
54 // So we would pass a medium-large *positive* number to 'from_seconds', which is not what we want to test here.
55 // That's why this is the only place that needs an "LL" suffix.
56 EXPECT_TIME(Time::from_seconds(-0x8000'0000LL), -0x8000'0000LL, 0);
57 EXPECT_TIME(Time::from_seconds(-0x8000'0000'0000'0000), (i64)-0x8000'0000'0000'0000, 0);
58 EXPECT_TIME(Time::from_seconds(0x7fff'ffff'ffff'ffff), 0x7fff'ffff'ffff'ffff, 0);
59}
60
61TEST_CASE(timespec_parsing)
62{
63 EXPECT_TIME(Time::from_timespec(timespec { 2, 4 }), 2, 4);
64 EXPECT_TIME(Time::from_timespec(timespec { 1234, 5678 }), 1234, 5678);
65
66 EXPECT_TIME(Time::from_timespec(timespec { 0, 1'000'000'000 }), 1, 0);
67 EXPECT_TIME(Time::from_timespec(timespec { 8, 2'000'000'000 }), 10, 0);
68 EXPECT_TIME(Time::from_timespec(timespec { 0, 2'147'483'647 }), 2, 147'483'647);
69
70 EXPECT_TIME(Time::from_timespec(timespec { 1, -1 }), 0, 999'999'999);
71 EXPECT_TIME(Time::from_timespec(timespec { 0, -1 }), -1, 999'999'999);
72 EXPECT_TIME(Time::from_timespec(timespec { -1, 0 }), -1, 0);
73 EXPECT_TIME(Time::from_timespec(timespec { -1, 1'000'000'001 }), 0, 1);
74 EXPECT_TIME(Time::from_timespec(timespec { -2, 2'000'000'003 }), 0, 3);
75 EXPECT_TIME(Time::from_timespec(timespec { -2, 1'999'999'999 }), -1, 999'999'999);
76
77 EXPECT_TIME(Time::from_timespec(timespec { 0x7fff'ffff'ffff'fffe, 999'999'998 }), 0x7fff'ffff'ffff'fffe, 999'999'998);
78 EXPECT_TIME(Time::from_timespec(timespec { 0x7fff'ffff'ffff'fffe, 1'999'999'998 }), 0x7fff'ffff'ffff'ffff, 999'999'998);
79 EXPECT_TIME(Time::from_timespec(timespec { 0x7fff'ffff'ffff'fffe, 1'999'999'999 }), 0x7fff'ffff'ffff'ffff, 999'999'999);
80 EXPECT_TIME(Time::from_timespec(timespec { 0x7fff'ffff'ffff'fffe, 2'000'000'000 }), 0x7fff'ffff'ffff'ffff, 999'999'999);
81
82 EXPECT_TIME(Time::from_timespec(timespec { -0x7fff'ffff'ffff'fffe, -1 }), -0x7fff'ffff'ffff'ffff, 999'999'999);
83 EXPECT_TIME(Time::from_timespec(timespec { -0x7fff'ffff'ffff'fffe, -999'999'999 }), -0x7fff'ffff'ffff'ffff, 1);
84 EXPECT_TIME(Time::from_timespec(timespec { -0x7fff'ffff'ffff'fffe, -1'999'999'999 }), (i64)-0x8000'0000'0000'0000, 1);
85 EXPECT_TIME(Time::from_timespec(timespec { -0x7fff'ffff'ffff'fffe, -2'000'000'000 }), (i64)-0x8000'0000'0000'0000, 0);
86 EXPECT_TIME(Time::from_timespec(timespec { -0x7fff'ffff'ffff'fffe, -2'000'000'001 }), (i64)-0x8000'0000'0000'0000, 0);
87}
88
89TEST_CASE(timeval_parsing)
90{
91 EXPECT_TIME(Time::from_timeval(timeval { 2, 4 }), 2, 4'000);
92 EXPECT_TIME(Time::from_timeval(timeval { 1234, 5'678 }), 1234, 5'678'000);
93 EXPECT_TIME(Time::from_timeval(timeval { -123, -45'678 }), -124, 954'322'000);
94
95 EXPECT_TIME(Time::from_timeval(timeval { 0, 1'000'000 }), 1, 0);
96 EXPECT_TIME(Time::from_timeval(timeval { 0, 1'000'000'000 }), 1'000, 0);
97 EXPECT_TIME(Time::from_timeval(timeval { 8, 2'000'000 }), 10, 0);
98 EXPECT_TIME(Time::from_timeval(timeval { 0, 2'147'483'647 }), 2'147, 483'647'000);
99
100 EXPECT_TIME(Time::from_timeval(timeval { 1, -1 }), 0, 999'999'000);
101 EXPECT_TIME(Time::from_timeval(timeval { 0, -1 }), -1, 999'999'000);
102 EXPECT_TIME(Time::from_timeval(timeval { -1, 0 }), -1, 0);
103 EXPECT_TIME(Time::from_timeval(timeval { -1, 1'000'001 }), 0, 1'000);
104 EXPECT_TIME(Time::from_timeval(timeval { -2, 2'000'003 }), 0, 3'000);
105 EXPECT_TIME(Time::from_timeval(timeval { -2, 1'999'999 }), -1, 999'999'000);
106
107 EXPECT_TIME(Time::from_timeval(timeval { 0x7fff'ffff'ffff'fffe, 999'998 }), 0x7fff'ffff'ffff'fffe, 999'998'000);
108 EXPECT_TIME(Time::from_timeval(timeval { 0x7fff'ffff'ffff'fffe, 1'999'998 }), 0x7fff'ffff'ffff'ffff, 999'998'000);
109 EXPECT_TIME(Time::from_timeval(timeval { 0x7fff'ffff'ffff'fffe, 1'999'999 }), 0x7fff'ffff'ffff'ffff, 999'999'000);
110 EXPECT_TIME(Time::from_timeval(timeval { 0x7fff'ffff'ffff'fffe, 2'000'000 }), 0x7fff'ffff'ffff'ffff, 999'999'999);
111
112 EXPECT_TIME(Time::from_timeval(timeval { -0x7fff'ffff'ffff'fffe, -1 }), -0x7fff'ffff'ffff'ffff, 999'999'000);
113 EXPECT_TIME(Time::from_timeval(timeval { -0x7fff'ffff'ffff'fffe, -999'999 }), -0x7fff'ffff'ffff'ffff, 1'000);
114 EXPECT_TIME(Time::from_timeval(timeval { -0x7fff'ffff'ffff'fffe, -1'999'999 }), (i64)-0x8000'0000'0000'0000, 1'000);
115 EXPECT_TIME(Time::from_timeval(timeval { -0x7fff'ffff'ffff'fffe, -2'000'000 }), (i64)-0x8000'0000'0000'0000, 0);
116 EXPECT_TIME(Time::from_timeval(timeval { -0x7fff'ffff'ffff'fffe, -2'000'001 }), (i64)-0x8000'0000'0000'0000, 0);
117}
118
119#define TIME(s, ns) \
120 Time::from_timespec(timespec { (s), (ns) })
121
122TEST_CASE(addition)
123{
124#define EXPECT_ADDITION(s1, ns1, s2, ns2, sr, nsr) \
125 do { \
126 EXPECT_TIME(TIME(s1, ns1) + TIME(s2, ns2), sr, nsr); \
127 EXPECT_TIME(TIME(s2, ns2) + TIME(s1, ns1), sr, nsr); \
128 auto t = TIME(s1, ns1); \
129 t += TIME(s2, ns2); \
130 EXPECT_TIME(t, sr, nsr); \
131 } while (0)
132
133 EXPECT_ADDITION(11, 123'456'789, 22, 900'000'000, 34, 23'456'789);
134
135 EXPECT_ADDITION(0, 0, 9223372036854775807LL, 999'999'998, 0x7fff'ffff'ffff'ffff, 999'999'998);
136 EXPECT_ADDITION(0, 1, 9223372036854775807LL, 999'999'998, 0x7fff'ffff'ffff'ffff, 999'999'999);
137 EXPECT_ADDITION(0, 2, 9223372036854775807LL, 999'999'998, 0x7fff'ffff'ffff'ffff, 999'999'999);
138
139 EXPECT_ADDITION(0x80, 40, 0x7fff'ffff'ffff'ff7f, 999'999'958, 0x7fff'ffff'ffff'ffff, 999'999'998);
140 EXPECT_ADDITION(0x80, 41, 0x7fff'ffff'ffff'ff7f, 999'999'958, 0x7fff'ffff'ffff'ffff, 999'999'999);
141 EXPECT_ADDITION(0x80, 42, 0x7fff'ffff'ffff'ff7f, 999'999'958, 0x7fff'ffff'ffff'ffff, 999'999'999);
142
143 EXPECT_ADDITION(-2, 5, -3, 7, -5, 12);
144 EXPECT_ADDITION(-2, 999'999'995, -3, 999'999'997, -4, 999'999'992);
145
146 EXPECT_ADDITION(-0x7fff'ffff'ffff'ffff, 999'999'995, -1, 6, -0x7fff'ffff'ffff'ffff, 1);
147 EXPECT_ADDITION(-0x7fff'ffff'ffff'ffff, 999'999'995, -2, 6, (i64)-0x8000'0000'0000'0000, 1);
148 EXPECT_ADDITION(-0x7fff'ffff'ffff'ffff, 999'999'995, -2, 5, (i64)-0x8000'0000'0000'0000, 0);
149 EXPECT_ADDITION(-0x7fff'ffff'ffff'ffff, 999'999'995, -2, 4, (i64)-0x8000'0000'0000'0000, 0);
150
151 EXPECT_ADDITION((i64)-0x8000'0000'0000'0000, 999'999'995, 0x7fff'ffff'ffff'ffff, 4, -1, 999'999'999);
152 EXPECT_ADDITION((i64)-0x8000'0000'0000'0000, 999'999'995, 0x7fff'ffff'ffff'ffff, 5, 0, 0);
153 EXPECT_ADDITION((i64)-0x8000'0000'0000'0000, 999'999'995, 0x7fff'ffff'ffff'ffff, 6, 0, 1);
154#undef EXPECT_ADDITION
155}
156
157TEST_CASE(subtraction)
158{
159#define EXPECT_SUBTRACTION(s1, ns1, s2, ns2, sr, nsr) \
160 do { \
161 EXPECT_TIME(TIME(s1, ns1) - TIME(s2, ns2), sr, nsr); \
162 auto t = TIME(s1, ns1); \
163 t -= TIME(s2, ns2); \
164 EXPECT_TIME(t, sr, nsr); \
165 } while (0)
166
167 EXPECT_SUBTRACTION(5, 0, 3, 0, 2, 0);
168 EXPECT_SUBTRACTION(0, 0, 0, 0, 0, 0);
169 EXPECT_SUBTRACTION(0, 5, 0, 3, 0, 2);
170 EXPECT_SUBTRACTION(0x7fff'ffff'ffff'ffff, 999'999'999, 8, 123, 0x7fff'ffff'ffff'fff7, 999'999'876);
171
172 EXPECT_SUBTRACTION(1, 0, 0, 999'999'999, 0, 1);
173 EXPECT_SUBTRACTION(0x7fff'ffff'ffff'ffff, 0, 1, 999'999'999, 0x7fff'ffff'ffff'fffd, 1);
174
175 EXPECT_SUBTRACTION(3, 0, 5, 0, -2, 0);
176 EXPECT_SUBTRACTION(0, 3, 0, 5, -1, 999'999'998);
177 EXPECT_SUBTRACTION(0, 0, 0x7fff'ffff'ffff'ffff, 999'999'999, (i64)-0x8000'0000'0000'0000, 1);
178 EXPECT_SUBTRACTION(0, 0, (i64)-0x8000'0000'0000'0000, 0, 0x7fff'ffff'ffff'ffff, 999'999'999);
179 EXPECT_SUBTRACTION(-1, 999'999'999, (i64)-0x8000'0000'0000'0000, 0, 0x7fff'ffff'ffff'ffff, 999'999'999);
180 EXPECT_SUBTRACTION(-1, 999'999'998, (i64)-0x8000'0000'0000'0000, 0, 0x7fff'ffff'ffff'ffff, 999'999'998);
181
182 EXPECT_SUBTRACTION(123, 456, 123, 455, 0, 1);
183 EXPECT_SUBTRACTION(123, 456, 123, 456, 0, 0);
184 EXPECT_SUBTRACTION(123, 456, 123, 457, -1, 999'999'999);
185
186 EXPECT_SUBTRACTION(124, 456, 123, 455, 1, 1);
187 EXPECT_SUBTRACTION(124, 456, 123, 456, 1, 0);
188 EXPECT_SUBTRACTION(124, 456, 123, 457, 0, 999'999'999);
189
190 EXPECT_SUBTRACTION(-0x7fff'ffff'ffff'ffff, 999'999'995, 1, 999'999'994, (i64)-0x8000'0000'0000'0000, 1);
191 EXPECT_SUBTRACTION(-0x7fff'ffff'ffff'ffff, 999'999'995, 1, 999'999'995, (i64)-0x8000'0000'0000'0000, 0);
192 EXPECT_SUBTRACTION(-0x7fff'ffff'ffff'ffff, 999'999'995, 1, 999'999'996, (i64)-0x8000'0000'0000'0000, 0);
193}
194
195TEST_CASE(rounding)
196{
197 EXPECT_EQ(TIME(2, 800'800'800).to_seconds(), 3);
198 EXPECT_EQ(TIME(2, 800'800'800).to_milliseconds(), 2'801);
199 EXPECT_EQ(TIME(2, 800'800'800).to_microseconds(), 2'800'801);
200 EXPECT_EQ(TIME(2, 800'800'800).to_nanoseconds(), 2'800'800'800);
201 EXPECT_EQ(TIME(-2, 800'800'800).to_seconds(), -2);
202 EXPECT_EQ(TIME(-2, 800'800'800).to_milliseconds(), -1'200);
203 EXPECT_EQ(TIME(-2, 800'800'800).to_microseconds(), -1'199'200);
204 EXPECT_EQ(TIME(-2, 800'800'800).to_nanoseconds(), -1'199'199'200);
205
206 EXPECT_EQ(TIME(0, 0).to_seconds(), 0);
207 EXPECT_EQ(TIME(0, 0).to_milliseconds(), 0);
208 EXPECT_EQ(TIME(0, 0).to_microseconds(), 0);
209 EXPECT_EQ(TIME(0, 0).to_nanoseconds(), 0);
210
211 EXPECT_EQ(TIME(0, 1).to_seconds(), 1);
212 EXPECT_EQ(TIME(0, 1).to_milliseconds(), 1);
213 EXPECT_EQ(TIME(0, 1).to_microseconds(), 1);
214 EXPECT_EQ(TIME(0, 1).to_nanoseconds(), 1);
215 EXPECT_EQ(TIME(0, -1).to_seconds(), -1);
216 EXPECT_EQ(TIME(0, -1).to_milliseconds(), -1);
217 EXPECT_EQ(TIME(0, -1).to_microseconds(), -1);
218 EXPECT_EQ(TIME(0, -1).to_nanoseconds(), -1);
219
220 EXPECT_EQ(TIME(-9223372037, 145'224'191).to_nanoseconds(), (i64)-0x8000'0000'0000'0000);
221 EXPECT_EQ(TIME(-9223372037, 145'224'192).to_nanoseconds(), (i64)-0x8000'0000'0000'0000);
222 EXPECT_EQ(TIME(-9223372037, 145'224'193).to_nanoseconds(), -0x7fff'ffff'ffff'ffff);
223 EXPECT_EQ(TIME(9223372036, 854'775'806).to_nanoseconds(), 0x7fff'ffff'ffff'fffe);
224 EXPECT_EQ(TIME(9223372036, 854'775'807).to_nanoseconds(), 0x7fff'ffff'ffff'ffff);
225 EXPECT_EQ(TIME(9223372036, 854'775'808).to_nanoseconds(), 0x7fff'ffff'ffff'ffff);
226}
227
228TEST_CASE(truncation)
229{
230 // Sanity
231 EXPECT_EQ(TIME(2, 0).to_truncated_seconds(), 2);
232 EXPECT_EQ(TIME(-2, 0).to_truncated_seconds(), -2);
233 EXPECT_EQ(TIME(2, 800'800'800).to_truncated_seconds(), 2);
234 EXPECT_EQ(TIME(2, 800'800'800).to_truncated_milliseconds(), 2'800);
235 EXPECT_EQ(TIME(2, 800'800'800).to_truncated_microseconds(), 2'800'800);
236 EXPECT_EQ(TIME(-2, -800'800'800).to_truncated_seconds(), -2);
237 EXPECT_EQ(TIME(-2, -800'800'800).to_truncated_milliseconds(), -2'800);
238 EXPECT_EQ(TIME(-2, -800'800'800).to_truncated_microseconds(), -2'800'800);
239
240 // Overflow, seconds
241 EXPECT_EQ(Time::min().to_truncated_seconds(), (i64)-0x8000'0000'0000'0000);
242 EXPECT_EQ(Time::max().to_truncated_seconds(), 0x7fff'ffff'ffff'ffff);
243
244 // Overflow, milliseconds
245 EXPECT_EQ(TIME(-9223372036854776, 191'000'000).to_truncated_milliseconds(), (i64)-0x8000'0000'0000'0000);
246 EXPECT_EQ(TIME(-9223372036854776, 192'000'000).to_truncated_milliseconds(), (i64)-0x8000'0000'0000'0000);
247 EXPECT_EQ(TIME(-9223372036854776, 192'000'001).to_truncated_milliseconds(), -0x7fff'ffff'ffff'ffff);
248 EXPECT_EQ(TIME(-9223372036854776, 193'000'000).to_truncated_milliseconds(), -0x7fff'ffff'ffff'ffff);
249 EXPECT_EQ(TIME(9223372036854775, 806'000'000).to_truncated_milliseconds(), 0x7fff'ffff'ffff'fffe);
250 EXPECT_EQ(TIME(9223372036854775, 806'999'999).to_truncated_milliseconds(), 0x7fff'ffff'ffff'fffe);
251 EXPECT_EQ(TIME(9223372036854775, 807'000'000).to_truncated_milliseconds(), 0x7fff'ffff'ffff'ffff);
252 EXPECT_EQ(TIME(9223372036854775, 808'000'000).to_truncated_milliseconds(), 0x7fff'ffff'ffff'ffff);
253
254 // Overflow, microseconds
255 EXPECT_EQ(TIME(-9223372036855, 224'191'000).to_truncated_microseconds(), (i64)-0x8000'0000'0000'0000);
256 EXPECT_EQ(TIME(-9223372036855, 224'192'000).to_truncated_microseconds(), (i64)-0x8000'0000'0000'0000);
257 EXPECT_EQ(TIME(-9223372036855, 224'192'001).to_truncated_microseconds(), (i64)-0x7fff'ffff'ffff'ffff);
258 EXPECT_EQ(TIME(-9223372036855, 224'193'000).to_truncated_microseconds(), (i64)-0x7fff'ffff'ffff'ffff);
259 EXPECT_EQ(TIME(9223372036854, 775'806'000).to_truncated_microseconds(), 0x7fff'ffff'ffff'fffe);
260 EXPECT_EQ(TIME(9223372036854, 775'806'999).to_truncated_microseconds(), 0x7fff'ffff'ffff'fffe);
261 EXPECT_EQ(TIME(9223372036854, 775'807'000).to_truncated_microseconds(), 0x7fff'ffff'ffff'ffff);
262 EXPECT_EQ(TIME(9223372036854, 775'808'000).to_truncated_microseconds(), 0x7fff'ffff'ffff'ffff);
263}
264
265TEST_CASE(is_negative)
266{
267 auto small = Time::from_nanoseconds(10);
268 auto large = Time::from_nanoseconds(15);
269 auto result = small - large;
270 EXPECT_EQ(result.to_nanoseconds(), -5);
271 EXPECT(result.is_negative());
272
273 result = large - small;
274 EXPECT_EQ(result.to_nanoseconds(), 5);
275 EXPECT(!result.is_negative());
276}
277
278struct YearAndDays {
279 int year;
280 i64 days;
281};
282
283TEST_CASE(years_to_days_since_epoch_points)
284{
285 Array<YearAndDays, 24> test_data = { {
286 { 1969, -365 },
287 { 1970, 0 },
288 { 1971, 365 },
289 { 1900, -25567 },
290 { 2023, 19358 },
291 { 1800, -62091 },
292 { 2100, 47482 },
293 { 0, -719528 },
294 { -1, -719893 },
295 { -2, -720258 },
296 { -3, -720623 },
297 { -4, -720989 },
298 { -5, -721354 },
299 { -6, -721719 },
300 { 4000, 741442 },
301 { -10000, -4371953 },
302 { 10000, 2932897 },
303 { -1000000, -365962028 },
304 { 1000000, 364522972 },
305 { -5877640, -2147483456 },
306 { 5881474, 2147444740 },
307 // Very important year: https://github.com/SerenityOS/serenity/pull/16760#issuecomment-1369054745
308 { -999999, -365961662 },
309 // The following two values haven't been verified by any other algorithm, but are very close to "year * 365.2425", and prove that there is no UB due to signed overflow:
310 { 2147483647, 784351576412 },
311 { -2147483648, -784353015833 },
312 } };
313 for (auto entry : test_data) {
314 int year = entry.year;
315 i64 expected_days = entry.days;
316 i64 actual_days = years_to_days_since_epoch(year);
317 EXPECT_EQ(actual_days, expected_days);
318 }
319}
320
321BENCHMARK_CASE(years_to_days_since_epoch_benchmark)
322{
323 // This benchmark takes consistently "0ms" on Linux, and "0ms" on Serenity.
324 for (size_t i = 0; i < 100; ++i) {
325 i64 actual_days = years_to_days_since_epoch(-5877640);
326 (void)actual_days;
327 EXPECT_EQ(actual_days, -2147483456);
328 }
329}
330
331TEST_CASE(div_floor_by)
332{
333 EXPECT_EQ(AK::Detail::floor_div_by<4>(-5), -2);
334 EXPECT_EQ(AK::Detail::floor_div_by<4>(-4), -1);
335 EXPECT_EQ(AK::Detail::floor_div_by<4>(-3), -1);
336 EXPECT_EQ(AK::Detail::floor_div_by<4>(-2), -1);
337 EXPECT_EQ(AK::Detail::floor_div_by<4>(-1), -1);
338 EXPECT_EQ(AK::Detail::floor_div_by<4>(+0), +0);
339 EXPECT_EQ(AK::Detail::floor_div_by<4>(+1), +0);
340 EXPECT_EQ(AK::Detail::floor_div_by<4>(+2), +0);
341 EXPECT_EQ(AK::Detail::floor_div_by<4>(+3), +0);
342 EXPECT_EQ(AK::Detail::floor_div_by<4>(+4), +1);
343 EXPECT_EQ(AK::Detail::floor_div_by<4>(+5), +1);
344 EXPECT_EQ(AK::Detail::floor_div_by<4>(+6), +1);
345 EXPECT_EQ(AK::Detail::floor_div_by<4>(+7), +1);
346 EXPECT_EQ(AK::Detail::floor_div_by<4>(+8), +2);
347}
348
349TEST_CASE(mod_zeros_in_range)
350{
351 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 0), 0);
352 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 1), 1);
353 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 2), 1);
354 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 3), 1);
355 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 4), 1);
356 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 5), 2);
357 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 6), 2);
358
359 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(1, 1), 0);
360 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(1, 2), 0);
361 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(1, 3), 0);
362 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(1, 4), 0);
363 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(1, 5), 1);
364 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(1, 6), 1);
365
366 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(2, 2), 0);
367 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(2, 3), 0);
368 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(2, 4), 0);
369 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(2, 5), 1);
370 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(2, 6), 1);
371
372 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(3, 3), 0);
373 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(3, 4), 0);
374 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(3, 5), 1);
375 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(3, 6), 1);
376
377 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(4, 4), 0);
378 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(4, 5), 1);
379 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(4, 6), 1);
380
381 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(5, 5), 0);
382 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(5, 6), 0);
383
384 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(6, 6), 0);
385
386 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(-5, 3), 2);
387 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(-4, 3), 2);
388 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(-3, 3), 1);
389 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(-2, 3), 1);
390 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(-1, 3), 1);
391 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(-0, 3), 1);
392 EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(+1, 3), 0);
393}
394
395TEST_CASE(years_to_days_since_epoch_span)
396{
397 auto test_data_start_year = 1900;
398 // Data was pre-computed with a slow, but known-correct implementation.
399 // clang-format off
400 auto test_data = Array {
401 -25567, -25202, -24837, -24472, -24107, -23741, -23376, -23011,
402 -22646, -22280, -21915, -21550, -21185, -20819, -20454, -20089,
403 -19724, -19358, -18993, -18628, -18263, -17897, -17532, -17167,
404 -16802, -16436, -16071, -15706, -15341, -14975, -14610, -14245,
405 -13880, -13514, -13149, -12784, -12419, -12053, -11688, -11323,
406 -10958, -10592, -10227, -9862, -9497, -9131, -8766, -8401, -8036,
407 -7670, -7305, -6940, -6575, -6209, -5844, -5479, -5114, -4748, -4383,
408 -4018, -3653, -3287, -2922, -2557, -2192, -1826, -1461, -1096, -731,
409 -365, 0, 365, 730, 1096, 1461, 1826, 2191, 2557, 2922, 3287, 3652,
410 4018, 4383, 4748, 5113, 5479, 5844, 6209, 6574, 6940, 7305, 7670,
411 8035, 8401, 8766, 9131, 9496, 9862, 10227, 10592, 10957, 11323, 11688,
412 12053, 12418, 12784, 13149, 13514, 13879, 14245, 14610, 14975, 15340,
413 15706, 16071, 16436, 16801, 17167, 17532, 17897, 18262, 18628, 18993,
414 19358, 19723, 20089, 20454, 20819, 21184, 21550, 21915, 22280, 22645,
415 23011, 23376, 23741, 24106, 24472, 24837, 25202, 25567, 25933, 26298,
416 26663, 27028, 27394, 27759, 28124, 28489, 28855, 29220, 29585, 29950,
417 30316, 30681, 31046, 31411, 31777, 32142, 32507, 32872, 33238, 33603,
418 33968, 34333, 34699, 35064, 35429, 35794, 36160, 36525, 36890, 37255,
419 37621, 37986, 38351, 38716, 39082, 39447, 39812, 40177, 40543, 40908,
420 41273, 41638, 42004, 42369, 42734, 43099, 43465, 43830, 44195, 44560,
421 44926, 45291, 45656, 46021, 46387, 46752, 47117, 47482, 47847, 48212,
422 48577, 48942, 49308, 49673, 50038, 50403, 50769, 51134, 51499, 51864,
423 52230, 52595, 52960, 53325, 53691, 54056, 54421, 54786, 55152, 55517,
424 55882, 56247, 56613, 56978, 57343, 57708, 58074, 58439, 58804, 59169,
425 59535, 59900, 60265, 60630, 60996, 61361, 61726, 62091, 62457, 62822,
426 63187, 63552, 63918, 64283, 64648, 65013, 65379, 65744, 66109, 66474,
427 66840, 67205, 67570, 67935, 68301, 68666, 69031, 69396, 69762, 70127,
428 70492, 70857, 71223, 71588, 71953, 72318, 72684, 73049, 73414, 73779,
429 74145, 74510, 74875, 75240, 75606, 75971, 76336, 76701, 77067, 77432,
430 77797, 78162, 78528, 78893, 79258, 79623, 79989, 80354, 80719, 81084,
431 81450, 81815, 82180, 82545, 82911, 83276, 83641, 84006, 84371, 84736,
432 85101, 85466, 85832, 86197, 86562, 86927, 87293, 87658, 88023, 88388,
433 88754, 89119, 89484, 89849, 90215, 90580, 90945, 91310, 91676, 92041,
434 92406, 92771, 93137, 93502, 93867, 94232, 94598, 94963, 95328, 95693,
435 96059, 96424, 96789, 97154, 97520, 97885, 98250, 98615, 98981, 99346,
436 99711, 100076, 100442, 100807, 101172, 101537, 101903, 102268, 102633,
437 102998, 103364, 103729, 104094, 104459, 104825, 105190, 105555,
438 105920, 106286, 106651, 107016, 107381, 107747, 108112, 108477,
439 108842, 109208, 109573, 109938, 110303, 110669, 111034, 111399,
440 111764, 112130, 112495, 112860, 113225, 113591, 113956, 114321,
441 114686, 115052, 115417, 115782, 116147, 116513, 116878, 117243,
442 117608, 117974, 118339, 118704, 119069, 119435, 119800, 120165,
443 120530, 120895, 121260, 121625, 121990, 122356, 122721, 123086,
444 123451, 123817, 124182, 124547, 124912, 125278, 125643, 126008,
445 126373, 126739, 127104, 127469, 127834, 128200, 128565, 128930,
446 129295, 129661, 130026, 130391, 130756, 131122, 131487, 131852,
447 132217, 132583, 132948, 133313, 133678, 134044, 134409, 134774,
448 135139, 135505, 135870, 136235, 136600, 136966, 137331, 137696,
449 138061, 138427, 138792, 139157, 139522, 139888, 140253, 140618,
450 140983, 141349, 141714, 142079, 142444, 142810, 143175, 143540,
451 143905, 144271, 144636, 145001, 145366, 145732, 146097, 146462,
452 146827, 147193, 147558, 147923, 148288, 148654, 149019, 149384,
453 149749, 150115, 150480, 150845, 151210, 151576, 151941, 152306,
454 152671, 153037, 153402, 153767, 154132, 154498, 154863, 155228,
455 155593, 155959, 156324, 156689, 157054, 157420, 157785, 158150,
456 158515, 158881, 159246, 159611, 159976, 160342, 160707, 161072,
457 161437, 161803, 162168, 162533, 162898, 163264, 163629, 163994,
458 164359, 164725, 165090, 165455, 165820, 166186, 166551, 166916,
459 167281, 167647, 168012, 168377, 168742, 169108, 169473, 169838,
460 170203, 170569, 170934, 171299, 171664, 172030, 172395, 172760,
461 173125, 173491, 173856, 174221, 174586, 174952, 175317, 175682,
462 176047, 176413, 176778, 177143, 177508, 177874, 178239, 178604,
463 178969, 179335, 179700, 180065, 180430, 180796, 181161, 181526,
464 181891, 182257, 182622, 182987, 183352, 183718, 184083, 184448,
465 184813, 185179, 185544, 185909, 186274, 186640, 187005, 187370,
466 187735, 188101, 188466, 188831, 189196, 189562, 189927, 190292,
467 190657, 191023, 191388, 191753, 192118, 192484, 192849, 193214,
468 193579, 193944, 194309, 194674, 195039, 195405,
469 };
470 // clang-format on
471 for (size_t offset = 0; offset < test_data.size(); ++offset) {
472 int year = offset + test_data_start_year;
473 i64 expected_days = test_data[offset];
474 i64 actual_days = years_to_days_since_epoch(year);
475 EXPECT_EQ(actual_days, expected_days);
476 }
477}
478
479TEST_CASE(user_defined_literals)
480{
481 using namespace AK::TimeLiterals;
482 static_assert(Time::from_nanoseconds(123) == 123_ns, "Factory is same as UDL");
483
484 static_assert(100_ms > 10_ms, "LT UDL");
485 static_assert(1000_ns == 1_us, "EQ UDL");
486 static_assert(1_sec > 1_ms, "GT UDL");
487 static_assert(100_ms >= 100'000_us, "GE UDL (eq)");
488 static_assert(100_ms >= 99'999_us, "GE UDL (gt)");
489 static_assert(100_ms <= 100'000_us, "LE UDL (eq)");
490 static_assert(100_ms <= 100'001_us, "LE UDL (lt)");
491 static_assert(1_sec != 2_sec, "NE UDL");
492}