Serenity Operating System
at master 492 lines 25 kB view raw
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}