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-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03, c++11, c++14, c++17
10// UNSUPPORTED: no-filesystem, no-localization, no-tzdb
11
12// XFAIL: libcpp-has-no-experimental-tzdb
13// XFAIL: availability-tzdb-missing
14
15// <chrono>
16
17// template<class Duration, class TimeZonePtr = const time_zone*>
18// class zoned_time;
19//
20// explicit operator local_time<duration>() const;
21
22#include <chrono>
23#include <cassert>
24#include <concepts>
25
26#include "../test_offset_time_zone.h"
27
28namespace cr = std::chrono;
29
30static void test_callable_with_non_const_and_const_objects() {
31 {
32 using duration = cr::nanoseconds;
33 using time_point = cr::sys_time<duration>;
34 using local_time_point = cr::local_time<duration>;
35 static_assert(!std::is_convertible_v<local_time_point, cr::zoned_time<duration>>);
36 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};
37
38 std::same_as<local_time_point> decltype(auto) time = static_cast<local_time_point>(zt);
39 assert(time == local_time_point{duration{42} - cr::hours{1}});
40 }
41 {
42 using duration = cr::nanoseconds;
43 using time_point = cr::sys_time<duration>;
44 using local_time_point = cr::local_time<duration>;
45 static_assert(!std::is_convertible_v<local_time_point, const cr::zoned_time<duration>>);
46 const cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};
47
48 std::same_as<local_time_point> decltype(auto) time = static_cast<local_time_point>(zt);
49 assert(time == local_time_point{duration{42} - cr::hours{1}});
50 }
51}
52
53static void test_duration_conversion() {
54 // common_type_t<duration, seconds> -> duration
55 {
56 using duration = cr::nanoseconds;
57 using time_point = cr::sys_time<duration>;
58 using local_time_point = cr::local_time<duration>;
59 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};
60
61 std::same_as<local_time_point> decltype(auto) time = static_cast<local_time_point>(zt);
62 assert(time == local_time_point{duration{42} - cr::hours{1}});
63 }
64 {
65 using duration = cr::microseconds;
66 using time_point = cr::sys_time<duration>;
67 using local_time_point = cr::local_time<duration>;
68 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};
69
70 std::same_as<local_time_point> decltype(auto) time = static_cast<local_time_point>(zt);
71 assert(time == local_time_point{duration{42} - cr::hours{1}});
72 }
73 {
74 using duration = cr::milliseconds;
75 using time_point = cr::sys_time<duration>;
76 using local_time_point = cr::local_time<duration>;
77 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};
78
79 std::same_as<local_time_point> decltype(auto) time = static_cast<local_time_point>(zt);
80 assert(time == local_time_point{duration{42} - cr::hours{1}});
81 }
82 // common_type_t<seconds, seconds> -> seconds
83 {
84 using duration = cr::seconds;
85 using time_point = cr::sys_time<duration>;
86 using local_time_point = cr::local_time<duration>;
87 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};
88
89 std::same_as<local_time_point> decltype(auto) time = static_cast<local_time_point>(zt);
90 assert(time == local_time_point{duration{42} - cr::hours{1}});
91 }
92 // common_type_t<duration, seconds> -> seconds
93 {
94 using duration = cr::days;
95 using time_point = cr::sys_time<duration>;
96 using local_time_point = cr::local_time<cr::seconds>;
97 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};
98
99 std::same_as<local_time_point> decltype(auto) time = static_cast<local_time_point>(zt);
100 assert(time == local_time_point{duration{42} - cr::hours{1}});
101 }
102 {
103 using duration = cr::weeks;
104 using time_point = cr::sys_time<duration>;
105 using local_time_point = cr::local_time<cr::seconds>;
106 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};
107
108 std::same_as<local_time_point> decltype(auto) time = static_cast<local_time_point>(zt);
109 assert(time == local_time_point{duration{42} - cr::hours{1}});
110 }
111 {
112 using duration = cr::months;
113 using time_point = cr::sys_time<duration>;
114 using local_time_point = cr::local_time<cr::seconds>;
115 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};
116
117 std::same_as<local_time_point> decltype(auto) time = static_cast<local_time_point>(zt);
118 assert(time == local_time_point{duration{42} - cr::hours{1}});
119 }
120 {
121 using duration = cr::years;
122 using time_point = cr::sys_time<duration>;
123 using local_time_point = cr::local_time<cr::seconds>;
124 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};
125
126 std::same_as<local_time_point> decltype(auto) time = static_cast<local_time_point>(zt);
127 assert(time == local_time_point{duration{42} - cr::hours{1}});
128 }
129}
130
131int main(int, char**) {
132 test_callable_with_non_const_and_const_objects();
133 test_duration_conversion();
134
135 return 0;
136}
137

source code of libcxx/test/std/time/time.zone/time.zone.zonedtime/time.zone.zonedtime.members/operator_local_time.pass.cpp