brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · a0b1416 Raw
172 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 ambiguous_local_time18//19//  template<class Duration>20//    ambiguous_local_time(const local_time<Duration>& tp, const local_info& i);21 22#include <chrono>23#include <string_view>24 25#include "assert_macros.h"26#include "concat_macros.h"27 28template <class Duration>29static void30test(const std::chrono::local_time<Duration>& tp, const std::chrono::local_info& i, std::string_view expected) {31  std::chrono::ambiguous_local_time exception{tp, i};32  std::string_view result = exception.what();33  TEST_REQUIRE(result == expected,34               TEST_WRITE_CONCATENATED("Expected output\n", expected, "\n\nActual output\n", result, '\n'));35}36 37// The constructor constructs the runtime_error base class with a specific38// message. This implicitly tests what() too, since that is inherited from39// runtime_error there is no separate test for what().40int main(int, char**) {41  using namespace std::literals::chrono_literals;42 43  // There is no requirement on the ordering of PREV and NEXT so an "invalid"44  // overlap is allowed. All tests with negative dates use the same order as45  // positive tests.46 47  test(std::chrono::local_time<std::chrono::nanoseconds>{-1ns},48       std::chrono::local_info{49           std::chrono::local_info::ambiguous,50           std::chrono::sys_info{51               std::chrono::sys_days{std::chrono::January / 1 / 1970},52               std::chrono::sys_days{std::chrono::March / 1 / 1970},53               1h,54               60min,55               "PREV"},56 57           std::chrono::sys_info{58               std::chrono::sys_days{std::chrono::September / 1 / 1969},59               std::chrono::sys_days{std::chrono::December / 31 / 1969} + 23h,60               0s,61               0min,62               "NEXT"}63 64       },65       R"(1969-12-31 23:59:59.999999999 is ambiguous.  It could be661969-12-31 23:59:59.999999999 PREV == 1969-12-31 22:59:59.999999999 UTC or671969-12-31 23:59:59.999999999 NEXT == 1969-12-31 23:59:59.999999999 UTC)");68 69  test(std::chrono::local_time<std::chrono::microseconds>{0us},70       std::chrono::local_info{71           std::chrono::local_info::ambiguous,72           std::chrono::sys_info{73               std::chrono::sys_days{std::chrono::January / 1 / 1970},74               std::chrono::sys_days{std::chrono::March / 1 / 1970},75               1h,76               60min,77               "PREV"},78 79           std::chrono::sys_info{80               std::chrono::sys_days{std::chrono::September / 1 / 1969},81               std::chrono::sys_days{std::chrono::December / 31 / 1969} + 23h,82               0s,83               0min,84               "NEXT"}},85       R"(1970-01-01 00:00:00.000000 is ambiguous.  It could be861970-01-01 00:00:00.000000 PREV == 1969-12-31 23:00:00.000000 UTC or871970-01-01 00:00:00.000000 NEXT == 1970-01-01 00:00:00.000000 UTC)");88 89  test(std::chrono::local_time<std::chrono::milliseconds>{1ms},90       std::chrono::local_info{91           std::chrono::local_info::ambiguous,92           std::chrono::sys_info{93               std::chrono::sys_days{std::chrono::January / 1 / 1970},94               std::chrono::sys_days{std::chrono::March / 1 / 1970},95               1h,96               60min,97               "PREV"},98 99           std::chrono::sys_info{100               std::chrono::sys_days{std::chrono::September / 1 / 1969},101               std::chrono::sys_days{std::chrono::December / 31 / 1969} + 23h,102               0s,103               0min,104               "NEXT"}},105       R"(1970-01-01 00:00:00.001 is ambiguous.  It could be1061970-01-01 00:00:00.001 PREV == 1969-12-31 23:00:00.001 UTC or1071970-01-01 00:00:00.001 NEXT == 1970-01-01 00:00:00.001 UTC)");108 109  test(std::chrono::local_seconds{(std::chrono::sys_days{std::chrono::January / 1 / -21970}).time_since_epoch()},110       std::chrono::local_info{111           std::chrono::local_info::ambiguous,112           std::chrono::sys_info{113               std::chrono::sys_days{std::chrono::September / 1 / -21969},114               std::chrono::sys_days{std::chrono::December / 31 / -21969},115               0s,116               0min,117               "PREV"},118           std::chrono::sys_info{119               std::chrono::sys_days{std::chrono::January / 1 / -21970},120               std::chrono::sys_days{std::chrono::March / 1 / -21970} + 23h,121               1h,122               60min,123               "NEXT"}},124       R"(-21970-01-01 00:00:00 is ambiguous.  It could be125-21970-01-01 00:00:00 PREV == -21970-01-01 00:00:00 UTC or126-21970-01-01 00:00:00 NEXT == -21971-12-31 23:00:00 UTC)");127 128  test(129      std::chrono::local_time<std::chrono::days>{130          (std::chrono::sys_days{std::chrono::January / 1 / 21970}).time_since_epoch()},131      std::chrono::local_info{132          std::chrono::local_info::ambiguous,133          std::chrono::sys_info{134              std::chrono::sys_days{std::chrono::September / 1 / 21969},135              std::chrono::sys_days{std::chrono::December / 31 / 21969},136              0s,137              0min,138              "PREV"},139          std::chrono::sys_info{140              std::chrono::sys_days{std::chrono::January / 1 / 21970},141              std::chrono::sys_days{std::chrono::March / 1 / 21970} + 23h,142              1h,143              60min,144              "NEXT"}},145      R"(21970-01-01 is ambiguous.  It could be14621970-01-01 PREV == 21970-01-01 00:00:00 UTC or14721970-01-01 NEXT == 21969-12-31 23:00:00 UTC)");148 149  test(std::chrono::local_time<std::chrono::weeks>{},150       std::chrono::local_info{151           std::chrono::local_info::ambiguous,152           std::chrono::sys_info{153               std::chrono::sys_days{std::chrono::September / 1 / 1969},154               std::chrono::sys_days{std::chrono::December / 31 / 1969},155               0s,156               0min,157               "PREV"},158           std::chrono::sys_info{159               std::chrono::sys_days{std::chrono::January / 1 / 1970},160               std::chrono::sys_days{std::chrono::March / 1 / 1970} + 23h,161               1h,162               60min,163               "NEXT"}},164       R"(1970-01-01 is ambiguous.  It could be1651970-01-01 PREV == 1970-01-01 00:00:00 UTC or1661970-01-01 NEXT == 1969-12-31 23:00:00 UTC)");167 168  // Note months and years can not be streamed.169 170  return 0;171}172