use playwright_rs::Playwright;
use playwright_rs::protocol::ClockInstallOptions;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Clock API — deterministic time control ===\n");
let playwright = Playwright::launch().await?;
let browser = playwright.chromium().launch().await?;
let page = browser.new_page().await?;
let clock = page.clock().expect("clock should be available");
clock
.install(Some(ClockInstallOptions { time: Some(0) }))
.await?;
page.set_content(
r#"<!DOCTYPE html>
<html>
<body>
<div id="clock"></div>
<script>
function tick() {
document.getElementById('clock').textContent =
new Date().toISOString();
}
tick();
setInterval(tick, 1000);
</script>
</body>
</html>"#,
None,
)
.await?;
println!(">> pause_at(1_700_000_000_000) (2023-11-14T22:13:20Z)");
clock.pause_at(1_700_000_000_000).await?;
let now: String = page.evaluate_value("new Date().toISOString()").await?;
println!(" Date: {}", now);
println!("\n>> fast_forward(60_000) (+60 seconds; setInterval handlers fire)");
clock.fast_forward(60_000).await?;
let now: String = page.evaluate_value("new Date().toISOString()").await?;
println!(" Date: {}", now);
let displayed = page
.locator("#clock")
.await
.text_content()
.await?
.unwrap_or_default();
println!(" #clock: {}", displayed);
println!("\n>> set_fixed_time(0) (Date.now() returns 0 but timers still tick)");
clock.set_fixed_time(0).await?;
let frozen: String = page.evaluate_value("Date.now().toString()").await?;
println!(" Date.now() = {}", frozen);
println!("\n>> resume()");
clock.resume().await?;
browser.close().await?;
Ok(())
}