libcxx

libcxx mirror with random patches
git clone https://git.neptards.moe/neptards/libcxx.git
Log | Files | Refs

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 }