use std::path::Path;
use std::process::Command;
const MATCHING: &[&str] = &[
"debug-string",
"debug-values",
"warn-plain",
"warn-interpolated",
"warn-in-mixin",
"error-plain",
"error-interpolated",
"error-in-mixin",
"error-stack-nested",
"error-in-function",
"error-cross-file",
"compile-undefined-variable",
"compile-undefined-variable-stack",
"compile-tab-expansion",
"compile-gutter-alignment",
"deprecation-import",
];
fn fixtures_dir() -> std::path::PathBuf {
Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/diagnostics")
}
fn run_sasso_stderr(name: &str) -> String {
let bin = env!("CARGO_BIN_EXE_sasso");
let out = Command::new(bin)
.current_dir(fixtures_dir())
.arg("--no-unicode")
.arg(format!("{name}.scss"))
.output()
.expect("run sasso");
String::from_utf8_lossy(&out.stderr).into_owned()
}
#[test]
fn diagnostics_match_dart_ascii_fixtures() {
let dir = fixtures_dir();
for name in MATCHING {
let expected = std::fs::read_to_string(dir.join(format!("{name}.ascii.stderr")))
.unwrap_or_else(|e| panic!("read {name}.ascii.stderr: {e}"));
let got = run_sasso_stderr(name);
assert_eq!(got, expected, "stderr mismatch for fixture {name}");
}
}
#[test]
fn diagnostics_exit_codes() {
let bin = env!("CARGO_BIN_EXE_sasso");
let dir = fixtures_dir();
let error_code = Command::new(bin)
.current_dir(&dir)
.arg("--no-unicode")
.arg("error-plain.scss")
.output()
.expect("run")
.status
.code();
assert_eq!(error_code, Some(65), "@error must exit 65");
let warn_code = Command::new(bin)
.current_dir(&dir)
.arg("--no-unicode")
.arg("warn-plain.scss")
.output()
.expect("run")
.status
.code();
assert_eq!(warn_code, Some(0), "@warn must exit 0");
}
#[test]
fn invalid_utf8_input_exits_65() {
let bin = env!("CARGO_BIN_EXE_sasso");
let dir = std::env::temp_dir().join(format!("sasso_invalid_utf8_{}", std::process::id()));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).expect("create temp dir");
let input = dir.join("input.scss");
std::fs::write(&input, b"foo{;\xF6\xFC").expect("write invalid utf8");
let out = Command::new(bin).arg(&input).output().expect("run");
let _ = std::fs::remove_dir_all(&dir);
assert_eq!(out.status.code(), Some(65));
assert_eq!(String::from_utf8_lossy(&out.stderr), "Error: Invalid UTF-8.\n");
}