use tempfile::TempDir;
use linecheck::{Config, Rule, Status, check_file};
use super::helpers::{cfg, opts_unlimited, write};
#[test]
fn first_matching_rule_wins() {
let dir = TempDir::new().unwrap();
let path = write(
dir.path(),
"file.txt",
&(0..5).map(|i| format!("line{i}\n")).collect::<String>(),
);
let broad_first = Config {
rules: vec![
Rule {
pattern: "**/*.txt".into(),
warn: Some(10),
warn_message: None,
error: Some(20),
error_message: None,
},
Rule {
pattern: "file.txt".into(),
warn: Some(2),
warn_message: None,
error: Some(5),
error_message: None,
},
],
exclude: vec![],
};
let r = check_file(&path, Some(&broad_first), &opts_unlimited()).unwrap();
assert_eq!(r.status, Status::Ok); assert_eq!(r.warn_limit, Some(10));
let specific_first = Config {
rules: vec![
Rule {
pattern: "file.txt".into(),
warn: Some(2),
warn_message: None,
error: Some(5),
error_message: None,
},
Rule {
pattern: "**/*.txt".into(),
warn: Some(10),
warn_message: None,
error: Some(20),
error_message: None,
},
],
exclude: vec![],
};
let r2 = check_file(&path, Some(&specific_first), &opts_unlimited()).unwrap();
assert_eq!(r2.status, Status::Warn); assert_eq!(r2.warn_limit, Some(2));
}
#[test]
fn rule_message_propagates_to_result() {
let dir = TempDir::new().unwrap();
let warn_cfg = Config {
rules: vec![Rule {
pattern: "**/*.txt".into(),
warn: Some(2),
warn_message: Some("getting long".into()),
error: Some(10),
error_message: Some("too large".into()),
}],
exclude: vec![],
};
let path = write(dir.path(), "a.txt", "1\n2\n3\n"); let r = check_file(&path, Some(&warn_cfg), &opts_unlimited()).unwrap();
assert_eq!(r.status, Status::Warn);
assert_eq!(r.message.as_deref(), Some("getting long"));
let path2 = write(dir.path(), "b.txt", &"x\n".repeat(11)); let r2 = check_file(&path2, Some(&warn_cfg), &opts_unlimited()).unwrap();
assert_eq!(r2.status, Status::Error);
assert_eq!(r2.message.as_deref(), Some("too large"));
let path3 = write(dir.path(), "c.txt", "x\n"); let r3 = check_file(&path3, Some(&cfg(2, 5)), &opts_unlimited()).unwrap();
assert_eq!(r3.status, Status::Ok);
assert_eq!(r3.message, None);
}