use crate::adapters::suppression::qual_allow::*;
#[test]
fn test_parse_qual_allow_bare_is_ignored() {
assert!(parse_suppression(5, "// qual:allow").is_none());
assert!(parse_suppression(5, "// qual:allow()").is_none());
assert!(parse_suppression(5, "// qual:allow(srp_params)").is_none());
assert!(
parse_suppression(5, "// qual:allow(srp_params) reason: \"typo\"").is_none(),
"unknown dim + reason still maps to no recognized dim"
);
}
#[test]
fn test_detect_invalid_qual_allow_flags_typo_dimensions() {
assert_eq!(
detect_invalid_qual_allow("// qual:allow(srp_params)"),
Some(InvalidQualAllow::UnknownDimensions(
"srp_params".to_string()
))
);
assert_eq!(
detect_invalid_qual_allow("// qual:allow(srp_params, foo) reason: \"typo\""),
Some(InvalidQualAllow::UnknownDimensions(
"srp_params, foo".to_string()
))
);
}
#[test]
fn test_detect_invalid_qual_allow_does_not_flag_bare_or_empty() {
assert!(detect_invalid_qual_allow("// qual:allow").is_none());
assert!(detect_invalid_qual_allow("// qual:allow()").is_none());
}
#[test]
fn test_parse_qual_allow_unclosed_parens_is_ignored_as_suppression() {
assert!(parse_suppression(1, "// qual:allow(iosp").is_none());
assert!(parse_suppression(1, "// qual:allow(srp_params").is_none());
assert!(parse_suppression(1, "// qual:allow(iosp, complexity").is_none());
}
#[test]
fn test_detect_invalid_qual_allow_catches_unclosed_parens() {
assert_eq!(
detect_invalid_qual_allow("// qual:allow(srp_params"),
Some(InvalidQualAllow::UnclosedParens("srp_params".to_string()))
);
assert_eq!(
detect_invalid_qual_allow("// qual:allow(iosp"),
Some(InvalidQualAllow::UnclosedParens("iosp".to_string())),
"unclosed paren is structural malformation — must surface \
as orphan even when the tail happens to spell a valid dim, \
otherwise the marker silently drops (no suppression, no \
orphan) which is exactly the Bug-5 class we closed."
);
}
#[test]
fn test_invalid_qual_allow_reason_distinguishes_kinds() {
let unknown = InvalidQualAllow::UnknownDimensions("srp_params".to_string()).reason();
assert!(
unknown.contains("did not parse to any known dimension"),
"unknown-dim reason should explain dim resolution failure, got: {unknown}"
);
let unclosed = InvalidQualAllow::UnclosedParens("iosp".to_string()).reason();
assert!(
unclosed.contains("unclosed parens"),
"unclosed-paren reason should call out the structural shape, got: {unclosed}"
);
assert!(
!unclosed.contains("did not parse to any known dimension"),
"unclosed-paren reason must NOT use the unknown-dim wording — \
it lies for `qual:allow(iosp` (iosp IS a known dim). Got: {unclosed}"
);
}
#[test]
fn test_detect_invalid_qual_allow_passes_partial_recognized_dims() {
assert!(detect_invalid_qual_allow("// qual:allow(srp, srp_params)").is_none());
}
#[test]
fn test_parse_qual_allow_iosp() {
let s = parse_suppression(3, "// qual:allow(iosp)").unwrap();
assert_eq!(s.dimensions, vec![Dimension::Iosp]);
assert!(s.reason.is_none());
}
#[test]
fn test_parse_qual_allow_multiple_dims() {
let s = parse_suppression(1, "// qual:allow(iosp, complexity)").unwrap();
assert_eq!(s.dimensions, vec![Dimension::Iosp, Dimension::Complexity]);
}
#[test]
fn test_parse_qual_allow_with_reason() {
let s = parse_suppression(1, "// qual:allow(iosp) reason: \"syn visitor pattern\"").unwrap();
assert_eq!(s.dimensions, vec![Dimension::Iosp]);
assert_eq!(s.reason.as_deref(), Some("syn visitor pattern"));
}
#[test]
fn test_parse_old_iosp_allow_still_works() {
let s = parse_suppression(10, "// iosp:allow").unwrap();
assert_eq!(s.line, 10);
assert_eq!(s.dimensions, vec![Dimension::Iosp]);
assert!(s.reason.is_none());
}
#[test]
fn test_parse_old_iosp_allow_with_reason() {
let s = parse_suppression(1, "// iosp:allow justified reason").unwrap();
assert_eq!(s.dimensions, vec![Dimension::Iosp]);
assert_eq!(s.reason.as_deref(), Some("justified reason"));
}
#[test]
fn test_parse_no_match() {
assert!(parse_suppression(1, "// normal comment").is_none());
assert!(parse_suppression(1, "let x = 42;").is_none());
}
#[test]
fn test_api_marker_exact() {
assert!(is_api_marker("// qual:api"));
}
#[test]
fn test_api_marker_with_trailing_text() {
assert!(is_api_marker("// qual:api public interface"));
}
#[test]
fn test_api_marker_not_suppression() {
assert!(!is_api_marker("// qual:allow(dry)"));
}
#[test]
fn test_api_marker_not_regular_comment() {
assert!(!is_api_marker("// normal comment"));
}
#[test]
fn test_api_marker_not_counted_as_suppression() {
assert!(parse_suppression(1, "// qual:api").is_none());
}
#[test]
fn test_test_helper_marker_exact() {
assert!(is_test_helper_marker("// qual:test_helper"));
}
#[test]
fn test_test_helper_marker_with_trailing_text() {
assert!(is_test_helper_marker("// qual:test_helper shared asserter"));
}
#[test]
fn test_test_helper_marker_not_plural() {
assert!(!is_test_helper_marker("// qual:test_helpers"));
}
#[test]
fn test_test_helper_marker_not_api() {
assert!(!is_test_helper_marker("// qual:api"));
}
#[test]
fn test_test_helper_marker_not_counted_as_suppression() {
assert!(parse_suppression(1, "// qual:test_helper").is_none());
}
#[test]
fn test_inverse_marker_parsed() {
assert_eq!(
parse_inverse_marker("// qual:inverse(parse)"),
Some("parse".to_string())
);
}
#[test]
fn test_inverse_marker_with_spaces() {
assert_eq!(
parse_inverse_marker("// qual:inverse( as_str )"),
Some("as_str".to_string())
);
}
#[test]
fn test_inverse_marker_empty_rejected() {
assert_eq!(parse_inverse_marker("// qual:inverse()"), None);
}
#[test]
fn test_inverse_marker_not_suppression() {
assert!(parse_suppression(1, "// qual:inverse(parse)").is_none());
}