//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11 // // typedef TrivialClock file_time_type; // RUN: %build -I%libcxx_src_root/src/filesystem // RUN: %run #include #include #include #include #include #include #include "filesystem_common.h" #ifndef __SIZEOF_INT128__ #define TEST_HAS_NO_INT128_T #endif using namespace std::chrono; namespace fs = std::__fs::filesystem; using fs::file_time_type; using fs::detail::time_util; #ifdef TEST_HAS_NO_INT128_T static_assert(sizeof(fs::file_time_type::rep) <= 8, ""); #endif enum TestKind { TK_128Bit, TK_64Bit, TK_32Bit, TK_FloatingPoint }; template constexpr TestKind getTimeTTestKind() { if (sizeof(TimeT) == 8 && !std::is_floating_point::value) return TK_64Bit; else if (sizeof(TimeT) == 4 && !std::is_floating_point::value) return TK_32Bit; else if (std::is_floating_point::value) return TK_FloatingPoint; else assert(false && "test kind not supported"); } template constexpr TestKind getFileTimeTestKind() { using Rep = typename FileTimeT::rep; if (std::is_floating_point::value) return TK_FloatingPoint; else if (sizeof(Rep) == 16) return TK_128Bit; else if (sizeof(Rep) == 8) return TK_64Bit; else assert(false && "test kind not supported"); } template , TestKind = getTimeTTestKind(), TestKind = getFileTimeTestKind()> struct test_case; template struct test_case : public Base { using Base::convert_from_timespec; using Base::convert_to_timespec; using Base::is_representable; using Base::max_nsec; using Base::max_seconds; using Base::min_nsec_timespec; using Base::min_seconds; static constexpr auto max_time_t = std::numeric_limits::max(); static constexpr auto min_time_t = std::numeric_limits::min(); static constexpr bool test_timespec() { static_assert(is_representable(TimeSpecT{max_time_t, 0}), ""); static_assert(is_representable(TimeSpecT{max_time_t, 999999999}), ""); static_assert(is_representable(TimeSpecT{max_time_t, 1000000000}), ""); static_assert(is_representable(TimeSpecT{max_time_t, max_nsec}), ""); static_assert(is_representable(TimeSpecT{min_time_t, 0}), ""); static_assert(is_representable(TimeSpecT{min_time_t, 999999999}), ""); static_assert(is_representable(TimeSpecT{min_time_t, 1000000000}), ""); static_assert(is_representable(TimeSpecT{min_time_t, min_nsec_timespec}), ""); return true; } static constexpr bool test_file_time_type() { // This kinda sucks. Oh well. static_assert(!Base::is_representable(FileTimeT::max()), ""); static_assert(!Base::is_representable(FileTimeT::min()), ""); return true; } static constexpr bool check_round_trip(TimeSpecT orig) { TimeSpecT new_ts = {}; FileTimeT out = convert_from_timespec(orig); assert(convert_to_timespec(new_ts, out)); return new_ts.tv_sec == orig.tv_sec && new_ts.tv_nsec == orig.tv_nsec; } static constexpr bool test_convert_timespec() { static_assert(check_round_trip({0, 0}), ""); static_assert(check_round_trip({0, 1}), ""); static_assert(check_round_trip({1, 1}), ""); static_assert(check_round_trip({-1, 1}), ""); static_assert(check_round_trip({max_time_t, max_nsec}), ""); static_assert(check_round_trip({max_time_t, 123}), ""); static_assert(check_round_trip({min_time_t, min_nsec_timespec}), ""); static_assert(check_round_trip({min_time_t, 123}), ""); return true; } static bool test() { static_assert(test_timespec(), ""); static_assert(test_file_time_type(), ""); static_assert(test_convert_timespec(), ""); return true; } }; template struct test_case : public test_case { }; template struct test_case : public Base { using Base::convert_from_timespec; using Base::is_representable; using Base::max_nsec; using Base::max_seconds; using Base::min_nsec_timespec; using Base::min_seconds; static constexpr auto max_time_t = std::numeric_limits::max(); static constexpr auto min_time_t = std::numeric_limits::min(); static constexpr bool test_timespec() { static_assert(is_representable(TimeSpecT{max_seconds, max_nsec}), ""); static_assert(!is_representable(TimeSpecT{max_seconds + 1, 0}), ""); static_assert(!is_representable(TimeSpecT{max_seconds, max_nsec + 1}), ""); static_assert(!is_representable(TimeSpecT{max_time_t, 0}), ""); static_assert(is_representable(TimeSpecT{min_seconds, 0}), ""); static_assert( is_representable(TimeSpecT{min_seconds - 1, min_nsec_timespec}), ""); static_assert( is_representable(TimeSpecT{min_seconds - 1, min_nsec_timespec + 1}), ""); static_assert( !is_representable(TimeSpecT{min_seconds - 1, min_nsec_timespec - 1}), ""); static_assert(!is_representable(TimeSpecT{min_time_t, 999999999}), ""); return true; } static constexpr bool test_file_time_type() { static_assert(Base::is_representable(FileTimeT::max()), ""); static_assert(Base::is_representable(FileTimeT::min()), ""); return true; } static constexpr bool test_convert_timespec() { static_assert(convert_from_timespec(TimeSpecT{max_seconds, max_nsec}) == FileTimeT::max(), ""); static_assert(convert_from_timespec(TimeSpecT{max_seconds, max_nsec - 1}) < FileTimeT::max(), ""); static_assert(convert_from_timespec(TimeSpecT{max_seconds - 1, 999999999}) < FileTimeT::max(), ""); static_assert(convert_from_timespec(TimeSpecT{ min_seconds - 1, min_nsec_timespec}) == FileTimeT::min(), ""); static_assert(convert_from_timespec( TimeSpecT{min_seconds - 1, min_nsec_timespec + 1}) > FileTimeT::min(), ""); static_assert(convert_from_timespec(TimeSpecT{min_seconds, 0}) > FileTimeT::min(), ""); return true; } static bool test() { static_assert(test_timespec(), ""); static_assert(test_file_time_type(), ""); static_assert(test_convert_timespec(), ""); return true; } }; template struct test_case : public Base { static constexpr auto max_time_t = std::numeric_limits::max(); static constexpr auto min_time_t = std::numeric_limits::min(); using Base::convert_from_timespec; using Base::is_representable; using Base::max_nsec; using Base::max_seconds; using Base::min_nsec_timespec; using Base::min_seconds; static constexpr bool test_timespec() { static_assert(is_representable(TimeSpecT{max_time_t, 999999999}), ""); static_assert(is_representable(TimeSpecT{max_time_t, 1000000000}), ""); static_assert(is_representable(TimeSpecT{min_time_t, 0}), ""); return true; } static constexpr bool test_file_time_type() { static_assert(!is_representable(FileTimeT::max()), ""); static_assert(!is_representable(FileTimeT::min()), ""); static_assert(is_representable(FileTimeT(seconds(max_time_t))), ""); static_assert(is_representable(FileTimeT(seconds(min_time_t))), ""); return true; } static constexpr bool test_convert_timespec() { // FIXME add tests for 32 bit builds return true; } static bool test() { static_assert(test_timespec(), ""); static_assert(test_file_time_type(), ""); static_assert(test_convert_timespec(), ""); return true; } }; template struct test_case : public Base { static bool test() { return true; } }; template struct TestTimeSpec { TimeT tv_sec; NSecT tv_nsec; }; template struct TestClock { typedef Dur duration; typedef typename duration::rep rep; typedef typename duration::period period; typedef std::chrono::time_point time_point; static constexpr const bool is_steady = false; static time_point now() noexcept { return {}; } }; template using TestFileTimeT = time_point > >; int main() { { assert((test_case::test())); } { assert((test_case, int64_t, TestTimeSpec >::test())); } { assert((test_case, int32_t, TestTimeSpec >::test())); } { // Test that insane platforms like ppc64 linux, which use long double as time_t, // at least compile. assert((test_case, double, TestTimeSpec >::test())); } #ifndef TEST_HAS_NO_INT128_T { assert((test_case, int64_t, TestTimeSpec >::test())); } { assert((test_case, int32_t, TestTimeSpec >::test())); } #endif }