use swamp_parser::AstParser;
use tracing::warn;
pub fn check(script: &str, expected_output: &str) {
let parser = AstParser {};
let program = parser.parse_module(script).expect("Failed to parse script");
let formatted_output = format!("{program:#?}");
let actual = formatted_output
.lines()
.map(str::trim)
.filter(|line| !line.is_empty())
.collect::<Vec<_>>()
.join("\n");
let expected = expected_output
.lines()
.map(str::trim)
.filter(|line| !line.is_empty())
.collect::<Vec<_>>()
.join("\n");
assert!(
(actual == expected),
"\nExpected output:\n\n{expected}\n\nActual output:\n\n{actual}\n"
);
let mut differences = Vec::new();
for (i, (exp, act)) in expected.lines().zip(actual.lines()).enumerate() {
if exp != act {
differences.push((i + 1, exp, act));
}
}
if !differences.is_empty() {
for (line_num, exp, act) in &differences {
warn!(
"\nDifference at line {}: expected \n{}\n, got \n{}",
line_num, exp, act
);
}
panic!("Differences found between expected and actual output");
}
}