173 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 nonexistent_local_time18//19// template<class Duration>20// nonexistent_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::nonexistent_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 // gap 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::nonexistent,50 std::chrono::sys_info{51 std::chrono::sys_days{std::chrono::September / 1 / 1969},52 std::chrono::sys_days{std::chrono::December / 31 / 1969} + 23h,53 0s,54 0min,55 "PREV"},56 std::chrono::sys_info{57 std::chrono::sys_days{std::chrono::January / 1 / 1970},58 std::chrono::sys_days{std::chrono::March / 1 / 1970},59 1h,60 60min,61 "NEXT"}},62 R"(1969-12-31 23:59:59.999999999 is in a gap between631969-12-31 23:00:00 PREV and641970-01-01 01:00:00 NEXT which are both equivalent to651969-12-31 23:00:00 UTC)");66 67 test(std::chrono::local_time<std::chrono::microseconds>{0us},68 std::chrono::local_info{69 std::chrono::local_info::nonexistent,70 std::chrono::sys_info{71 std::chrono::sys_days{std::chrono::September / 1 / 1969},72 std::chrono::sys_days{std::chrono::December / 31 / 1969} + 23h,73 0s,74 0min,75 "PREV"},76 std::chrono::sys_info{77 std::chrono::sys_days{std::chrono::January / 1 / 1970},78 std::chrono::sys_days{std::chrono::March / 1 / 1970},79 1h,80 60min,81 "NEXT"}},82 R"(1970-01-01 00:00:00.000000 is in a gap between831969-12-31 23:00:00 PREV and841970-01-01 01:00:00 NEXT which are both equivalent to851969-12-31 23:00:00 UTC)");86 87 test(std::chrono::local_time<std::chrono::milliseconds>{1ms},88 std::chrono::local_info{89 std::chrono::local_info::nonexistent,90 std::chrono::sys_info{91 std::chrono::sys_days{std::chrono::September / 1 / 1969},92 std::chrono::sys_days{std::chrono::December / 31 / 1969} + 23h,93 0s,94 0min,95 "PREV"},96 std::chrono::sys_info{97 std::chrono::sys_days{std::chrono::January / 1 / 1970},98 std::chrono::sys_days{std::chrono::March / 1 / 1970},99 1h,100 60min,101 "NEXT"}},102 R"(1970-01-01 00:00:00.001 is in a gap between1031969-12-31 23:00:00 PREV and1041970-01-01 01:00:00 NEXT which are both equivalent to1051969-12-31 23:00:00 UTC)");106 107 test(std::chrono::local_seconds{(std::chrono::sys_days{std::chrono::January / 1 / -21970}).time_since_epoch()},108 std::chrono::local_info{109 std::chrono::local_info::nonexistent,110 std::chrono::sys_info{111 std::chrono::sys_days{std::chrono::September / 1 / -21969},112 std::chrono::sys_days{std::chrono::December / 31 / -21969} + 23h,113 0s,114 0min,115 "PREV"},116 std::chrono::sys_info{117 std::chrono::sys_days{std::chrono::January / 1 / -21970},118 std::chrono::sys_days{std::chrono::March / 1 / -21970},119 1h,120 60min,121 "NEXT"}},122 R"(-21970-01-01 00:00:00 is in a gap between123-21969-12-31 23:00:00 PREV and124-21970-01-01 01:00:00 NEXT which are both equivalent to125-21969-12-31 23:00:00 UTC)");126 127 test(128 std::chrono::local_time<std::chrono::days>{129 (std::chrono::sys_days{std::chrono::January / 1 / 21970}).time_since_epoch()},130 std::chrono::local_info{131 std::chrono::local_info::nonexistent,132 std::chrono::sys_info{133 std::chrono::sys_days{std::chrono::September / 1 / 21969},134 std::chrono::sys_days{std::chrono::December / 31 / 21969} + 23h,135 0s,136 0min,137 "PREV"},138 std::chrono::sys_info{139 std::chrono::sys_days{std::chrono::January / 1 / 21970},140 std::chrono::sys_days{std::chrono::March / 1 / 21970},141 1h,142 60min,143 "NEXT"}},144 R"(21970-01-01 is in a gap between14521969-12-31 23:00:00 PREV and14621970-01-01 01:00:00 NEXT which are both equivalent to14721969-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::nonexistent,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} + 23h,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},161 1h,162 60min,163 "NEXT"}},164 R"(1970-01-01 is in a gap between1651969-12-31 23:00:00 PREV and1661970-01-01 01:00:00 NEXT which are both equivalent to1671969-12-31 23:00:00 UTC)");168 169 // Note months and years can not be streamed.170 171 return 0;172}173