#![allow(missing_docs)]
use assert_cmd::Command;
use predicates::prelude::*;
use std::fs;
use std::path::PathBuf;
use tempfile::TempDir;
fn ruchy_cmd() -> Command {
assert_cmd::cargo::cargo_bin_cmd!("ruchy")
}
fn write_temp_file(code: &str) -> (TempDir, PathBuf) {
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let file_path = temp_dir.path().join("test.ruchy");
fs::write(&file_path, code).expect("Failed to write temp file");
(temp_dir, file_path)
}
#[test]
fn test_stdlib_003_basic_now_millis() {
let code = r#"
let timestamp = std::time::now_millis()
println("Timestamp: {}", timestamp)
"#;
let (_temp_dir, file_path) = write_temp_file(code);
ruchy_cmd()
.arg("run")
.arg(file_path)
.assert()
.success()
.stdout(predicate::str::contains("Timestamp:"));
}
#[test]
fn test_stdlib_003_timestamp_reasonable() {
let code = r#"
let timestamp = std::time::now_millis()
let jan_2023 = 1672531200000 # Jan 1, 2023 in ms
if timestamp > jan_2023 {
println("✓ Timestamp is reasonable")
} else {
println("✗ Timestamp too old: {}", timestamp)
}
"#;
let (_temp_dir, file_path) = write_temp_file(code);
ruchy_cmd()
.arg("run")
.arg(file_path)
.assert()
.success()
.stdout(predicate::str::contains("✓ Timestamp is reasonable"));
}
#[test]
fn test_stdlib_003_elapsed_time() {
let code = r#"
let start = std::time::now_millis()
let end = std::time::now_millis()
let elapsed = end - start
println("Elapsed: {} ms", elapsed)
"#;
let (_temp_dir, file_path) = write_temp_file(code);
ruchy_cmd()
.arg("run")
.arg(file_path)
.assert()
.success()
.stdout(predicate::str::contains("Elapsed:"));
}
#[test]
fn test_stdlib_003_benchmark_pattern() {
let code = r#"
fun benchmark_operation() -> i64 {
let start = std::time::now_millis()
# Simulated work
let result = 42 + 42
let end = std::time::now_millis()
end - start
}
let duration = benchmark_operation()
println("Duration: {} ms", duration)
"#;
let (_temp_dir, file_path) = write_temp_file(code);
ruchy_cmd()
.arg("run")
.arg(file_path)
.assert()
.success()
.stdout(predicate::str::contains("Duration:"));
}
#[test]
fn test_stdlib_003_transpile() {
let code = r#"
let timestamp = std::time::now_millis()
println("Time: {}", timestamp)
"#;
let (_temp_dir, file_path) = write_temp_file(code);
ruchy_cmd()
.arg("transpile")
.arg(file_path)
.assert()
.success()
.stdout(predicate::str::contains("SystemTime"))
.stdout(predicate::str::contains("duration_since"));
}
#[test]
fn test_stdlib_003_check() {
let code = r"
let timestamp = std::time::now_millis()
";
let (_temp_dir, file_path) = write_temp_file(code);
ruchy_cmd().arg("check").arg(file_path).assert().success();
}
#[test]
fn test_stdlib_003_lint() {
let code = r"
let timestamp = std::time::now_millis()
";
let (_temp_dir, file_path) = write_temp_file(code);
ruchy_cmd().arg("lint").arg(file_path).assert().success();
}
#[test]
fn test_stdlib_003_ast() {
let code = r"
std::time::now_millis()
";
let (_temp_dir, file_path) = write_temp_file(code);
ruchy_cmd()
.arg("ast")
.arg(file_path)
.assert()
.success()
.stdout(predicate::str::contains("Call"))
.stdout(predicate::str::contains("time"));
}
#[test]
fn test_stdlib_003_time_advances() {
let code = r#"
let t1 = std::time::now_millis()
let t2 = std::time::now_millis()
if t2 >= t1 {
println("✓ Time advances")
} else {
println("✗ Time went backwards!")
}
"#;
let (_temp_dir, file_path) = write_temp_file(code);
ruchy_cmd()
.arg("run")
.arg(file_path)
.assert()
.success()
.stdout(predicate::str::contains("✓ Time advances"));
}
#[test]
fn test_stdlib_003_compile() {
let code = r#"
let timestamp = std::time::now_millis()
println("Compiled at: {}", timestamp)
"#;
let (_temp_dir, file_path) = write_temp_file(code);
ruchy_cmd().arg("compile").arg(file_path).assert().success();
}