#![allow(clippy::unwrap_used)]
#![allow(clippy::expect_used)]
#![allow(clippy::needless_raw_string_hashes)]
#![allow(clippy::uninlined_format_args)]
#![allow(clippy::manual_assert)]
#![allow(clippy::panic)]
#![allow(clippy::print_stdout)]
#![allow(clippy::single_char_pattern)]
#![allow(clippy::expect_fun_call)]
use ruchy::{Parser, Transpiler};
use std::fs;
use tempfile::TempDir;
#[test]
fn test_cli_execution_transpilation_path() {
let mut transpiler = Transpiler::new();
let code = r#""hello".to_upper()"#;
let mut parser = Parser::new(code);
let ast = parser.parse().expect("Failed to parse");
let result = transpiler
.transpile_to_program(&ast)
.expect("Failed to transpile to program");
let transpiled_code = result.to_string();
println!("Transpiled code from CLI path: {}", transpiled_code);
assert!(
transpiled_code.contains("to_uppercase"),
"CLI transpilation path failed to map to_upper -> to_uppercase: {}",
transpiled_code
);
assert!(
!transpiled_code.contains("to_upper()"),
"CLI transpilation path still contains 'to_upper()': {}",
transpiled_code
);
}
#[test]
fn test_program_transpilation_structure() {
let mut transpiler = Transpiler::new();
let code = r#""hello".to_upper()"#;
let mut parser = Parser::new(code);
let ast = parser.parse().expect("Failed to parse");
let result = transpiler
.transpile_to_program(&ast)
.expect("Failed to transpile to program");
let transpiled_code = result.to_string();
assert!(
transpiled_code.contains("fn main"),
"Program transpilation should create main function: {}",
transpiled_code
);
assert!(
transpiled_code.contains("{") && transpiled_code.contains("}"),
"Program should have proper block structure: {}",
transpiled_code
);
}
#[test]
fn test_various_expressions_cli_transpilation() {
let mut transpiler = Transpiler::new();
let test_cases = [
(r#""hello".to_upper()"#, "to_uppercase"),
(r#""WORLD".to_lower()"#, "to_lowercase"),
(r#""test".len()"#, "len"),
];
for (code, expected_method) in test_cases {
let mut parser = Parser::new(code);
let ast = parser.parse().expect(&format!("Failed to parse: {}", code));
let result = transpiler
.transpile_to_program(&ast)
.expect(&format!("Failed to transpile to program: {}", code));
let transpiled_code = result.to_string();
println!("Code: {} -> {}", code, transpiled_code);
assert!(
transpiled_code.contains(expected_method),
"Expected method '{}' in transpiled code for '{}': {}",
expected_method,
code,
transpiled_code
);
}
}
#[test]
fn test_temp_file_compilation_cycle() {
let temp_dir = TempDir::new().expect("Failed to create temp dir");
let source_file = temp_dir.path().join("test.ruchy");
let rust_file = temp_dir.path().join("test.rs");
fs::write(&source_file, r#""hello".to_upper()"#).expect("Failed to write source");
let mut transpiler = Transpiler::new();
let source_content = fs::read_to_string(&source_file).unwrap();
let mut parser = Parser::new(&source_content);
let ast = parser.parse().expect("Failed to parse");
let result = transpiler
.transpile_to_program(&ast)
.expect("Failed to transpile");
let rust_code = result.to_string();
fs::write(&rust_file, &rust_code).expect("Failed to write Rust");
println!("Generated Rust code:\n{}", rust_code);
assert!(
rust_code.contains("to_uppercase"),
"Generated Rust code should contain 'to_uppercase': {}",
rust_code
);
let output = std::process::Command::new("rustc")
.args(["--edition", "2021", "-o", "/tmp/test_exec"])
.arg(&rust_file)
.output();
if let Ok(compilation) = output {
if !compilation.status.success() {
println!(
"Rustc compilation failed: {}",
String::from_utf8_lossy(&compilation.stderr)
);
println!("Rust code that failed:\n{}", rust_code);
}
assert!(
compilation.status.success(),
"Generated Rust code should compile with rustc"
);
}
}