#![allow(missing_docs)]
use predicates::prelude::*;
#[test]
fn test_debugger_014_phase_1_4_trace_shows_depth() {
let code = r#"
fun inner() {
return 42;
}
fun middle() {
return inner();
}
fun outer() {
return middle();
}
fun main() {
println("Result: {}", outer());
}
"#;
let output = assert_cmd::cargo::cargo_bin_cmd!("ruchy")
.arg("--trace")
.arg("-e")
.arg(code)
.timeout(std::time::Duration::from_secs(5))
.assert()
.success();
let stdout = String::from_utf8(output.get_output().stdout.clone()).unwrap();
assert!(stdout.contains("TRACE:"), "Should have trace output");
assert!(stdout.contains("outer"), "Should trace outer function");
assert!(stdout.contains("middle"), "Should trace middle function");
assert!(stdout.contains("inner"), "Should trace inner function");
}
#[test]
fn test_debugger_014_phase_1_4_trace_includes_main() {
let code = r#"
fun helper() {
return 10;
}
fun main() {
let x = helper();
println("Value: {}", x);
}
"#;
assert_cmd::cargo::cargo_bin_cmd!("ruchy")
.arg("--trace")
.arg("-e")
.arg(code)
.timeout(std::time::Duration::from_secs(5))
.assert()
.success()
.stdout(predicate::str::contains("TRACE:"))
.stdout(predicate::str::contains("main"))
.stdout(predicate::str::contains("helper"));
}
#[test]
#[ignore = "Phase 1.4 enhancement - trace to stderr"]
fn test_debugger_014_phase_1_4_trace_to_stderr() {
let code = r#"
fun test_func() {
return 42;
}
fun main() {
println("Result: {}", test_func());
}
"#;
let output = assert_cmd::cargo::cargo_bin_cmd!("ruchy")
.arg("--trace")
.arg("-e")
.arg(code)
.timeout(std::time::Duration::from_secs(5))
.output()
.unwrap();
let stdout = String::from_utf8(output.stdout).unwrap();
let stderr = String::from_utf8(output.stderr).unwrap();
assert!(
stdout.contains("Result:"),
"Program output should be on stdout"
);
assert!(
stderr.contains("TRACE:"),
"Trace output should be on stderr"
);
assert!(
stderr.contains("test_func"),
"Should trace function on stderr"
);
}