use super::support::*;
use crate::analysis::findings::Severity;
use crate::languages::runner::*;
#[test]
fn warning_run_parses_into_five_findings_in_order() {
let spec = luacheck_like_spec();
let output = concat!(
"sample.lua:1:28: (W212) unused argument 'unused_arg'\n",
"sample.lua:3:3: (W113) accessing undefined variable 'undefined_global_call'\n",
"sample.lua:7:7: (W231) variable 'x' is never accessed\n",
"sample.lua:11:9: (W211) unused variable 'i'\n",
"sample.lua:11:9: (W413) variable 'i' was previously defined as a loop variable on line 10\n",
);
let findings = parse_output(&spec, output, "root").expect("captured luacheck output parses");
assert_eq!(findings.len(), 5);
assert_eq!(findings[0].kind, "luacheck");
assert_eq!(findings[0].severity, Severity::Error);
assert_eq!(findings[0].file_path, "sample.lua");
assert_eq!(findings[0].line, 1);
assert_eq!(findings[0].column, Some(28));
assert_eq!(findings[0].message, "(W212) unused argument 'unused_arg'");
assert!(findings[0].suggestion.is_none());
assert!(!findings[0].asserts_compile_failure);
assert!(findings[0].fingerprint.is_none());
assert_eq!(findings[4].file_path, "sample.lua");
assert_eq!(findings[4].line, 11);
assert_eq!(findings[4].column, Some(9));
assert_eq!(
findings[4].message,
"(W413) variable 'i' was previously defined as a loop variable on line 10"
);
}
#[test]
fn two_findings_on_one_line_and_column_both_survive() {
let spec = luacheck_like_spec();
let output = concat!(
"sample.lua:11:9: (W211) unused variable 'i'\n",
"sample.lua:11:9: (W413) variable 'i' was previously defined as a loop variable on line 10\n",
);
let findings = parse_output(&spec, output, "root").expect("captured luacheck output parses");
assert_eq!(findings.len(), 2);
for finding in &findings {
assert_eq!(finding.file_path, "sample.lua");
assert_eq!(finding.line, 11);
assert_eq!(finding.column, Some(9));
}
assert_eq!(findings[0].message, "(W211) unused variable 'i'");
assert_eq!(
findings[1].message,
"(W413) variable 'i' was previously defined as a loop variable on line 10"
);
}
#[test]
fn syntax_error_line_parses() {
let spec = luacheck_like_spec();
let findings = parse_output(
&spec,
"bad.lua:2:10: (E011) expected '(' near 'end'\n",
"root",
)
.expect("captured luacheck output parses");
assert_eq!(findings.len(), 1);
assert_eq!(findings[0].file_path, "bad.lua");
assert_eq!(findings[0].line, 2);
assert_eq!(findings[0].column, Some(10));
assert_eq!(findings[0].message, "(E011) expected '(' near 'end'");
}
#[test]
fn io_error_line_yields_no_finding() {
let spec = luacheck_like_spec();
let findings = parse_output(
&spec,
"nope.lua: I/O error (couldn't read: No such file or directory)\n",
"root",
)
.expect("captured luacheck output parses");
assert!(findings.is_empty());
}
#[test]
fn clean_run_yields_no_findings() {
let spec = luacheck_like_spec();
let findings = parse_output(&spec, "", "root").expect("empty output parses");
assert!(findings.is_empty());
}
#[test]
fn absolute_path_is_preserved_verbatim() {
let spec = luacheck_like_spec();
let findings = parse_output(
&spec,
"/home/u/proj/init.lua:3:1: (W211) unused variable 'x'\n",
"root",
)
.expect("captured luacheck output parses");
assert_eq!(findings.len(), 1);
assert_eq!(findings[0].file_path, "/home/u/proj/init.lua");
assert_eq!(findings[0].line, 3);
assert_eq!(findings[0].column, Some(1));
assert_eq!(findings[0].message, "(W211) unused variable 'x'");
}