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// public:
20// using duration = common_type_t<Duration, seconds>;
21// ...
22// zoned_time(const zoned_time&) = default;
23// zoned_time& operator=(const zoned_time&) = default;
24//
25// };
26//
27// using zoned_seconds = zoned_time<seconds>;
28
29#include <chrono>
30#include <concepts>
31#include <type_traits>
32#include <memory>
33
34// Test the default template argument
35static_assert(std::same_as<std::chrono::zoned_time<std::chrono::days>,
36 std::chrono::zoned_time<std::chrono::days, const std::chrono::time_zone*>>);
37
38// Test duration
39static_assert(std::same_as<std::chrono::zoned_time<std::chrono::nanoseconds>::duration, std::chrono::nanoseconds>);
40static_assert(std::same_as<std::chrono::zoned_time<std::chrono::microseconds>::duration, std::chrono::microseconds>);
41static_assert(std::same_as<std::chrono::zoned_time<std::chrono::milliseconds>::duration, std::chrono::milliseconds>);
42static_assert(std::same_as<std::chrono::zoned_time<std::chrono::seconds>::duration, std::chrono::seconds>);
43static_assert(std::same_as<std::chrono::zoned_time<std::chrono::days>::duration, std::chrono::seconds>);
44static_assert(std::same_as<std::chrono::zoned_time<std::chrono::weeks>::duration, std::chrono::seconds>);
45static_assert(std::same_as<std::chrono::zoned_time<std::chrono::months>::duration, std::chrono::seconds>);
46static_assert(std::same_as<std::chrono::zoned_time<std::chrono::years>::duration, std::chrono::seconds>);
47
48// Tests defaulted copy construct/assign and move construct/assign
49static_assert(std::is_copy_constructible_v<std::chrono::zoned_time<std::chrono::days>>);
50static_assert(std::is_move_constructible_v<std::chrono::zoned_time<std::chrono::days>>);
51static_assert(std::is_copy_assignable_v<std::chrono::zoned_time<std::chrono::days>>);
52static_assert(std::is_move_assignable_v<std::chrono::zoned_time<std::chrono::days>>);
53
54// There are no requirements for TimeZonePtr, so test with a non-pointer type.
55static_assert(std::is_copy_constructible_v<std::chrono::zoned_time<std::chrono::days, int>>);
56static_assert(std::is_move_constructible_v<std::chrono::zoned_time<std::chrono::days, int>>);
57static_assert(std::is_copy_assignable_v<std::chrono::zoned_time<std::chrono::days, int>>);
58static_assert(std::is_move_assignable_v<std::chrono::zoned_time<std::chrono::days, int>>);
59
60// Test with a move only type, since the copy constructor is defined, no move
61// constuctor is generated.
62static_assert(!std::is_copy_constructible_v<std::chrono::zoned_time< std::chrono::days, std::unique_ptr<int>>>);
63static_assert(!std::is_move_constructible_v<std::chrono::zoned_time< std::chrono::days, std::unique_ptr<int>>>);
64static_assert(!std::is_copy_assignable_v<std::chrono::zoned_time< std::chrono::days, std::unique_ptr<int>>>);
65static_assert(!std::is_move_assignable_v<std::chrono::zoned_time< std::chrono::days, std::unique_ptr<int>>>);
66
67// using zoned_seconds = zoned_time<seconds>;
68static_assert(std::same_as<std::chrono::zoned_seconds, std::chrono::zoned_time<std::chrono::seconds>>);
69

source code of libcxx/test/std/time/time.zone/time.zone.zonedtime/types.compile.pass.cpp