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& operator+=(const months& m) noexcept;
14// constexpr year_month_day& operator-=(const months& m) noexcept;
15
16#include <chrono>
17#include <cassert>
18#include <type_traits>
19#include <utility>
20
21#include "test_macros.h"
22
23using year = std::chrono::year;
24using month = std::chrono::month;
25using day = std::chrono::day;
26using year_month_day = std::chrono::year_month_day;
27using months = std::chrono::months;
28
29constexpr bool test() {
30 for (unsigned i = 0; i <= 10; ++i) {
31 year y{1234};
32 day d{23};
33 year_month_day ymd(y, month{i}, d);
34
35 ymd += months{2};
36 assert(ymd.year() == y);
37 assert(ymd.day() == d);
38 assert(static_cast<unsigned>((ymd).month()) == i + 2);
39
40 ymd -= months{1};
41 assert(ymd.year() == y);
42 assert(ymd.day() == d);
43 assert(static_cast<unsigned>((ymd).month()) == i + 1);
44 }
45
46 { // Validate the ok status when the day is not present in the new month.
47 year_month_day ymd{year{2020}, month{3}, day{31}};
48 ymd += months{1};
49 assert((ymd == year_month_day{year{2020}, month{4}, day{31}}));
50 assert(!ymd.ok());
51
52 ymd -= months{1};
53 assert((ymd == year_month_day{year{2020}, month{3}, day{31}}));
54 assert(ymd.ok());
55 }
56
57 { // Validate the ok status when the day becomes present in the new month.
58 year_month_day ymd{year{2020}, month{4}, day{31}};
59 assert(!ymd.ok());
60
61 ymd += months{1};
62 assert((ymd == year_month_day{year{2020}, month{5}, day{31}}));
63 assert(ymd.ok());
64
65 ymd -= months{2};
66 assert((ymd == year_month_day{year{2020}, month{3}, day{31}}));
67 assert(ymd.ok());
68 }
69
70 { // Test year wrapping
71 year_month_day ymd{year{2020}, month{4}, day{31}};
72
73 ymd += months{12};
74 assert((ymd == year_month_day{year{2021}, month{4}, day{31}}));
75
76 ymd -= months{12};
77 assert((ymd == year_month_day{year{2020}, month{4}, day{31}}));
78 }
79
80 return true;
81}
82
83int main(int, char**) {
84 ASSERT_NOEXCEPT(std::declval<year_month_day&>() += std::declval<months>());
85 ASSERT_NOEXCEPT(std::declval<year_month_day&>() -= std::declval<months>());
86
87 ASSERT_SAME_TYPE(year_month_day&, decltype(std::declval<year_month_day&>() += std::declval<months>()));
88 ASSERT_SAME_TYPE(year_month_day&, decltype(std::declval<year_month_day&>() -= std::declval<months>()));
89
90 test();
91 static_assert(test());
92
93 return 0;
94}
95

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