libcxx

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

ctor.sys_days.pass.cpp (2681B)


      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(const sys_days& dp) noexcept;
     15 //
     16 //  Effects:  Constructs an object of type year_month_day that corresponds 
     17 //                to the date represented by dp.
     18 //
     19 //  Remarks: For any value ymd of type year_month_day for which ymd.ok() is true,
     20 //                ymd == year_month_day{sys_days{ymd}} is true.
     21 //
     22 //  constexpr chrono::year   year() const noexcept;
     23 //  constexpr chrono::month month() const noexcept;
     24 //  constexpr bool             ok() const noexcept;
     25 
     26 #include <chrono>
     27 #include <type_traits>
     28 #include <cassert>
     29 
     30 #include "test_macros.h"
     31 
     32 int main()
     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 }