use predicates::prelude::*;
#[test]
fn test_default_param_single_missing_arg() {
assert_cmd::cargo::cargo_bin_cmd!("ruchy")
.arg("-e")
.arg(r#"fn greet(name, title = "Mr.") { println(f"{title} {name}") }; greet("Smith")"#)
.assert()
.success()
.stdout(predicate::str::contains("Mr. Smith"));
}
#[test]
fn test_default_param_all_args_provided() {
assert_cmd::cargo::cargo_bin_cmd!("ruchy")
.arg("-e")
.arg(r#"fn greet(name, title = "Mr.") { println(f"{title} {name}") }; greet("Johnson", "Dr.")"#)
.assert()
.success()
.stdout(predicate::str::contains("Dr. Johnson"));
}
#[test]
fn test_default_param_multiple_defaults() {
assert_cmd::cargo::cargo_bin_cmd!("ruchy")
.arg("-e")
.arg(r#"fn format_name(first, middle = "", last = "Doe") { if middle == "" { println(f"{first} {last}") } else { println(f"{first} {middle} {last}") } }; format_name("John")"#)
.assert()
.success()
.stdout(predicate::str::contains("John Doe"));
}
#[test]
fn test_default_param_mixed_required_and_default() {
assert_cmd::cargo::cargo_bin_cmd!("ruchy")
.arg("-e")
.arg(r#"fn connect(host, port = 8080) { println(f"{host}:{port}") }; connect("localhost")"#)
.assert()
.success()
.stdout(predicate::str::contains("localhost:8080"));
}
#[test]
fn test_default_param_expression_not_just_literal() {
assert_cmd::cargo::cargo_bin_cmd!("ruchy")
.arg("-e")
.arg(r"fn multiply(x, factor = 2 + 3) { println(x * factor) }; multiply(10)")
.assert()
.success()
.stdout(predicate::str::contains("50"));
}
#[test]
fn test_default_param_zero_arguments() {
assert_cmd::cargo::cargo_bin_cmd!("ruchy")
.arg("-e")
.arg(r#"fn get_config(host = "localhost", port = 8080) { println(f"{host}:{port}") }; get_config()"#)
.assert()
.success()
.stdout(predicate::str::contains("localhost:8080"));
}
#[test]
fn test_default_param_too_many_args_still_error() {
assert_cmd::cargo::cargo_bin_cmd!("ruchy")
.arg("-e")
.arg(r#"fn greet(name, title = "Mr.") { println(f"{title} {name}") }; greet("Smith", "Dr.", "Extra")"#)
.assert()
.failure() .stderr(predicate::str::contains("arguments"));
}
#[test]
fn test_default_param_examples_02_functions() {
assert_cmd::cargo::cargo_bin_cmd!("ruchy")
.arg("run")
.arg("examples/02_functions.ruchy")
.assert()
.success()
.stdout(predicate::str::contains("Hello, Mr. Smith!"))
.stdout(predicate::str::contains("Hello, Dr. Johnson!"));
}