#![allow(clippy::unwrap_used)]
#![allow(clippy::expect_used)]
use bashrs::bash_parser::ast::TestExpr;
use bashrs::bash_parser::{BashExpr, BashParser, BashStmt};
#[ignore = "RED phase - needs GREEN phase implementation"]
#[test]
fn test_parse_test_string_non_empty() {
let bash = r#"[ -n "$VAR" ]"#;
let mut parser = BashParser::new(bash).expect("Failed to create parser");
let ast = parser.parse().expect("Failed to parse");
assert_eq!(ast.statements.len(), 1);
if let BashStmt::Command { name, args: _, .. } = &ast.statements[0] {
assert_eq!(name, "[");
} else {
panic!("Expected command statement");
}
}
#[ignore = "RED phase - needs GREEN phase implementation"]
#[test]
fn test_parse_test_string_empty() {
let bash = r#"[ -z "$VAR" ]"#;
let mut parser = BashParser::new(bash).expect("Failed to create parser");
let ast = parser.parse().expect("Failed to parse");
assert_eq!(ast.statements.len(), 1);
}
#[ignore = "RED phase - needs GREEN phase implementation"]
#[test]
fn test_parse_test_file_exists() {
let bash = r#"[ -f "$FILE" ]"#;
let mut parser = BashParser::new(bash).expect("Failed to create parser");
let ast = parser.parse().expect("Failed to parse");
assert_eq!(ast.statements.len(), 1);
}
#[ignore = "RED phase - needs GREEN phase implementation"]
#[test]
fn test_parse_if_with_test_expression() {
let bash = r#"
if [ -n "$VAR" ]; then
echo "VAR is set"
fi
"#;
let mut parser = BashParser::new(bash).expect("Failed to create parser");
let ast = parser.parse().expect("Failed to parse");
assert_eq!(ast.statements.len(), 1);
if let BashStmt::If {
condition,
then_block,
..
} = &ast.statements[0]
{
if let BashExpr::Test(test_expr) = condition {
assert!(matches!(**test_expr, TestExpr::StringNonEmpty(_)));
} else {
panic!("Expected test expression, got {:?}", condition);
}
assert!(!then_block.is_empty());
} else {
panic!("Expected if statement");
}
}
#[ignore = "RED phase - needs GREEN phase implementation"]
#[test]
fn test_parse_double_bracket_test() {
let bash = r#"[[ -n "$VAR" ]]"#;
let mut parser = BashParser::new(bash).expect("Failed to create parser");
let ast = parser.parse().expect("Failed to parse");
assert_eq!(ast.statements.len(), 1);
}
#[ignore = "RED phase - needs GREEN phase implementation"]
#[test]
fn test_parse_file_operators() {
let test_cases = vec![
("[ -f /tmp/file ]", "file exists"),
("[ -d /tmp/dir ]", "directory exists"),
("[ -r /tmp/file ]", "file readable"),
("[ -w /tmp/file ]", "file writable"),
("[ -x /tmp/file ]", "file executable"),
("[ -e /tmp/file ]", "path exists"),
];
for (bash, desc) in test_cases {
let result = BashParser::new(bash).and_then(|mut p| p.parse());
assert!(
result.is_ok(),
"Failed to parse {}: {:?}",
desc,
result.err()
);
}
}
#[ignore = "RED phase - needs GREEN phase implementation"]
#[test]
fn test_parse_string_operators() {
let test_cases = vec![
(r#"[ "$A" = "$B" ]"#, "string equal"),
(r#"[ "$A" != "$B" ]"#, "string not equal"),
(r#"[ -n "$A" ]"#, "string non-empty"),
(r#"[ -z "$A" ]"#, "string empty"),
];
for (bash, desc) in test_cases {
let result = BashParser::new(bash).and_then(|mut p| p.parse());
assert!(
result.is_ok(),
"Failed to parse {}: {:?}",
desc,
result.err()
);
}
}
#[ignore = "RED phase - needs GREEN phase implementation"]
#[test]
fn test_parse_integer_operators() {
let test_cases = vec![
("[ $A -eq $B ]", "equal"),
("[ $A -ne $B ]", "not equal"),
("[ $A -lt $B ]", "less than"),
("[ $A -le $B ]", "less or equal"),
("[ $A -gt $B ]", "greater than"),
("[ $A -ge $B ]", "greater or equal"),
];
for (bash, desc) in test_cases {
let result = BashParser::new(bash).and_then(|mut p| p.parse());
assert!(
result.is_ok(),
"Failed to parse {}: {:?}",
desc,
result.err()
);
}
}
#[ignore = "RED phase - needs GREEN phase implementation"]
#[test]
fn test_format_test_expression() {
use bashrs::bash_quality::Formatter;
let bash = r#"
if [ -n "$VAR" ]; then
echo "set"
fi
"#;
let mut formatter = Formatter::new();
let result = formatter.format_source(bash);
assert!(result.is_ok(), "Failed to format: {:?}", result.err());
let formatted = result.unwrap();
assert!(formatted.contains("[ -n"));
assert!(formatted.contains("then"));
}
#[ignore = "RED phase - needs GREEN phase implementation"]
#[test]
fn test_parse_logical_operators() {
let test_cases = vec![
("[ -n \"$A\" -a -n \"$B\" ]", "AND"),
("[ -n \"$A\" -o -n \"$B\" ]", "OR"),
("[ ! -f /tmp/file ]", "NOT"),
];
for (bash, desc) in test_cases {
let result = BashParser::new(bash).and_then(|mut p| p.parse());
assert!(
result.is_ok(),
"Failed to parse {}: {:?}",
desc,
result.err()
);
}
}