17738db2cSMark de Wever //===----------------------------------------------------------------------===//
27738db2cSMark de Wever //
37738db2cSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47738db2cSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
57738db2cSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67738db2cSMark de Wever //
77738db2cSMark de Wever //===----------------------------------------------------------------------===//
87738db2cSMark de Wever 
97738db2cSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17
10*a7f9895cSLouis Dionne // UNSUPPORTED: no-filesystem
117738db2cSMark de Wever 
127738db2cSMark de Wever // Filesystem is supported on Apple platforms starting with macosx10.15.
137738db2cSMark de Wever // UNSUPPORTED: use_system_cxx_lib && target={{.+}}-apple-macosx10.{{9|10|11|12|13|14}}
147738db2cSMark de Wever 
157738db2cSMark de Wever // <chrono>
167738db2cSMark de Wever //
177738db2cSMark de Wever // file_clock
187738db2cSMark de Wever //
197738db2cSMark de Wever // template<class Duration>
207738db2cSMark de Wever // static sys_time<see-below> to_sys(const file_time<Duration>&);
217738db2cSMark de Wever //
227738db2cSMark de Wever // template<class Duration>
237738db2cSMark de Wever // static file_time<see-below> from_sys(const sys_time<Duration>&);
247738db2cSMark de Wever 
257738db2cSMark de Wever #include <chrono>
267738db2cSMark de Wever #include <cassert>
277738db2cSMark de Wever 
main(int,char **)287738db2cSMark de Wever int main(int, char**) {
297738db2cSMark de Wever   // Test round-trip through the system clock, starting from file_clock::now()
307738db2cSMark de Wever   {
317738db2cSMark de Wever     std::chrono::file_clock::time_point const ft = std::chrono::file_clock::now();
327738db2cSMark de Wever     auto st = std::chrono::file_clock::to_sys(ft);
337738db2cSMark de Wever     assert(ft == std::chrono::file_clock::from_sys(st));
347738db2cSMark de Wever   }
357738db2cSMark de Wever 
367738db2cSMark de Wever   // Test round-trip through the system clock, starting from system_clock::now()
377738db2cSMark de Wever   {
387738db2cSMark de Wever     std::chrono::system_clock::time_point const st = std::chrono::system_clock::now();
397738db2cSMark de Wever     auto ft = std::chrono::file_clock::from_sys(st);
407738db2cSMark de Wever     assert(st == std::chrono::file_clock::to_sys(ft));
417738db2cSMark de Wever   }
427738db2cSMark de Wever 
437738db2cSMark de Wever   // Make sure the value we get is in the ballpark of something reasonable
447738db2cSMark de Wever   {
457738db2cSMark de Wever     std::chrono::file_clock::time_point const file_now = std::chrono::file_clock::now();
467738db2cSMark de Wever     std::chrono::system_clock::time_point const sys_now = std::chrono::system_clock::now();
477738db2cSMark de Wever     {
487738db2cSMark de Wever       auto diff = sys_now - std::chrono::file_clock::to_sys(file_now);
497738db2cSMark de Wever       assert(std::chrono::milliseconds(-500) < diff && diff < std::chrono::milliseconds(500));
507738db2cSMark de Wever     }
517738db2cSMark de Wever     {
527738db2cSMark de Wever       auto diff = std::chrono::file_clock::from_sys(sys_now) - file_now;
537738db2cSMark de Wever       assert(std::chrono::milliseconds(-500) < diff && diff < std::chrono::milliseconds(500));
547738db2cSMark de Wever     }
557738db2cSMark de Wever   }
567738db2cSMark de Wever 
577738db2cSMark de Wever   // Make sure to_sys and from_sys are consistent with each other
587738db2cSMark de Wever   {
597738db2cSMark de Wever     std::chrono::file_clock::time_point const ft = std::chrono::file_clock::now();
607738db2cSMark de Wever     std::chrono::system_clock::time_point const st = std::chrono::system_clock::now();
617738db2cSMark de Wever     auto sys_diff = std::chrono::file_clock::to_sys(ft) - st;
627738db2cSMark de Wever     auto file_diff = ft - std::chrono::file_clock::from_sys(st);
637738db2cSMark de Wever     assert(sys_diff == file_diff);
647738db2cSMark de Wever   }
657738db2cSMark de Wever 
667738db2cSMark de Wever   return 0;
677738db2cSMark de Wever }
68