fn test_t118_vec_len() {
let (ok, output) = transpile_stmt("let v = vec![1]; let _ = v.len();");
if ok && !output.contains("${#") && !output.contains("len") {
println!("T118: WARNING - vec.len() should produce ${{#v[@]}} or similar");
}
}
#[test]
fn test_t119_vec_index() {
let (ok, output) = transpile_stmt("let v = vec![1]; let _ = v[0];");
if ok && !output.contains("${v[0]}") && !output.contains("[0]") {
println!("T119: WARNING - v[0] should produce ${{v[0]}} or similar");
}
}
#[test]
fn test_t120_contains() {
let (ok, output) = transpile_stmt("let v = vec![1]; let _ = v.contains(&1);");
if !ok {
println!("T120: contains unsupported: {}", output);
}
}
#[test]
fn test_t121_thread_spawn() {
let (ok, output) = transpile_stmt("std::thread::spawn(|| {});");
if ok {
println!("T121: Thread spawn should NOT be supported in shell");
} else {
println!(
"T121: Correctly rejects thread::spawn: {}",
output.lines().next().unwrap_or("")
);
}
}
#[test]
fn test_t122_print_no_newline() {
let (ok, output) = transpile_stmt("print!(\"no newline\");");
if !ok {
println!(
"T122: print! unsupported: {}",
output.lines().next().unwrap_or("")
);
} else if !output.contains("printf") && !output.contains("-n") {
println!("T122: WARNING - print! should use printf or echo -n (no trailing newline)");
}
}
#[test]
fn test_t123_setvar_spaces() {
let (ok, output) = transpile_stmt("std::env::set_var(\"A\", \"b c\");");
if !ok {
println!(
"T123: set_var unsupported: {}",
output.lines().next().unwrap_or("")
);
} else if !output.contains("\"") && !output.contains("'") {
println!("T123: WARNING - export with spaces needs quoting");
}
}
#[test]
fn test_t124_hard_link() {
let (ok, output) = transpile_stmt("std::fs::hard_link(\"a\", \"b\");");
if !ok {
println!(
"T124: hard_link unsupported: {}",
output.lines().next().unwrap_or("")
);
} else if !output.contains("ln ") || output.contains("-s") {
println!("T124: WARNING - hard_link should use 'ln' without -s flag");
}
}
#[test]
fn test_t125_copy_file() {
let (ok, output) = transpile_stmt("std::fs::copy(\"a\", \"b\");");
if !ok {
println!(
"T125: copy unsupported: {}",
output.lines().next().unwrap_or("")
);
} else if !output.contains("cp ") && !output.contains("cp\n") {
println!("T125: WARNING - fs::copy should produce 'cp' command");
}
}
#[test]
fn test_t126_rename_file() {
let (ok, output) = transpile_stmt("std::fs::rename(\"a\", \"b\");");
if !ok {
println!(
"T126: rename unsupported: {}",
output.lines().next().unwrap_or("")
);
} else if !output.contains("mv ") && !output.contains("mv\n") {
println!("T126: WARNING - fs::rename should produce 'mv' command");
}
}
#[test]
fn test_t127_raw_string() {
let (ok, output) = transpile_stmt("let s = r\"a\\b\";");
if !ok {
println!(
"T127: raw string unsupported: {}",
output.lines().next().unwrap_or("")
);
} else {
println!("T127: Raw string handled");
}
}
#[test]
fn test_t128_format_macro() {
let (ok, output) = transpile_stmt("let _ = format!(\"x: {}\", 1);");
if !ok {
println!(
"T128: format! unsupported: {}",
output.lines().next().unwrap_or("")
);
} else {
println!("T128: format! handled");
}
}
#[test]
fn test_t129_iterator_map() {
let (ok, output) = transpile_stmt("let _ = vec![1, 2].iter().map(|x| x + 1);");
if !ok {
println!(
"T129: iterator map unsupported: {}",
output.lines().next().unwrap_or("")
);
} else if !output.contains("for") && !output.to_lowercase().contains("loop") {
println!("T129: WARNING - iter().map() should produce a loop");
}
}
#[test]
fn test_t130_iterator_filter() {
let (ok, output) = transpile_stmt("let _ = vec![1, 2, 3].iter().filter(|x| *x > 1);");
if !ok {
println!(
"T130: iterator filter unsupported: {}",
output.lines().next().unwrap_or("")
);
} else if !output.contains("if") {
println!("T130: WARNING - iter().filter() should produce conditional logic");
}
}
#[test]
fn test_tcode_comprehensive_summary() {
println!("\n");
println!("╔══════════════════════════════════════════════════════════════════════════════╗");
println!("║ T-CODE TRANSPILER TEST SUMMARY (SPEC-TB-2025-001 v2.2.0) ║");
println!("╠══════════════════════════════════════════════════════════════════════════════╣");
println!("║ ║");
println!("║ Known Bugs (from bug hunt): ║");
println!("║ TB-001: User-defined functions not transpiled ║");
println!("║ TB-002: Function parameters not passed ║");
println!("║ TB-003: Multiple function definitions fail ║");
println!("║ TB-004: String literal validation fails ║");
println!("║ TB-005: Range-based for loops unsupported ║");
println!("║ TB-006: Function return values not handled ║");
println!("║ TB-007: Multiplication not computed ║");
println!("║ TB-008: Modulo not computed ║");
println!("║ TB-010: match statements unsupported ║");
println!("║ ║");
println!("║ Run individual T-code tests for detailed failure analysis. ║");
println!("║ ║");
println!("╚══════════════════════════════════════════════════════════════════════════════╝");
}
#[test]
fn test_tcode_baseline_verification() {
let mut results: Vec<TCodeResult> = Vec::new();
let (ok, output) = transpile_prog("fn main() {}");
if ok && output.contains("main()") {
results.push(TCodeResult::pass("T001"));
} else {
results.push(TCodeResult::fail("T001", "Missing main()"));
}
let (ok, output) = transpile_stmt("let a = 1;");
if ok && !output.contains("unknown") {
results.push(TCodeResult::pass("T002"));
} else {
results.push(TCodeResult::fail("T002", "Integer assignment failed"));
}
let (ok, output) = transpile_stmt("let a = -1;");
if ok && !output.contains("unknown") {
results.push(TCodeResult::pass("T003"));
} else {
results.push(TCodeResult::fail("T003", "Negative integer failed"));
}
let (ok, output) = transpile_prog("fn foo() {} fn main() { foo(); }");
if ok && output.contains("foo()") {
results.push(TCodeResult::pass("T071"));
} else {
results.push(TCodeResult::fail(
"T071",
"TB-001: Functions not transpiled",
));
}
let passed = results.iter().filter(|r| r.passed).count();
let failed = results.iter().filter(|r| !r.passed).count();
println!("\n╔═══════════════════════════════════════════╗");
println!("║ T-CODE BASELINE VERIFICATION ║");
println!("╠═══════════════════════════════════════════╣");
println!("║ Passed: {:<3} ║", passed);
println!("║ Failed: {:<3} ║", failed);
println!("╠═══════════════════════════════════════════╣");
for r in &results {
if r.passed {
println!("║ ✅ {} ║", r.id);
} else {
println!(
"║ ❌ {} - {} ║",
r.id,
r.reason.chars().take(20).collect::<String>()
);
}
}
println!("╚═══════════════════════════════════════════╝");
}
#[cfg(test)]
#[cfg(feature = "property-tests")] mod property_tests {
use super::*;
use proptest::prelude::*;
proptest! {
#[test]
fn prop_transpile_deterministic(n in 0i32..1000) {
let code = format!("fn main() {{ let x = {}; }}", n);
let (ok1, out1) = transpile_prog(&code);
let (ok2, out2) = transpile_prog(&code);
prop_assert_eq!(ok1, ok2, "Transpilation success should be consistent");
if ok1 {
prop_assert_eq!(out1, out2, "Output should be identical for same input");
}
}
#[test]
fn prop_integer_literals_never_unknown(n in -1000i32..1000) {
let code = format!("fn main() {{ let x = {}; }}", n);
let (ok, output) = transpile_prog(&code);
if ok {
prop_assert!(
!output.contains("unknown"),
"Integer {} should not produce 'unknown'", n
);
}
}
#[test]
fn prop_empty_main_always_works(_dummy in 0..10u32) {
let (ok, output) = transpile_prog("fn main() {}");
prop_assert!(ok, "Empty main should always transpile");
prop_assert!(output.contains("main()"), "Output should contain main()");
}
#[test]
fn prop_variable_names_preserved(
name in "[a-z][a-z0-9_]{0,10}"
) {
if ["fn", "let", "if", "else", "while", "for", "loop", "match", "return", "break", "continue", "true", "false", "mut", "pub", "mod", "use", "struct", "enum", "impl", "trait", "type", "where", "as", "in", "ref", "self", "super", "crate", "const", "static", "extern", "unsafe", "async", "await", "dyn", "move"].contains(&name.as_str()) {
return Ok(());
}
let code = format!("fn main() {{ let {} = 42; }}", name);
let (ok, output) = transpile_prog(&code);
if ok {
prop_assert!(
output.contains(&name) || output.contains(&format!("{}=", name)),
"Variable '{}' should appear in output", name
);
}
}
#[test]
fn prop_positive_int_valid_shell(n in 0u32..10000) {
let code = format!("fn main() {{ let x = {}; }}", n);
let (ok, output) = transpile_prog(&code);
if ok {
prop_assert!(
output.contains("x="),
"Should have x= assignment for {}", n
);
}
}
#[test]
fn prop_arithmetic_produces_result(
a in 1i32..100,
b in 1i32..100
) {
let code = format!("fn main() {{ let r = {} + {}; }}", a, b);
let (ok, output) = transpile_prog(&code);
if ok {
let expected_sum = a + b;
let has_arith = output.contains("$((")
|| output.contains(&expected_sum.to_string());
prop_assert!(
has_arith || output.contains("r="),
"Addition {}+{} should produce arithmetic or result", a, b
);
}
}
#[test]
fn prop_println_content_quoted(s in "[a-zA-Z0-9 ]{1,20}") {
let code = format!(r#"fn main() {{ println!("{}"); }}"#, s);
let (ok, output) = transpile_prog(&code);
if ok {
let has_quoted = output.contains(&format!("'{}'", s))
|| output.contains(&format!("\"{}\"", s))
|| output.contains(&s);
prop_assert!(
has_quoted,
"println content '{}' should appear in output", s
);
}
}
#[test]
fn prop_sec5_idempotency(n in 0i32..100) {
let code = format!("fn main() {{ let x = {}; }}", n);
let (ok1, out1) = transpile_prog(&code);
if ok1 {
let (ok2, out2) = transpile_prog(&code);
prop_assert_eq!(ok1, ok2, "Idempotency: success should be consistent");
prop_assert_eq!(out1, out2, "Idempotency: output should be identical");
}
}
#[test]
fn prop_sec5_quoting_safety_dollar(s in "[a-zA-Z]{1,5}") {
let var_name = format!("${}", s);
let code = format!(r#"fn main() {{ let msg = "{}"; let _ = msg; }}"#, var_name);
let (ok, output) = transpile_prog(&code);
if ok {
let is_safe = output.contains(&format!("'{}'", var_name))
|| output.contains(&format!("\"{}\"", var_name))
|| output.contains("\\$")
|| output.contains("'$");
prop_assert!(
is_safe || !output.contains(&format!("${}", s)),
"Quoting safety: ${} should be escaped/quoted", s
);
}
}
#[test]
fn prop_sec5_symmetry_exit_code(n in 0u8..128) {
let code = format!("fn main() {{ std::process::exit({}); }}", n);
let (ok, output) = transpile_prog(&code);
if ok {
let has_exit = output.contains(&format!("exit {}", n))
|| output.contains(&format!("exit({})", n));
prop_assert!(
has_exit || output.contains("exit"),
"Symmetry: exit({}) should produce exit {}", n, n
);
}
}
}
}