#[cfg(test)]
mod tests {
use crate::parser::Parser;
use perl_tdd_support::must;
#[test]
fn test_ambiguous_brace_context() {
let code_hash = "my $ref = { key => 'value' };";
let mut parser = Parser::new(code_hash);
let result = parser.parse();
assert!(result.is_ok(), "Failed to parse hash reference");
let ast = must(result);
let sexp = ast.to_sexp();
assert!(sexp.contains("(hash"), "Should parse as hash: {}", sexp);
let code_block = "my $code = { print 'hello'; };";
let mut parser2 = Parser::new(code_block);
let result2 = parser2.parse();
assert!(result2.is_ok(), "Failed to parse code block");
let ast2 = must(result2);
let sexp2 = ast2.to_sexp();
assert!(sexp2.contains("(block"), "Should parse as block: {}", sexp2);
}
#[test]
fn test_nested_ambiguity() {
let code = r#"
sub my_sub {
{ key => 'value' }
}
"#;
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("(block"), "Should parse as block in statement context: {}", sexp);
}
#[test]
fn test_map_grep_sort_blocks() {
let code = "map { $_ * 2 } @list;";
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("(block"), "map should take a block: {}", sexp);
let code2 = "map { key => 'value' } @list;";
let mut parser2 = Parser::new(code2);
let result2 = parser2.parse();
assert!(result2.is_ok());
let ast2 = must(result2);
let sexp2 = ast2.to_sexp();
assert!(
sexp2.contains("(block"),
"map should take a block even with hash-like content: {}",
sexp2
);
}
}