135 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// template<class Duration, class TimeZonePtr = const time_zone*>18// class zoned_time;19//20// local_time<duration> get_local_time() 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 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};36 37 std::same_as<local_time_point> decltype(auto) time = zt.get_local_time();38 assert(time == local_time_point{duration{42} - cr::hours{1}});39 }40 {41 using duration = cr::nanoseconds;42 using time_point = cr::sys_time<duration>;43 using local_time_point = cr::local_time<duration>;44 const cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};45 46 std::same_as<local_time_point> decltype(auto) time = zt.get_local_time();47 assert(time == local_time_point{duration{42} - cr::hours{1}});48 }49}50 51static void test_duration_conversion() {52 // common_type_t<duration, seconds> -> duration53 {54 using duration = cr::nanoseconds;55 using time_point = cr::sys_time<duration>;56 using local_time_point = cr::local_time<duration>;57 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};58 59 std::same_as<local_time_point> decltype(auto) time = zt.get_local_time();60 assert(time == local_time_point{duration{42} - cr::hours{1}});61 }62 {63 using duration = cr::microseconds;64 using time_point = cr::sys_time<duration>;65 using local_time_point = cr::local_time<duration>;66 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};67 68 std::same_as<local_time_point> decltype(auto) time = zt.get_local_time();69 assert(time == local_time_point{duration{42} - cr::hours{1}});70 }71 {72 using duration = cr::milliseconds;73 using time_point = cr::sys_time<duration>;74 using local_time_point = cr::local_time<duration>;75 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};76 77 std::same_as<local_time_point> decltype(auto) time = zt.get_local_time();78 assert(time == local_time_point{duration{42} - cr::hours{1}});79 }80 // common_type_t<seconds, seconds> -> seconds81 {82 using duration = cr::seconds;83 using time_point = cr::sys_time<duration>;84 using local_time_point = cr::local_time<duration>;85 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};86 87 std::same_as<local_time_point> decltype(auto) time = zt.get_local_time();88 assert(time == local_time_point{duration{42} - cr::hours{1}});89 }90 // common_type_t<duration, seconds> -> seconds91 {92 using duration = cr::days;93 using time_point = cr::sys_time<duration>;94 using local_time_point = cr::local_time<cr::seconds>;95 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};96 97 std::same_as<local_time_point> decltype(auto) time = zt.get_local_time();98 assert(time == local_time_point{duration{42} - cr::hours{1}});99 }100 {101 using duration = cr::weeks;102 using time_point = cr::sys_time<duration>;103 using local_time_point = cr::local_time<cr::seconds>;104 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};105 106 std::same_as<local_time_point> decltype(auto) time = zt.get_local_time();107 assert(time == local_time_point{duration{42} - cr::hours{1}});108 }109 {110 using duration = cr::months;111 using time_point = cr::sys_time<duration>;112 using local_time_point = cr::local_time<cr::seconds>;113 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};114 115 std::same_as<local_time_point> decltype(auto) time = zt.get_local_time();116 assert(time == local_time_point{duration{42} - cr::hours{1}});117 }118 {119 using duration = cr::years;120 using time_point = cr::sys_time<duration>;121 using local_time_point = cr::local_time<cr::seconds>;122 cr::zoned_time<duration> zt{"Etc/GMT+1", time_point{duration{42}}};123 124 std::same_as<local_time_point> decltype(auto) time = zt.get_local_time();125 assert(time == local_time_point{duration{42} - cr::hours{1}});126 }127}128 129int main(int, char**) {130 test_callable_with_non_const_and_const_objects();131 test_duration_conversion();132 133 return 0;134}135