year_month_day.pass.cpp (7100B)
1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 10 11 // <chrono> 12 // class year_month_day; 13 14 // constexpr year_month_day 15 // operator/(const year_month& ym, const day& d) noexcept; 16 // Returns: {ym.year(), ym.month(), d}. 17 // 18 // constexpr year_month_day 19 // operator/(const year_month& ym, int d) noexcept; 20 // Returns: ym / day(d). 21 // 22 // constexpr year_month_day 23 // operator/(const year& y, const month_day& md) noexcept; 24 // Returns: y / md.month() / md.day(). 25 // 26 // constexpr year_month_day 27 // operator/(int y, const month_day& md) noexcept; 28 // Returns: year(y) / md. 29 // 30 // constexpr year_month_day 31 // operator/(const month_day& md, const year& y) noexcept; 32 // Returns: y / md. 33 // 34 // constexpr year_month_day 35 // operator/(const month_day& md, int y) noexcept; 36 // Returns: year(y) / md. 37 38 39 #include <chrono> 40 #include <type_traits> 41 #include <cassert> 42 43 #include "test_macros.h" 44 #include "test_comparisons.h" 45 46 int main() 47 { 48 using year = std::chrono::year; 49 using month = std::chrono::month; 50 using day = std::chrono::day; 51 using year_month = std::chrono::year_month; 52 using month_day = std::chrono::month_day; 53 using year_month_day = std::chrono::year_month_day; 54 55 constexpr month February = std::chrono::February; 56 constexpr year_month Feb2018{year{2018}, February}; 57 58 { // operator/(const year_month& ym, const day& d) 59 ASSERT_NOEXCEPT ( Feb2018/day{2}); 60 ASSERT_SAME_TYPE(year_month_day, decltype(Feb2018/day{2})); 61 62 static_assert((Feb2018/day{2}).month() == February, ""); 63 static_assert((Feb2018/day{2}).day() == day{2}, ""); 64 65 for (int i = 1000; i < 1010; ++i) 66 for (int j = 1; j <= 12; ++j) 67 for (unsigned k = 0; k <= 28; ++k) 68 { 69 year y(i); 70 month m(j); 71 day d(k); 72 year_month ym(y, m); 73 year_month_day ymd = ym/d; 74 assert(ymd.year() == y); 75 assert(ymd.month() == m); 76 assert(ymd.day() == d); 77 } 78 } 79 80 81 { // operator/(const year_month& ym, int d) 82 ASSERT_NOEXCEPT ( Feb2018/2); 83 ASSERT_SAME_TYPE(year_month_day, decltype(Feb2018/2)); 84 85 static_assert((Feb2018/2).month() == February, ""); 86 static_assert((Feb2018/2).day() == day{2}, ""); 87 88 for (int i = 1000; i < 1010; ++i) 89 for (int j = 1; j <= 12; ++j) 90 for (unsigned k = 0; k <= 28; ++k) 91 { 92 year y(i); 93 month m(j); 94 day d(k); 95 year_month ym(y, m); 96 year_month_day ymd = ym/k; 97 assert(ymd.year() == y); 98 assert(ymd.month() == m); 99 assert(ymd.day() == d); 100 } 101 } 102 103 104 { // operator/(const year_month& ym, int d) 105 ASSERT_NOEXCEPT ( Feb2018/2); 106 ASSERT_SAME_TYPE(year_month_day, decltype(Feb2018/2)); 107 108 static_assert((Feb2018/2).month() == February, ""); 109 static_assert((Feb2018/2).day() == day{2}, ""); 110 111 for (int i = 1000; i < 1010; ++i) 112 for (int j = 1; j <= 12; ++j) 113 for (unsigned k = 0; k <= 28; ++k) 114 { 115 year y(i); 116 month m(j); 117 day d(k); 118 year_month ym(y, m); 119 year_month_day ymd = ym/k; 120 assert(ymd.year() == y); 121 assert(ymd.month() == m); 122 assert(ymd.day() == d); 123 } 124 } 125 126 127 128 129 { // operator/(const year& y, const month_day& md) (and switched) 130 ASSERT_NOEXCEPT ( year{2018}/month_day{February, day{2}}); 131 ASSERT_SAME_TYPE(year_month_day, decltype(year{2018}/month_day{February, day{2}})); 132 ASSERT_NOEXCEPT ( month_day{February, day{2}}/year{2018}); 133 ASSERT_SAME_TYPE(year_month_day, decltype(month_day{February, day{2}}/year{2018})); 134 135 static_assert((year{2018}/month_day{February, day{2}}).month() == February, "" ); 136 static_assert((year{2018}/month_day{February, day{2}}).day() == day{2}, "" ); 137 static_assert((month_day{February, day{2}}/year{2018}).month() == February, "" ); 138 static_assert((month_day{February, day{2}}/year{2018}).day() == day{2}, "" ); 139 140 for (int i = 1000; i < 1010; ++i) 141 for (int j = 1; j <= 12; ++j) 142 for (unsigned k = 0; k <= 28; ++k) 143 { 144 year y(i); 145 month m(j); 146 day d(k); 147 month_day md(m, d); 148 year_month_day ymd1 = y/md; 149 year_month_day ymd2 = md/y; 150 assert(ymd1.year() == y); 151 assert(ymd2.year() == y); 152 assert(ymd1.month() == m); 153 assert(ymd2.month() == m); 154 assert(ymd1.day() == d); 155 assert(ymd2.day() == d); 156 assert(ymd1 == ymd2); 157 } 158 } 159 160 { // operator/(const month_day& md, int y) (and switched) 161 ASSERT_NOEXCEPT ( 2018/month_day{February, day{2}}); 162 ASSERT_SAME_TYPE(year_month_day, decltype(2018/month_day{February, day{2}})); 163 ASSERT_NOEXCEPT ( month_day{February, day{2}}/2018); 164 ASSERT_SAME_TYPE(year_month_day, decltype(month_day{February, day{2}}/2018)); 165 166 static_assert((2018/month_day{February, day{2}}).month() == February, "" ); 167 static_assert((2018/month_day{February, day{2}}).day() == day{2}, "" ); 168 static_assert((month_day{February, day{2}}/2018).month() == February, "" ); 169 static_assert((month_day{February, day{2}}/2018).day() == day{2}, "" ); 170 171 for (int i = 1000; i < 1010; ++i) 172 for (int j = 1; j <= 12; ++j) 173 for (unsigned k = 0; k <= 28; ++k) 174 { 175 year y(i); 176 month m(j); 177 day d(k); 178 month_day md(m, d); 179 year_month_day ymd1 = i/md; 180 year_month_day ymd2 = md/i; 181 assert(ymd1.year() == y); 182 assert(ymd2.year() == y); 183 assert(ymd1.month() == m); 184 assert(ymd2.month() == m); 185 assert(ymd1.day() == d); 186 assert(ymd2.day() == d); 187 assert(ymd1 == ymd2); 188 } 189 } 190 191 }