use super::*;
#[test]
fn test_parse_file_level_suppression() {
let source = "# bashrs disable-file=SC2086,DET002\necho $var\n";
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SC2086", 2));
assert!(manager.is_suppressed("DET002", 2));
assert!(!manager.is_suppressed("SC2046", 2));
}
#[test]
fn test_parse_next_line_suppression() {
let source = "# bashrs disable-next-line=SC2086\necho $var\n";
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SC2086", 2));
assert!(!manager.is_suppressed("SC2086", 1));
assert!(!manager.is_suppressed("SC2086", 3));
}
#[test]
fn test_parse_inline_suppression() {
let source = "echo $var # bashrs disable-line=SC2086\n";
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SC2086", 1));
assert!(!manager.is_suppressed("SC2086", 2));
}
#[test]
fn test_multiple_rules() {
let source = "# bashrs disable-next-line=SC2086,SC2046,DET002\necho $var\n";
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SC2086", 2));
assert!(manager.is_suppressed("SC2046", 2));
assert!(manager.is_suppressed("DET002", 2));
}
#[test]
fn test_no_suppression() {
let source = "echo $var\n";
let manager = SuppressionManager::from_source(source);
assert!(!manager.is_suppressed("SC2086", 1));
}
#[test]
fn test_shorthand_disable_syntax() {
let source = "# bashrs disable=SEC010\nmkdir -p \"${BASELINE_DIR}\"\n";
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SEC010", 2));
assert!(!manager.is_suppressed("SEC010", 1));
assert!(!manager.is_suppressed("SEC010", 3));
}
#[test]
fn test_shorthand_disable_multiple_rules() {
let source = "# bashrs disable=SEC010,DET002\nmkdir -p \"${BASELINE_DIR}\"\n";
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SEC010", 2));
assert!(manager.is_suppressed("DET002", 2));
}
#[test]
fn test_shorthand_does_not_match_specific_patterns() {
let source = "# bashrs disable-file=SEC010\nline2\nline3\n";
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SEC010", 1));
assert!(manager.is_suppressed("SEC010", 2));
assert!(manager.is_suppressed("SEC010", 3));
}
#[test]
fn test_shellcheck_disable_next_line() {
let source = "echo start\n# shellcheck disable=SC2086\necho $var\n";
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SC2086", 3)); assert!(!manager.is_suppressed("SC2086", 1)); assert!(!manager.is_suppressed("SC2086", 2)); }
#[test]
fn test_shellcheck_disable_multiple_rules() {
let source = "# shellcheck disable=SC2086,SC2046,DET002\necho $var\n";
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SC2086", 2));
assert!(manager.is_suppressed("SC2046", 2));
assert!(manager.is_suppressed("DET002", 2));
}
#[test]
fn test_shellcheck_disable_does_not_affect_other_lines() {
let source = "echo start\n# shellcheck disable=SC2086\necho $var\necho $another\n";
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SC2086", 3));
assert!(!manager.is_suppressed("SC2086", 4)); }
#[test]
fn test_mixed_bashrs_and_shellcheck_syntax() {
let source = r#"
# shellcheck disable=SC2086
echo $var
# bashrs disable-next-line=SC2046
echo $(cat file)
"#;
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SC2086", 3));
assert!(manager.is_suppressed("SC2046", 5));
}
#[test]
fn test_shellcheck_file_level_suppression_at_top() {
let source = r#"#!/bin/bash
# shellcheck disable=SC2086
# shellcheck disable=SEC010
set -euo pipefail
echo $var
mkdir -p "$PATH/dir"
"#;
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SC2086", 5)); assert!(manager.is_suppressed("SC2086", 6)); assert!(manager.is_suppressed("SEC010", 6)); }
#[test]
fn test_shellcheck_mid_file_is_next_line_only() {
let source = r#"#!/bin/bash
echo "hello"
# shellcheck disable=SC2086
echo $var
echo $another
"#;
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SC2086", 4)); assert!(!manager.is_suppressed("SC2086", 5)); }
#[test]
fn test_shellcheck_file_level_with_shebang_and_comments() {
let source = r#"#!/usr/bin/env bash
# raid-targets.sh - Symlink Cargo target directories to NVMe RAID
#
# shellcheck disable=SC2145 # $* is intentional for log concatenation
# shellcheck disable=SEC010 # Paths validated via validate_path()
# shellcheck disable=IDEM003 # ln -sfn IS idempotent
set -euo pipefail
log_info() { echo -e "$*"; }
mkdir -p "$RAID_PATH"
ln -sfn "$target" "$link"
"#;
let manager = SuppressionManager::from_source(source);
assert!(manager.is_suppressed("SC2145", 10)); assert!(manager.is_suppressed("SEC010", 11)); assert!(manager.is_suppressed("IDEM003", 12)); }