#![cfg(any(
not(any(
feature = "parser_tests",
feature = "analyzer_tests",
feature = "codegen_tests",
feature = "interpreter_tests",
feature = "conformance_tests",
feature = "integration_tests",
)),
feature = "analyzer_tests",
))]
use windjammer::analyzer::{Analyzer, SignatureRegistry};
use windjammer::codegen::CodeGenerator;
use windjammer::lexer::Lexer;
use windjammer::parser::Parser;
use windjammer::CompilationTarget;
#[test]
fn test_ownership_transfer_safety() {
let source = r#"
fn transfer_ownership(x: string) -> string {
x
}
fn main() {
let s = "hello"
let s2 = transfer_ownership(s)
println!("{}", s2)
}
"#;
let mut lexer = Lexer::new(source);
let tokens = lexer.tokenize_with_locations();
let mut parser = Parser::new(tokens);
let program = parser.parse().expect("Parse should succeed");
let mut analyzer = Analyzer::new();
let result = analyzer.analyze_program(&program);
assert!(result.is_ok(), "Ownership analysis should succeed");
let (analyzed_functions, signatures, _analyzed_trait_methods) = result.unwrap();
let mut generator = CodeGenerator::new_for_module(signatures, CompilationTarget::Wasm);
let rust_code = generator.generate_program(&program, &analyzed_functions);
assert!(rust_code.contains("fn transfer_ownership"));
assert!(!rust_code.contains("clone()") || rust_code.contains("// necessary"));
}
#[test]
fn test_reference_safety() {
let source = r#"
fn borrow_string(s: string) -> int {
s.len()
}
fn main() {
let s = "hello"
let len = borrow_string(&s)
println!("{}", len)
}
"#;
let mut lexer = Lexer::new(source);
let tokens = lexer.tokenize_with_locations();
let mut parser = Parser::new(tokens);
let program = parser.parse().expect("Parse should succeed");
let mut analyzer = Analyzer::new();
let result = analyzer.analyze_program(&program);
assert!(result.is_ok(), "Reference analysis should succeed");
let (analyzed_functions, signatures, _analyzed_trait_methods) = result.unwrap();
let mut generator = CodeGenerator::new_for_module(signatures, CompilationTarget::Wasm);
let rust_code = generator.generate_program(&program, &analyzed_functions);
assert!(rust_code.contains("&") || rust_code.contains("ref"));
}
#[test]
fn test_mutable_reference_safety() {
let source = r#"
fn modify_string(s: string) {
s.push_str(" world")
}
fn main() {
let mut s = "hello"
modify_string(&mut s)
println!("{}", s)
}
"#;
let mut lexer = Lexer::new(source);
let tokens = lexer.tokenize_with_locations();
let mut parser = Parser::new(tokens);
let program = parser.parse().expect("Parse should succeed");
let mut analyzer = Analyzer::new();
let result = analyzer.analyze_program(&program);
assert!(result.is_ok(), "Mutable reference analysis should succeed");
let (analyzed_functions, signatures, _analyzed_trait_methods) = result.unwrap();
let mut generator = CodeGenerator::new_for_module(signatures, CompilationTarget::Wasm);
let rust_code = generator.generate_program(&program, &analyzed_functions);
assert!(
rust_code.contains("push_str"),
"Expected string mutation via push_str in generated code.\nGot:\n{}",
rust_code
);
}
#[test]
fn test_vector_memory_safety() {
let source = r#"
fn create_vector() -> int {
let v = vec![1, 2, 3, 4, 5]
v[0]
}
fn main() {
let result = create_vector()
println!("{}", result)
}
"#;
let mut lexer = Lexer::new(source);
let tokens = lexer.tokenize_with_locations();
let mut parser = Parser::new(tokens);
if let Ok(program) = parser.parse() {
let signatures = SignatureRegistry::new();
let mut generator = CodeGenerator::new_for_module(signatures, CompilationTarget::Wasm);
let _rust_code = generator.generate_program(&program, &[]);
}
}
#[test]
fn test_closure_capture_safety() {
let source = r#"
fn main() {
let x = 10
let add_x = |y| x + y
let result = add_x(5)
println!("{}", result)
}
"#;
let mut lexer = Lexer::new(source);
let tokens = lexer.tokenize_with_locations();
let mut parser = Parser::new(tokens);
if let Ok(program) = parser.parse() {
let signatures = SignatureRegistry::new();
let mut generator = CodeGenerator::new_for_module(signatures, CompilationTarget::Wasm);
let _rust_code = generator.generate_program(&program, &[]);
}
}
#[test]
fn test_defer_safety() {
let source = r#"
fn with_defer() {
let f = File::open("test.txt")
defer f.close()
// ... do work ...
}
"#;
let mut lexer = Lexer::new(source);
let tokens = lexer.tokenize_with_locations();
let mut parser = Parser::new(tokens);
if let Ok(program) = parser.parse() {
let signatures = SignatureRegistry::new();
let mut generator = CodeGenerator::new_for_module(signatures, CompilationTarget::Wasm);
let _rust_code = generator.generate_program(&program, &[]);
}
}
#[test]
fn test_many_allocations() {
let source = r#"
fn stress_test() {
for i in 0..10 {
let x = i * 2
println!("{}", x)
}
}
"#;
let mut lexer = Lexer::new(source);
let tokens = lexer.tokenize_with_locations();
let mut parser = Parser::new(tokens);
if let Ok(program) = parser.parse() {
let signatures = SignatureRegistry::new();
let mut generator = CodeGenerator::new_for_module(signatures, CompilationTarget::Wasm);
let _rust_code = generator.generate_program(&program, &[]);
}
}
#[test]
fn test_recursive_function_safety() {
let source = r#"
fn factorial(n: int) -> int {
if n <= 1 {
1
} else {
n * factorial(n - 1)
}
}
"#;
let mut lexer = Lexer::new(source);
let tokens = lexer.tokenize_with_locations();
let mut parser = Parser::new(tokens);
if let Ok(program) = parser.parse() {
let signatures = SignatureRegistry::new();
let mut generator = CodeGenerator::new_for_module(signatures, CompilationTarget::Wasm);
let _rust_code = generator.generate_program(&program, &[]);
}
}