use super::*;
#[test]
fn test_parse_operator_equality() {
assert_eq!(parse_operator("="), Ok(("", Operator::Equal)));
assert_eq!(parse_operator("=="), Ok(("", Operator::Equal)));
assert_eq!(parse_operator(" = "), Ok(("", Operator::Equal)));
assert_eq!(parse_operator(" == "), Ok(("", Operator::Equal)));
assert_eq!(parse_operator("\t=\t"), Ok(("", Operator::Equal)));
}
#[test]
fn test_parse_operator_inequality() {
assert_eq!(parse_operator("!="), Ok(("", Operator::NotEqual)));
assert_eq!(parse_operator("<>"), Ok(("", Operator::NotEqual)));
assert_eq!(parse_operator(" != "), Ok(("", Operator::NotEqual)));
assert_eq!(parse_operator(" <> "), Ok(("", Operator::NotEqual)));
assert_eq!(parse_operator("\t!=\t"), Ok(("", Operator::NotEqual)));
}
#[test]
fn test_parse_operator_bitwise_and() {
assert_eq!(parse_operator("&"), Ok(("", Operator::BitwiseAnd)));
assert_eq!(parse_operator(" & "), Ok(("", Operator::BitwiseAnd)));
assert_eq!(parse_operator(" & "), Ok(("", Operator::BitwiseAnd)));
assert_eq!(parse_operator("\t&\t"), Ok(("", Operator::BitwiseAnd)));
}
#[test]
fn test_parse_operator_bitwise_xor() {
assert_eq!(parse_operator("^"), Ok(("", Operator::BitwiseXor)));
assert_eq!(parse_operator(" ^ "), Ok(("", Operator::BitwiseXor)));
assert_eq!(parse_operator(" ^ "), Ok(("", Operator::BitwiseXor)));
assert_eq!(parse_operator("\t^\t"), Ok(("", Operator::BitwiseXor)));
assert_eq!(parse_operator("^ 0xFF"), Ok(("0xFF", Operator::BitwiseXor)));
assert!(parse_operator("^^").is_err());
}
#[test]
fn test_parse_operator_bitwise_not() {
assert_eq!(parse_operator("~"), Ok(("", Operator::BitwiseNot)));
assert_eq!(parse_operator(" ~ "), Ok(("", Operator::BitwiseNot)));
assert_eq!(parse_operator(" ~ "), Ok(("", Operator::BitwiseNot)));
assert_eq!(parse_operator("\t~\t"), Ok(("", Operator::BitwiseNot)));
assert_eq!(parse_operator("~ 0xff"), Ok(("0xff", Operator::BitwiseNot)));
assert!(parse_operator("~~").is_err());
}
#[test]
fn test_parse_operator_any_value() {
assert_eq!(parse_operator("x"), Ok(("", Operator::AnyValue)));
assert_eq!(parse_operator(" x "), Ok(("", Operator::AnyValue)));
assert_eq!(parse_operator(" x "), Ok(("", Operator::AnyValue)));
assert_eq!(parse_operator("\tx\t"), Ok(("", Operator::AnyValue)));
assert_eq!(parse_operator("x 42"), Ok(("42", Operator::AnyValue)));
assert_eq!(
parse_operator("x version"),
Ok(("version", Operator::AnyValue))
);
}
#[test]
fn test_parse_operator_with_remaining_input() {
assert_eq!(parse_operator("= 123"), Ok(("123", Operator::Equal)));
assert_eq!(
parse_operator("!= value"),
Ok(("value", Operator::NotEqual))
);
assert_eq!(parse_operator("& 0xFF"), Ok(("0xFF", Operator::BitwiseAnd)));
assert_eq!(parse_operator("^ 0xFF"), Ok(("0xFF", Operator::BitwiseXor)));
assert_eq!(parse_operator("~ 0xff"), Ok(("0xff", Operator::BitwiseNot)));
assert_eq!(parse_operator("x 42"), Ok(("42", Operator::AnyValue)));
assert_eq!(
parse_operator("== \"string\""),
Ok(("\"string\"", Operator::Equal))
);
assert_eq!(parse_operator("<> test"), Ok(("test", Operator::NotEqual)));
}
#[test]
fn test_parse_operator_precedence() {
assert_eq!(parse_operator("=="), Ok(("", Operator::Equal)));
assert_eq!(parse_operator("== extra"), Ok(("extra", Operator::Equal)));
assert_eq!(parse_operator("!="), Ok(("", Operator::NotEqual)));
assert_eq!(
parse_operator("!= extra"),
Ok(("extra", Operator::NotEqual))
);
assert_eq!(parse_operator("<>"), Ok(("", Operator::NotEqual)));
assert_eq!(
parse_operator("<> extra"),
Ok(("extra", Operator::NotEqual))
);
assert_eq!(parse_operator("<="), Ok(("", Operator::LessEqual)));
assert_eq!(
parse_operator("<= extra"),
Ok(("extra", Operator::LessEqual))
);
assert_eq!(parse_operator(">="), Ok(("", Operator::GreaterEqual)));
assert_eq!(
parse_operator(">= extra"),
Ok(("extra", Operator::GreaterEqual))
);
}
#[test]
fn test_parse_operator_invalid_input() {
assert!(parse_operator("").is_err());
assert!(parse_operator("abc").is_err());
assert!(parse_operator("123").is_err());
assert!(parse_operator("===").is_err()); assert!(parse_operator("&&").is_err()); assert!(parse_operator("^^").is_err()); assert!(parse_operator("~~").is_err()); }
#[test]
fn test_parse_operator_bare_bang_is_not_equal() {
assert_eq!(parse_operator("!"), Ok(("", Operator::NotEqual)));
assert_eq!(
parse_operator("!0xb8c0078e"),
Ok(("0xb8c0078e", Operator::NotEqual))
);
assert_eq!(parse_operator("!IHISK"), Ok(("IHISK", Operator::NotEqual)));
}
#[test]
fn test_parse_operator_edge_cases() {
assert_eq!(parse_operator("=\n"), Ok(("", Operator::Equal)));
assert_eq!(parse_operator("!=\r\n"), Ok(("", Operator::NotEqual)));
assert_eq!(parse_operator("&\t\t"), Ok(("", Operator::BitwiseAnd)));
assert_eq!(parse_operator(" \t = \t "), Ok(("", Operator::Equal)));
assert_eq!(parse_operator("\t != \t"), Ok(("", Operator::NotEqual)));
assert_eq!(parse_operator(" \t& \t "), Ok(("", Operator::BitwiseAnd)));
assert_eq!(parse_operator(" ^\n"), Ok(("", Operator::BitwiseXor)));
assert_eq!(parse_operator(" ~\r\n"), Ok(("", Operator::BitwiseNot)));
assert_eq!(parse_operator(" x\t\t"), Ok(("", Operator::AnyValue)));
}
#[test]
fn test_parse_operator_common_magic_file_patterns() {
assert_eq!(
parse_operator("= 0x7f454c46"),
Ok(("0x7f454c46", Operator::Equal))
);
assert_eq!(parse_operator("!= 0"), Ok(("0", Operator::NotEqual)));
assert_eq!(
parse_operator("& 0xFF00"),
Ok(("0xFF00", Operator::BitwiseAnd))
);
assert_eq!(
parse_operator("== \"ELF\""),
Ok(("\"ELF\"", Operator::Equal))
);
assert_eq!(parse_operator("<> \"\""), Ok(("\"\"", Operator::NotEqual)));
assert_eq!(parse_operator("^ 0xff"), Ok(("0xff", Operator::BitwiseXor)));
assert_eq!(parse_operator("~ 0x80"), Ok(("0x80", Operator::BitwiseNot)));
assert_eq!(
parse_operator("x version"),
Ok(("version", Operator::AnyValue))
);
assert_eq!(
parse_operator("=\t0x504b0304"),
Ok(("0x504b0304", Operator::Equal))
);
assert_eq!(parse_operator("!= 0"), Ok(("0", Operator::NotEqual)));
assert_eq!(
parse_operator("& 0xFFFF"),
Ok(("0xFFFF", Operator::BitwiseAnd))
);
}
#[test]
fn test_parse_operator_all_variants() {
let test_cases = [
("=", Operator::Equal),
("==", Operator::Equal),
("!=", Operator::NotEqual),
("<>", Operator::NotEqual),
("<", Operator::LessThan),
(">", Operator::GreaterThan),
("<=", Operator::LessEqual),
(">=", Operator::GreaterEqual),
("&", Operator::BitwiseAnd),
("^", Operator::BitwiseXor),
("~", Operator::BitwiseNot),
("x", Operator::AnyValue),
];
for (input, expected) in test_cases {
assert_eq!(
parse_operator(input),
Ok(("", expected)),
"Failed to parse operator: '{input}'"
);
}
}
#[test]
fn test_parse_operator_less_than() {
assert_eq!(parse_operator("<"), Ok(("", Operator::LessThan)));
assert_eq!(parse_operator(" < "), Ok(("", Operator::LessThan)));
assert_eq!(parse_operator(" < "), Ok(("", Operator::LessThan)));
assert_eq!(parse_operator("\t<\t"), Ok(("", Operator::LessThan)));
assert_eq!(parse_operator("< 42"), Ok(("42", Operator::LessThan)));
}
#[test]
fn test_parse_operator_greater_than() {
assert_eq!(parse_operator(">"), Ok(("", Operator::GreaterThan)));
assert_eq!(parse_operator(" > "), Ok(("", Operator::GreaterThan)));
assert_eq!(parse_operator(" > "), Ok(("", Operator::GreaterThan)));
assert_eq!(parse_operator("\t>\t"), Ok(("", Operator::GreaterThan)));
assert_eq!(parse_operator("> 42"), Ok(("42", Operator::GreaterThan)));
}
#[test]
fn test_parse_operator_less_equal() {
assert_eq!(parse_operator("<="), Ok(("", Operator::LessEqual)));
assert_eq!(parse_operator(" <= "), Ok(("", Operator::LessEqual)));
assert_eq!(parse_operator(" <= "), Ok(("", Operator::LessEqual)));
assert_eq!(parse_operator("\t<=\t"), Ok(("", Operator::LessEqual)));
assert_eq!(parse_operator("<= 42"), Ok(("42", Operator::LessEqual)));
}
#[test]
fn test_parse_operator_greater_equal() {
assert_eq!(parse_operator(">="), Ok(("", Operator::GreaterEqual)));
assert_eq!(parse_operator(" >= "), Ok(("", Operator::GreaterEqual)));
assert_eq!(parse_operator(" >= "), Ok(("", Operator::GreaterEqual)));
assert_eq!(parse_operator("\t>=\t"), Ok(("", Operator::GreaterEqual)));
assert_eq!(parse_operator(">= 42"), Ok(("42", Operator::GreaterEqual)));
}
#[test]
fn test_parse_operator_comparison_disambiguation() {
assert_eq!(parse_operator("<>"), Ok(("", Operator::NotEqual)));
assert_eq!(parse_operator("<="), Ok(("", Operator::LessEqual)));
assert_eq!(parse_operator(">="), Ok(("", Operator::GreaterEqual)));
assert_eq!(parse_operator("< >"), Ok((">", Operator::LessThan)));
assert_eq!(parse_operator("> ="), Ok(("=", Operator::GreaterThan)));
}
#[test]
fn test_parse_operator_whitespace_handling() {
let operators = ["=", "==", "!=", "<>", "&"];
let whitespace_patterns = [
"", " ", " ", "\t", "\t\t", " \t", "\t ", ];
for op in operators {
for leading_ws in whitespace_patterns {
for trailing_ws in whitespace_patterns {
let input = format!("{leading_ws}{op}{trailing_ws}");
let result = parse_operator(&input);
assert!(
result.is_ok(),
"Failed to parse operator with whitespace: '{input}'"
);
let (remaining, _) = result.unwrap();
assert_eq!(remaining, "", "Unexpected remaining input for: '{input}'");
}
}
}
}