#![allow(missing_docs)]
use predicates::prelude::*;
#[test]
fn test_debugger_014_phase_2_trace_single_argument() {
let code = r#"
fun square(x) {
return x * x;
}
fun main() {
let result = square(5);
println("Result: {}", result);
}
"#;
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: → square(5: integer)"))
.stdout(predicate::str::contains("TRACE: ← square = 25: integer"));
}
#[test]
fn test_debugger_014_phase_2_trace_multiple_arguments() {
let code = r#"
fun add(a, b) {
return a + b;
}
fun main() {
let result = add(10, 20);
println("Result: {}", result);
}
"#;
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: → add(10: integer, 20: integer)",
))
.stdout(predicate::str::contains("TRACE: ← add = 30: integer"));
}
#[test]
fn test_debugger_014_phase_2_trace_recursive_arguments() {
let code = r#"
fun factorial(n) {
if n <= 1 {
return 1;
}
return n * factorial(n - 1);
}
fun main() {
let result = factorial(3);
println("Result: {}", result);
}
"#;
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: → factorial(3: integer)"))
.stdout(predicate::str::contains("TRACE: → factorial(2: integer)"))
.stdout(predicate::str::contains("TRACE: → factorial(1: integer)"))
.stdout(predicate::str::contains("TRACE: ← factorial = 1: integer"))
.stdout(predicate::str::contains("TRACE: ← factorial = 2: integer"))
.stdout(predicate::str::contains("TRACE: ← factorial = 6: integer"));
}
#[test]
fn test_debugger_014_phase_2_trace_string_arguments() {
let code = r#"
fun greet(name) {
return "Hello, " + name;
}
fun main() {
let msg = greet("Alice");
println("{}", msg);
}
"#;
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: → greet(\"Alice\": string)",
))
.stdout(predicate::str::contains(
"TRACE: ← greet = \"Hello, Alice\": string",
));
}
#[test]
fn test_debugger_014_phase_2_trace_no_arguments() {
let code = r#"
fun get_answer() {
return 42;
}
fun main() {
let answer = get_answer();
println("Answer: {}", answer);
}
"#;
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: → get_answer()"))
.stdout(predicate::str::contains("TRACE: ← get_answer = 42"));
}
#[test]
fn test_debugger_014_phase_2_backward_compatible() {
let code = r"
fun test_func() {
return 42;
}
fun main() {
test_func();
}
";
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: → test_func"))
.stdout(predicate::str::contains("TRACE: ← test_func"));
}