#include <chrono>
#include <iostream>

int main() {
    using Clock = std::chrono::steady_clock;
    using std::chrono::duration_cast;
    using std::chrono::milliseconds;
    using std::chrono::microseconds;
    const Clock::time_point start{};
    const auto deadline{start + milliseconds{2000}};
    const auto retry_time{start + milliseconds{1500}};
    const auto kept_left{duration_cast<milliseconds>(deadline - retry_time).count()};
    const auto reset_deadline{retry_time + milliseconds{2000}};
    const auto reset_left{duration_cast<milliseconds>(reset_deadline - retry_time).count()};
    const auto just_before{deadline - microseconds{500}};
    const auto positive_us{duration_cast<microseconds>(deadline - just_before).count()};
    const auto truncated_ms{duration_cast<milliseconds>(deadline - just_before).count()};
    const auto simulated_ready_time{deadline + milliseconds{1}};
    const auto overrun{duration_cast<milliseconds>(simulated_ready_time - deadline).count()};
    std::cout << "model=fixed-time-points\n";
    std::cout << "kept-left-ms=" << kept_left << " reset-left-ms=" << reset_left << '\n';
    std::cout << "positive-us=" << positive_us << " truncated-ms=" << truncated_ms << '\n';
    std::cout << "simulated-ready-overrun-ms=" << overrun << '\n';
    return kept_left == 500 && reset_left == 2000 && positive_us == 500 &&
           truncated_ms == 0 && overrun == 1 ? 0 : 1;
}
