use splice::ingest::imports::{extract_rust_imports, ImportKind};
use std::path::Path;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_extract_simple_crate_use() {
let source = b"use crate::foo::bar;\n";
let imports =
extract_rust_imports(Path::new("/tmp/test.rs"), source).expect("Failed to parse");
assert_eq!(imports.len(), 1);
assert_eq!(imports[0].import_kind, ImportKind::UseCrate);
assert_eq!(imports[0].path, vec!["crate", "foo"]);
assert_eq!(imports[0].imported_names, vec!["bar"]);
assert!(!imports[0].is_glob);
}
#[test]
fn test_extract_super_use() {
let source = b"use super::baz;\n";
let imports =
extract_rust_imports(Path::new("/tmp/test.rs"), source).expect("Failed to parse");
assert_eq!(imports.len(), 1);
assert_eq!(imports[0].import_kind, ImportKind::UseSuper);
assert_eq!(imports[0].path, vec!["super"]);
assert_eq!(imports[0].imported_names, vec!["baz"]);
assert!(!imports[0].is_glob);
}
#[test]
fn test_extract_self_use() {
let source = b"use self::inner::Item;\n";
let imports =
extract_rust_imports(Path::new("/tmp/test.rs"), source).expect("Failed to parse");
assert_eq!(imports.len(), 1);
assert_eq!(imports[0].import_kind, ImportKind::UseSelf);
assert_eq!(imports[0].path, vec!["self", "inner"]);
assert_eq!(imports[0].imported_names, vec!["Item"]);
assert!(!imports[0].is_glob);
}
#[test]
fn test_extract_plain_use() {
let source = b"use std::collections::HashMap;\n";
let imports =
extract_rust_imports(Path::new("/tmp/test.rs"), source).expect("Failed to parse");
assert_eq!(imports.len(), 1);
assert_eq!(imports[0].import_kind, ImportKind::PlainUse);
assert_eq!(imports[0].path, vec!["std", "collections"]);
assert_eq!(imports[0].imported_names, vec!["HashMap"]);
assert!(!imports[0].is_glob);
}
#[test]
fn test_extract_glob_import() {
let source = b"use crate::module::*;\n";
let imports =
extract_rust_imports(Path::new("/tmp/test.rs"), source).expect("Failed to parse");
assert_eq!(imports.len(), 1);
assert_eq!(imports[0].import_kind, ImportKind::UseCrate);
assert_eq!(imports[0].path, vec!["crate", "module"]);
assert!(imports[0].is_glob);
}
#[test]
fn test_extract_braced_import_single() {
let source = b"use crate::module::{Item};\n";
let imports =
extract_rust_imports(Path::new("/tmp/test.rs"), source).expect("Failed to parse");
assert_eq!(imports.len(), 1);
assert_eq!(imports[0].import_kind, ImportKind::UseCrate);
assert_eq!(imports[0].path, vec!["crate", "module"]);
assert_eq!(imports[0].imported_names, vec!["Item"]);
assert!(!imports[0].is_glob);
}
#[test]
fn test_extract_braced_import_multiple() {
let source = b"use crate::module::{foo, bar, baz};\n";
let imports =
extract_rust_imports(Path::new("/tmp/test.rs"), source).expect("Failed to parse");
assert_eq!(imports.len(), 1);
assert_eq!(imports[0].import_kind, ImportKind::UseCrate);
assert_eq!(imports[0].path, vec!["crate", "module"]);
assert_eq!(imports[0].imported_names, vec!["foo", "bar", "baz"]);
assert!(!imports[0].is_glob);
}
#[test]
fn test_extract_renamed_import() {
let source = b"use crate::foo as Bar;\n";
let imports =
extract_rust_imports(Path::new("/tmp/test.rs"), source).expect("Failed to parse");
assert_eq!(imports.len(), 1);
assert_eq!(imports[0].import_kind, ImportKind::UseCrate);
assert_eq!(imports[0].path, vec!["crate"]);
assert_eq!(imports[0].imported_names, vec!["Bar"]);
assert!(!imports[0].is_glob);
}
#[test]
fn test_extract_multiple_use_statements() {
let source = b"
use crate::foo;
use std::vec::Vec;
use super::bar;
";
let imports =
extract_rust_imports(Path::new("/tmp/test.rs"), source).expect("Failed to parse");
assert_eq!(imports.len(), 3);
assert_eq!(imports[0].import_kind, ImportKind::UseCrate);
assert_eq!(imports[0].path, vec!["crate"]);
assert_eq!(imports[0].imported_names, vec!["foo"]);
assert_eq!(imports[1].import_kind, ImportKind::PlainUse);
assert_eq!(imports[1].path, vec!["std", "vec"]);
assert_eq!(imports[1].imported_names, vec!["Vec"]);
assert_eq!(imports[2].import_kind, ImportKind::UseSuper);
assert_eq!(imports[2].path, vec!["super"]);
assert_eq!(imports[2].imported_names, vec!["bar"]);
}
#[test]
fn test_extract_extern_crate_use() {
let source = b"extern crate serde;\nuse serde::Serialize;\n";
let imports =
extract_rust_imports(Path::new("/tmp/test.rs"), source).expect("Failed to parse");
assert_eq!(imports.len(), 1);
assert_eq!(imports[0].import_kind, ImportKind::PlainUse);
assert_eq!(imports[0].path, vec!["serde"]);
assert_eq!(imports[0].imported_names, vec!["Serialize"]);
assert!(!imports[0].is_glob);
}
#[test]
fn test_import_has_byte_span() {
let source = b"use crate::foo;\n";
let imports =
extract_rust_imports(Path::new("/tmp/test.rs"), source).expect("Failed to parse");
assert_eq!(imports.len(), 1);
assert_eq!(imports[0].byte_span, (0, 15));
}
#[test]
fn test_extract_nested_path_use() {
let source = b"use crate::a::b::c::Item;\n";
let imports =
extract_rust_imports(Path::new("/tmp/test.rs"), source).expect("Failed to parse");
assert_eq!(imports.len(), 1);
assert_eq!(imports[0].import_kind, ImportKind::UseCrate);
assert_eq!(imports[0].path, vec!["crate", "a", "b", "c"]);
assert_eq!(imports[0].imported_names, vec!["Item"]);
assert!(!imports[0].is_glob);
}
}