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// UNSUPPORTED: c++03, c++11, c++14, c++17
9
10// <chrono>
11// class year_month_day;
12
13// constexpr year_month_day(const sys_days& dp) noexcept;
14//
15// Effects: Constructs an object of type year_month_day that corresponds
16// to the date represented by dp.
17//
18// Remarks: For any value ymd of type year_month_day for which ymd.ok() is true,
19// ymd == year_month_day{sys_days{ymd}} is true.
20//
21// constexpr chrono::year year() const noexcept;
22// constexpr chrono::month month() const noexcept;
23// constexpr bool ok() const noexcept;
24
25#include <chrono>
26#include <cassert>
27#include <type_traits>
28#include <utility>
29
30#include "test_macros.h"
31
32int main(int, char**)
33{
34 using year = std::chrono::year;
35 using day = std::chrono::day;
36 using sys_days = std::chrono::sys_days;
37 using days = std::chrono::days;
38 using year_month_day = std::chrono::year_month_day;
39
40 ASSERT_NOEXCEPT(year_month_day{std::declval<sys_days>()});
41
42 {
43 constexpr sys_days sd{};
44 constexpr year_month_day ymd{sd};
45
46 static_assert( ymd.ok(), "");
47 static_assert( ymd.year() == year{1970}, "");
48 static_assert( ymd.month() == std::chrono::January, "");
49 static_assert( ymd.day() == day{1}, "");
50 }
51
52 {
53 constexpr sys_days sd{days{10957+32}};
54 constexpr year_month_day ymd{sd};
55
56 static_assert( ymd.ok(), "");
57 static_assert( ymd.year() == year{2000}, "");
58 static_assert( ymd.month() == std::chrono::February, "");
59 static_assert( ymd.day() == day{2}, "");
60 }
61
62
63 // There's one more leap day between 1/1/40 and 1/1/70
64 // when compared to 1/1/70 -> 1/1/2000
65 {
66 constexpr sys_days sd{days{-10957}};
67 constexpr year_month_day ymd{sd};
68
69 static_assert( ymd.ok(), "");
70 static_assert( ymd.year() == year{1940}, "");
71 static_assert( ymd.month() == std::chrono::January, "");
72 static_assert( ymd.day() == day{2}, "");
73 }
74
75 {
76 sys_days sd{days{-(10957+34)}};
77 year_month_day ymd{sd};
78
79 assert( ymd.ok());
80 assert( ymd.year() == year{1939});
81 assert( ymd.month() == std::chrono::November);
82 assert( ymd.day() == day{29});
83 }
84
85 return 0;
86}
87

source code of libcxx/test/std/time/time.cal/time.cal.ymd/time.cal.ymd.members/ctor.sys_days.pass.cpp