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 Weverint 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