use slicec::diagnostics::{Diagnostic, Diagnostics, Lint};
use slicec::slice_options::SliceOptions;
use slicec::test_helpers::check_diagnostics;
use slicec::utils::file_util::resolve_files_from;
use std::path::PathBuf;
#[test]
fn file_passed_as_source_and_reference_file_is_ignored() {
let mut diagnostics = Diagnostics::new();
let file = PathBuf::from("tests/files/../files/test.slice");
let options = SliceOptions {
sources: vec![file.to_str().unwrap().to_owned()],
references: vec![file.to_str().unwrap().to_owned()],
..Default::default()
};
let files = resolve_files_from(&options, &mut diagnostics);
assert_eq!(files.len(), 1);
assert!(diagnostics.is_empty());
}
#[test]
fn duplicate_source_files_ignored_with_warning() {
let mut diagnostics = Diagnostics::new();
let file_path_one = PathBuf::from("tests/files/test.slice");
let file_path_two = PathBuf::from("tests/files/../files/test.slice");
let options = SliceOptions {
sources: vec![
file_path_one.to_str().unwrap().to_owned(),
file_path_two.to_str().unwrap().to_owned(),
],
..Default::default()
};
let files = resolve_files_from(&options, &mut diagnostics);
assert_eq!(files.len(), 1);
let expected = Diagnostic::new(Lint::DuplicateFile {
path: "tests/files/../files/test.slice".to_owned(),
});
check_diagnostics(diagnostics.into_inner(), [expected]);
}
#[test]
fn duplicate_reference_files_ignored_with_warning() {
let mut diagnostics = Diagnostics::new();
let file_path_one = PathBuf::from("tests/files/test.slice");
let file_path_two = PathBuf::from("tests/files/../files/test.slice");
let options = SliceOptions {
references: vec![
file_path_one.to_str().unwrap().to_owned(),
file_path_two.to_str().unwrap().to_owned(),
],
..Default::default()
};
let files = resolve_files_from(&options, &mut diagnostics);
assert_eq!(files.len(), 1);
let expected = Diagnostic::new(Lint::DuplicateFile {
path: "tests/files/../files/test.slice".to_owned(),
});
check_diagnostics(diagnostics.into_inner(), [expected]);
}
#[test]
fn file_resolution_preserves_order() {
let mut diagnostics = Diagnostics::new();
let file_path_a = PathBuf::from("tests/files/a.slice");
let file_path_b = PathBuf::from("tests/files/b.slice");
let file_path_c = PathBuf::from("tests/files/c.slice");
let file_path_test = PathBuf::from("tests/files/test.slice");
let options = SliceOptions {
sources: vec![
file_path_a.to_str().unwrap().to_owned(),
file_path_b.to_str().unwrap().to_owned(),
file_path_c.to_str().unwrap().to_owned(),
],
references: vec![
file_path_b.to_str().unwrap().to_owned(), file_path_test.to_str().unwrap().to_owned(),
],
..Default::default()
};
let files = resolve_files_from(&options, &mut diagnostics);
assert!(diagnostics.is_empty());
assert_eq!(files.len(), 4);
assert_eq!(files[0].relative_path, "tests/files/a.slice");
assert_eq!(files[1].relative_path, "tests/files/b.slice");
assert_eq!(files[2].relative_path, "tests/files/c.slice");
assert_eq!(files[3].relative_path, "tests/files/test.slice");
}
#[test]
fn compilation_preserves_order() {
let file_path_a = PathBuf::from("tests/files/a.slice");
let file_path_b = PathBuf::from("tests/files/b.slice");
let file_path_c = PathBuf::from("tests/files/c.slice");
let file_path_test = PathBuf::from("tests/files/test.slice");
let options = SliceOptions {
sources: vec![
file_path_a.to_str().unwrap().to_owned(),
file_path_b.to_str().unwrap().to_owned(),
file_path_c.to_str().unwrap().to_owned(),
],
references: vec![
file_path_b.to_str().unwrap().to_owned(), file_path_test.to_str().unwrap().to_owned(),
],
..Default::default()
};
let state = slicec::compile_from_options(&options, |_| {}, |_| {});
assert!(state.diagnostics.is_empty());
let files = &state.files;
assert_eq!(files.len(), 4);
assert_eq!(files[0].relative_path, "tests/files/a.slice");
assert_eq!(files[1].relative_path, "tests/files/b.slice");
assert_eq!(files[2].relative_path, "tests/files/c.slice");
assert_eq!(files[3].relative_path, "tests/files/test.slice");
}