#[cfg(test)]
mod tests {
use crate::parser::Parser;
use perl_tdd_support::must;
#[test]
fn test_indirect_method_call() {
let code = r#"
my $method = "print";
my $object = "hello";
$method $object;
"#;
let mut parser = Parser::new(code);
let result = parser.parse();
assert!(result.is_ok(), "Failed to parse indirect method call");
let ast = must(result);
let _sexp = ast.to_sexp();
let code_valid = "print $object 'arg';";
let mut parser_valid = Parser::new(code_valid);
let result_valid = parser_valid.parse();
assert!(result_valid.is_ok());
let ast_valid = must(result_valid);
let sexp_valid = ast_valid.to_sexp();
assert!(
sexp_valid.contains("indirect_call"),
"Should detect indirect call in: {}",
sexp_valid
);
}
#[test]
fn test_indirect_constructor() {
let code = "new MyClass($arg);";
let mut parser = Parser::new(code);
let result = parser.parse();
assert!(result.is_ok());
let ast = must(result);
let sexp = ast.to_sexp();
assert!(sexp.contains("indirect_call"), "Should detect indirect constructor in: {}", sexp);
}
#[test]
fn test_arrow_dereference() {
let code = "$ref->{key};";
let mut parser = Parser::new(code);
let result = parser.parse();
assert!(result.is_ok());
let ast = must(result);
let sexp = ast.to_sexp();
assert!(
!sexp.contains("indirect_call"),
"Arrow deref should not be indirect call in: {}",
sexp
);
}
#[test]
fn test_ambiguous_print() {
let code_direct = "print $x, $y;";
let mut parser = Parser::new(code_direct);
let ast = must(parser.parse());
let sexp = ast.to_sexp();
assert!(
!sexp.contains("indirect_call"),
"Comma should prevent indirect call detection: {}",
sexp
);
let code_indirect = "print $fh $x;";
let mut parser2 = Parser::new(code_indirect);
let ast2 = must(parser2.parse());
let sexp2 = ast2.to_sexp();
assert!(
sexp2.contains("indirect_call"),
"Should detect indirect print to filehandle: {}",
sexp2
);
}
}