use harn_rules::{data_table, CompiledRule, Rule, SourceFile};
fn ts(path: &str, source: &str) -> SourceFile {
SourceFile::detect(path, source).unwrap()
}
#[test]
fn destructuring_report_only_table_matches_measurement_style() {
let rule = CompiledRule::compile(
&Rule::from_toml_str(
r#"
id = "destructure-sites"
language = "typescript"
[rule]
pattern = "let $NAME = $SRC?.$KEY ?? $DEFAULT"
"#,
)
.unwrap(),
)
.unwrap();
let files = vec![
ts(
"config.ts",
"let id = src?.userId ?? 0;\nlet name = src?.name ?? \"\";\n",
),
ts("opts.ts", "let count = o?.count ?? 0;\n"),
ts("empty.ts", "const x = 1;\n"),
];
let table = data_table(&rule, &files).unwrap();
assert_eq!(table.summary.total_rows, 3);
assert_eq!(table.summary.files, 2);
assert_eq!(table.summary.per_file["config.ts"], 2);
assert_eq!(table.summary.per_file["opts.ts"], 1);
assert!(!table.summary.per_file.contains_key("empty.ts"));
assert!(table.columns.contains(&"NAME".to_string()));
assert!(table.columns.contains(&"KEY".to_string()));
let aliases = table
.rows
.iter()
.filter(|r| r.bindings["NAME"] != r.bindings["KEY"])
.count();
assert_eq!(aliases, 1);
let json = table.to_json_value();
assert_eq!(json["summary"]["total_rows"], 3);
assert_eq!(json["rule_id"], "destructure-sites");
}