#![allow(missing_docs)]
use assert_cmd::Command;
use predicates::prelude::*;
use std::path::PathBuf;
fn ruchy_cmd() -> Command {
assert_cmd::cargo::cargo_bin_cmd!("ruchy")
}
fn example_path(name: &str) -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("examples")
.join("cli")
.join(name)
}
#[test]
fn test_01_hello_world_direct() {
ruchy_cmd()
.arg(example_path("01_hello_world.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("Hello, World!"));
}
#[test]
fn test_01_hello_world_run() {
ruchy_cmd()
.arg("run")
.arg(example_path("01_hello_world.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("Hello, World!"));
}
#[test]
fn test_01_hello_world_eval() {
let code = std::fs::read_to_string(example_path("01_hello_world.ruchy"))
.expect("Failed to read example file");
ruchy_cmd()
.arg("-e")
.arg(&code)
.assert()
.success()
.stdout(predicate::str::contains("Hello, World!"));
}
#[test]
fn test_01_hello_world_compile() {
let output_binary = std::env::temp_dir().join("hello_world_test");
ruchy_cmd()
.arg("compile")
.arg(example_path("01_hello_world.ruchy"))
.arg("--output")
.arg(&output_binary)
.assert()
.success();
let _ = std::fs::remove_file(&output_binary);
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output. Example outputs 'Addition: 10 + 5 = 15', test expects 'Sum: 30'"]
fn test_02_simple_math_direct() {
ruchy_cmd()
.arg(example_path("02_simple_math.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("Sum: 30"))
.stdout(predicate::str::contains("Product: 200"));
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_02_simple_math_run() {
ruchy_cmd()
.arg("run")
.arg(example_path("02_simple_math.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("Sum: 30"));
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_02_simple_math_eval() {
let code = std::fs::read_to_string(example_path("02_simple_math.ruchy"))
.expect("Failed to read example file");
ruchy_cmd()
.arg("-e")
.arg(&code)
.assert()
.success()
.stdout(predicate::str::contains("Sum: 30"));
}
#[test]
fn test_02_simple_math_compile() {
let output_binary = std::env::temp_dir().join("simple_math_test");
ruchy_cmd()
.arg("compile")
.arg(example_path("02_simple_math.ruchy"))
.arg("--output")
.arg(&output_binary)
.assert()
.success();
let _ = std::fs::remove_file(&output_binary);
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_03_variables_direct() {
ruchy_cmd()
.arg(example_path("03_variables.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("Language: Ruchy"))
.stdout(predicate::str::contains("Version: 3.8"));
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_03_variables_run() {
ruchy_cmd()
.arg("run")
.arg(example_path("03_variables.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("Language: Ruchy"));
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_03_variables_eval() {
let code = std::fs::read_to_string(example_path("03_variables.ruchy"))
.expect("Failed to read example file");
ruchy_cmd()
.arg("-e")
.arg(&code)
.assert()
.success()
.stdout(predicate::str::contains("Language: Ruchy"));
}
#[test]
fn test_03_variables_compile() {
let output_binary = std::env::temp_dir().join("variables_test");
ruchy_cmd()
.arg("compile")
.arg(example_path("03_variables.ruchy"))
.arg("--output")
.arg(&output_binary)
.assert()
.success();
let _ = std::fs::remove_file(&output_binary);
}
#[test]
fn test_04_functions_direct() {
ruchy_cmd()
.arg(example_path("04_functions.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("Hello, World!"))
.stdout(predicate::str::contains("5 + 3 = 8"))
.stdout(predicate::str::contains("5! = 120"));
}
#[test]
fn test_04_functions_run() {
ruchy_cmd()
.arg("run")
.arg(example_path("04_functions.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("5! = 120"));
}
#[test]
fn test_04_functions_eval() {
let code = std::fs::read_to_string(example_path("04_functions.ruchy"))
.expect("Failed to read example file");
ruchy_cmd()
.arg("-e")
.arg(&code)
.assert()
.success()
.stdout(predicate::str::contains("5! = 120"));
}
#[test]
#[ignore = "BUG: Functions compile test failing"]
fn test_04_functions_compile() {
let output_binary = std::env::temp_dir().join("functions_test");
ruchy_cmd()
.arg("compile")
.arg(example_path("04_functions.ruchy"))
.arg("--output")
.arg(&output_binary)
.assert()
.success();
let _ = std::fs::remove_file(&output_binary);
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_05_control_flow_direct() {
ruchy_cmd()
.arg(example_path("05_control_flow.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("Status: adult"))
.stdout(predicate::str::contains("Number: two"));
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_05_control_flow_run() {
ruchy_cmd()
.arg("run")
.arg(example_path("05_control_flow.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("Status: adult"));
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_05_control_flow_eval() {
let code = std::fs::read_to_string(example_path("05_control_flow.ruchy"))
.expect("Failed to read example file");
ruchy_cmd()
.arg("-e")
.arg(&code)
.assert()
.success()
.stdout(predicate::str::contains("Status: adult"));
}
#[test]
fn test_05_control_flow_compile() {
let output_binary = std::env::temp_dir().join("control_flow_test");
ruchy_cmd()
.arg("compile")
.arg(example_path("05_control_flow.ruchy"))
.arg("--output")
.arg(&output_binary)
.assert()
.success();
let _ = std::fs::remove_file(&output_binary);
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_06_data_structures_direct() {
ruchy_cmd()
.arg(example_path("06_data_structures.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("First number: 1"))
.stdout(predicate::str::contains("Name: Alice"));
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_06_data_structures_run() {
ruchy_cmd()
.arg("run")
.arg(example_path("06_data_structures.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("First number: 1"));
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_06_data_structures_eval() {
let code = std::fs::read_to_string(example_path("06_data_structures.ruchy"))
.expect("Failed to read example file");
ruchy_cmd()
.arg("-e")
.arg(&code)
.assert()
.success()
.stdout(predicate::str::contains("First number: 1"));
}
#[test]
#[ignore = "TRANSPILER-BUG: Nested object codegen broken (team.name generates wrong Rust)"]
fn test_06_data_structures_compile() {
let output_binary = std::env::temp_dir().join("data_structures_test");
ruchy_cmd()
.arg("compile")
.arg(example_path("06_data_structures.ruchy"))
.arg("--output")
.arg(&output_binary)
.assert()
.success();
let _ = std::fs::remove_file(&output_binary);
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_07_string_interpolation_direct() {
ruchy_cmd()
.arg(example_path("07_string_interpolation.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("Welcome to Ruchy"))
.stdout(predicate::str::contains("v3.80"));
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_07_string_interpolation_run() {
ruchy_cmd()
.arg("run")
.arg(example_path("07_string_interpolation.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("Welcome to Ruchy"));
}
#[test]
#[ignore = "BUG: Test expectations don't match current example output"]
fn test_07_string_interpolation_eval() {
let code = std::fs::read_to_string(example_path("07_string_interpolation.ruchy"))
.expect("Failed to read example file");
ruchy_cmd()
.arg("-e")
.arg(&code)
.assert()
.success()
.stdout(predicate::str::contains("Welcome to Ruchy"));
}
#[test]
fn test_07_string_interpolation_compile() {
let output_binary = std::env::temp_dir().join("string_interpolation_test");
ruchy_cmd()
.arg("compile")
.arg(example_path("07_string_interpolation.ruchy"))
.arg("--output")
.arg(&output_binary)
.assert()
.success();
let _ = std::fs::remove_file(&output_binary);
}
#[test]
#[ignore = "BUG: Error handling test expectations don't match output"]
fn test_08_error_handling_direct() {
ruchy_cmd()
.arg(example_path("08_error_handling.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("10 / 2 = 5"))
.stdout(predicate::str::contains("Error: Index out of bounds!"));
}
#[test]
fn test_08_error_handling_run() {
ruchy_cmd()
.arg("run")
.arg(example_path("08_error_handling.ruchy"))
.assert()
.success()
.stdout(predicate::str::contains("10 / 2 = 5"));
}
#[test]
fn test_08_error_handling_eval() {
let code = std::fs::read_to_string(example_path("08_error_handling.ruchy"))
.expect("Failed to read example file");
ruchy_cmd()
.arg("-e")
.arg(&code)
.assert()
.success()
.stdout(predicate::str::contains("10 / 2 = 5"));
}
#[test]
fn test_08_error_handling_compile() {
let output_binary = std::env::temp_dir().join("error_handling_test");
ruchy_cmd()
.arg("compile")
.arg(example_path("08_error_handling.ruchy"))
.arg("--output")
.arg(&output_binary)
.assert()
.success();
let _ = std::fs::remove_file(&output_binary);
}