brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.4 KiB · ab22cfa Raw
246 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710// UNSUPPORTED: no-filesystem, no-localization, no-tzdb11 12// XFAIL: libcpp-has-no-experimental-tzdb13// XFAIL: availability-tzdb-missing14 15// <chrono>16//17// class utc_clock;18 19// template<class Duration>20// static utc_time<common_type_t<Duration, seconds>>21// from_sys(const sys_time<Duration>& time);22 23#include <chrono>24#include <cassert>25 26#include "test_macros.h"27#include "assert_macros.h"28#include "concat_macros.h"29 30template <class Duration>31static void test_leap_seconds(std::chrono::time_point<std::chrono::system_clock, Duration> time,32                              std::chrono::seconds leap_seconds) {33  auto utc  = std::chrono::utc_clock::from_sys(time);34  auto diff = utc.time_since_epoch() - time.time_since_epoch();35  TEST_REQUIRE(36      diff == leap_seconds,37      TEST_WRITE_CONCATENATED("\tTime: ", time, "\nExpected output ", leap_seconds, "\nActual output   ", diff, '\n'));38}39 40// This test is based on the example in [time.clock.utc.members]/341static void test_example_standard() {42  using namespace std::literals::chrono_literals;43 44  auto t = std::chrono::sys_days{std::chrono::July / 1 / 2015} - 2ns;45  test_leap_seconds(t, 25s);46 47  t += 1ns;48  test_leap_seconds(t, 25s);49 50  t += 1ns;51  test_leap_seconds(t, 26s);52 53  t += 1ns;54  test_leap_seconds(t, 26s);55}56 57// Tests set of existing database entries at the time of writing.58static void test_transitions() {59  using namespace std::literals::chrono_literals;60 61  test_leap_seconds(std::chrono::sys_seconds::min(), 0s);62  test_leap_seconds(std::chrono::sys_days::min(), 0s);63 64  // Epoch transition no transitions.65  test_leap_seconds(std::chrono::sys_seconds{-1s}, 0s);66  test_leap_seconds(std::chrono::sys_seconds{0s}, 0s);67  test_leap_seconds(std::chrono::sys_seconds{1s}, 0s);68 69  // Transitions from the start of UTC.70  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1972} - 1ns, 0s);71  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1972}, 0s);72  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1972} + 1ns, 0s);73 74  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1972} - 1ns, 0s);75  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1972}, 1s);76  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1972} + 1ns, 1s);77 78  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1973} - 1ns, 1s);79  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1973}, 2s);80  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1973} + 1ns, 2s);81 82  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1974} - 1ns, 2s);83  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1974}, 3s);84  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1974} + 1ns, 3s);85 86  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1975} - 1ns, 3s);87  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1975}, 4s);88  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1975} + 1ns, 4s);89 90  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1976} - 1ns, 4s);91  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1976}, 5s);92  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1976} + 1ns, 5s);93 94  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1977} - 1ns, 5s);95  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1977}, 6s);96  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1977} + 1ns, 6s);97 98  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1978} - 1ns, 6s);99  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1978}, 7s);100  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1978} + 1ns, 7s);101 102  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1979} - 1ns, 7s);103  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1979}, 8s);104  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1979} + 1ns, 8s);105 106  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1980} - 1ns, 8s);107  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1980}, 9s);108  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1980} + 1ns, 9s);109 110  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1981} - 1ns, 9s);111  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1981}, 10s);112  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1981} + 1ns, 10s);113 114  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1982} - 1ns, 10s);115  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1982}, 11s);116  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1982} + 1ns, 11s);117 118  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1983} - 1ns, 11s);119  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1983}, 12s);120  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1983} + 1ns, 12s);121 122  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1985} - 1ns, 12s);123  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1985}, 13s);124  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1985} + 1ns, 13s);125 126  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1988} - 1ns, 13s);127  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1988}, 14s);128  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1988} + 1ns, 14s);129 130  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1990} - 1ns, 14s);131  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1990}, 15s);132  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1990} + 1ns, 15s);133 134  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1991} - 1ns, 15s);135  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1991}, 16s);136  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1991} + 1ns, 16s);137 138  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1992} - 1ns, 16s);139  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1992}, 17s);140  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1992} + 1ns, 17s);141 142  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1993} - 1ns, 17s);143  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1993}, 18s);144  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1993} + 1ns, 18s);145 146  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1994} - 1ns, 18s);147  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1994}, 19s);148  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1994} + 1ns, 19s);149 150  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1996} - 1ns, 19s);151  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1996}, 20s);152  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1996} + 1ns, 20s);153 154  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1997} - 1ns, 20s);155  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1997}, 21s);156  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 1997} + 1ns, 21s);157 158  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1999} - 1ns, 21s);159  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1999}, 22s);160  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 1999} + 1ns, 22s);161 162  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 2006} - 1ns, 22s);163  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 2006}, 23s);164  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 2006} + 1ns, 23s);165 166  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 2009} - 1ns, 23s);167  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 2009}, 24s);168  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 2009} + 1ns, 24s);169 170  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 2012} - 1ns, 24s);171  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 2012}, 25s);172  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 2012} + 1ns, 25s);173 174  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 2015} - 1ns, 25s);175  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 2015}, 26s);176  test_leap_seconds(std::chrono::sys_days{std::chrono::July / 1 / 2015} + 1ns, 26s);177 178  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 2017} - 1ns, 26s);179  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 2017}, 27s);180  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 2017} + 1ns, 27s);181 182  // This validates status when the tests were written.183  // It's not possible to test the future; there might be additional leap184  // seconds in the future.185  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 2024} - 1ns, 27s);186  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 2024}, 27s);187  test_leap_seconds(std::chrono::sys_days{std::chrono::January / 1 / 2024} + 1ns, 27s);188}189 190// Tests whether the return type is the expected type.191static void test_return_type() {192  namespace cr = std::chrono;193  using namespace std::literals::chrono_literals;194 195  {196    [[maybe_unused]] std::same_as<cr::utc_time<cr::nanoseconds>> decltype(auto) _ =197        cr::utc_clock::from_sys(cr::sys_time<cr::nanoseconds>{0ns});198  }199  {200    [[maybe_unused]] std::same_as<cr::utc_time<cr::microseconds>> decltype(auto) _ =201        cr::utc_clock::from_sys(cr::sys_time<cr::microseconds>{0us});202  }203  {204    [[maybe_unused]] std::same_as<cr::utc_time<cr::milliseconds>> decltype(auto) _ =205        cr::utc_clock::from_sys(cr::sys_time<cr::milliseconds>{0ms});206  }207 208  {209    [[maybe_unused]] std::same_as<cr::utc_time<cr::seconds>> decltype(auto) _ =210        cr::utc_clock::from_sys(cr::sys_time<cr::seconds>{cr::seconds{0}});211  }212 213  {214    [[maybe_unused]] std::same_as<cr::utc_time<cr::seconds>> decltype(auto) _ =215        cr::utc_clock::from_sys(cr::sys_time<cr::minutes>{cr::minutes{0}});216  }217  {218    [[maybe_unused]] std::same_as<cr::utc_time<cr::seconds>> decltype(auto) _ =219        cr::utc_clock::from_sys(cr::sys_time<cr::hours>{cr::hours{0}});220  }221  {222    [[maybe_unused]] std::same_as<cr::utc_time<cr::seconds>> decltype(auto) _ =223        cr::utc_clock::from_sys(cr::sys_time<cr::days>{cr::days{0}});224  }225  {226    [[maybe_unused]] std::same_as<cr::utc_time<cr::seconds>> decltype(auto) _ =227        cr::utc_clock::from_sys(cr::sys_time<cr::weeks>{cr::weeks{0}});228  }229  {230    [[maybe_unused]] std::same_as<cr::utc_time<cr::seconds>> decltype(auto) _ =231        cr::utc_clock::from_sys(cr::sys_time<cr::months>{cr::months{0}});232  }233  {234    [[maybe_unused]] std::same_as<cr::utc_time<cr::seconds>> decltype(auto) _ =235        cr::utc_clock::from_sys(cr::sys_time<cr::years>{cr::years{0}});236  }237}238 239int main(int, const char**) {240  test_example_standard();241  test_transitions();242  test_return_type();243 244  return 0;245}246