xref: /llvm-project/libcxx/test/std/time/time.zone/time.zone.leap/members/value.pass.cpp (revision 2e43a304f10fd801f068d0f9831f01f2c5b0b2e2)
16f2d8cc0SMark de Wever //===----------------------------------------------------------------------===//
26f2d8cc0SMark de Wever //
36f2d8cc0SMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46f2d8cc0SMark de Wever // See https://llvm.org/LICENSE.txt for license information.
56f2d8cc0SMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66f2d8cc0SMark de Wever //
76f2d8cc0SMark de Wever //===----------------------------------------------------------------------===//
86f2d8cc0SMark de Wever 
96f2d8cc0SMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17
106f2d8cc0SMark de Wever // UNSUPPORTED: no-filesystem, no-localization, no-tzdb
116f2d8cc0SMark de Wever 
12a4422a51SMark de Wever // XFAIL: libcpp-has-no-experimental-tzdb
136f2d8cc0SMark de Wever // XFAIL: availability-tzdb-missing
146f2d8cc0SMark de Wever 
156f2d8cc0SMark de Wever // <chrono>
166f2d8cc0SMark de Wever 
176f2d8cc0SMark de Wever // class leap_second;
186f2d8cc0SMark de Wever 
196f2d8cc0SMark de Wever // constexpr seconds value() const noexcept;
206f2d8cc0SMark de Wever 
216f2d8cc0SMark de Wever #include <cassert>
226f2d8cc0SMark de Wever #include <chrono>
23*2e43a304SNikolas Klauser #include <concepts>
246f2d8cc0SMark de Wever 
256f2d8cc0SMark de Wever #include "test_macros.h"
266f2d8cc0SMark de Wever 
276f2d8cc0SMark de Wever #include "test_chrono_leap_second.h"
286f2d8cc0SMark de Wever 
296f2d8cc0SMark de Wever constexpr void test(const std::chrono::leap_second leap_second, std::chrono::seconds expected) {
306f2d8cc0SMark de Wever   std::same_as<std::chrono::seconds> auto value = leap_second.value();
316f2d8cc0SMark de Wever   assert(value == expected);
326f2d8cc0SMark de Wever   static_assert(noexcept(leap_second.value()));
336f2d8cc0SMark de Wever }
346f2d8cc0SMark de Wever 
356f2d8cc0SMark de Wever constexpr bool test() {
366f2d8cc0SMark de Wever   test(test_leap_second_create(std::chrono::sys_seconds{std::chrono::seconds{0}}, std::chrono::seconds{1}),
376f2d8cc0SMark de Wever        std::chrono::seconds{1});
386f2d8cc0SMark de Wever 
396f2d8cc0SMark de Wever   return true;
406f2d8cc0SMark de Wever }
416f2d8cc0SMark de Wever 
426f2d8cc0SMark de Wever int main(int, const char**) {
436f2d8cc0SMark de Wever   test();
446f2d8cc0SMark de Wever   static_assert(test());
456f2d8cc0SMark de Wever 
466f2d8cc0SMark de Wever   // test with the real tzdb
476f2d8cc0SMark de Wever   const std::chrono::tzdb& tzdb = std::chrono::get_tzdb();
486f2d8cc0SMark de Wever   assert(!tzdb.leap_seconds.empty());
496f2d8cc0SMark de Wever   test(tzdb.leap_seconds[0], tzdb.leap_seconds[0].value());
506f2d8cc0SMark de Wever 
516f2d8cc0SMark de Wever   return 0;
526f2d8cc0SMark de Wever }
53