aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite/std/time/weekday/2.cc
blob: 924709321e5d7fc54e09ee96258192c3e4524b51 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// { dg-do run { target c++20 } }

// Class weekday [time.cal.wd]

#include <chrono>
#include <limits>
#include <testsuite_hooks.h>

using namespace std::chrono;

void test_extreme_values(days extreme)
{
  auto const count = extreme.count();
  auto const safe  = count < 0 ? count + 7 : count;
  auto const mod   = safe - 7 * ((safe < 0 ? safe - 6 : safe) / 7);

  for (unsigned d = 0; d < 254; ++d)
  {
    auto const weekday_plus_extreme = weekday{d} + extreme;
    VERIFY(weekday_plus_extreme.c_encoding()  == (d + mod) % 7);

    auto const weekday_minus_extreme = weekday{d} - extreme;
    VERIFY(weekday_minus_extreme.c_encoding() == (d + 7 - mod) % 7);
  }
}

int main()
{
  test_extreme_values(days{std::numeric_limits<days::rep>::max()});
  test_extreme_values(days{std::numeric_limits<days::rep>::min()});
  return 0;
}