add graph fixture

This commit is contained in:
Aleksey Kladov 2019-02-11 13:11:24 +03:00
parent dced2f4ed4
commit 9923383d53
3 changed files with 81 additions and 71 deletions

View File

@ -18,6 +18,7 @@ fn from(it: $v) -> $e {
}
pub mod db;
#[macro_use]
pub mod mock;
mod query_definitions;
mod path;

View File

@ -55,6 +55,24 @@ pub fn file_id_of(&self, path: &str) -> FileId {
}
}
pub fn set_crate_graph_from_fixture(&mut self, graph: CrateGraphFixture) {
let mut ids = FxHashMap::default();
let mut crate_graph = CrateGraph::default();
for (crate_name, (crate_root, _)) in graph.0.iter() {
let crate_root = self.file_id_of(&crate_root);
let crate_id = crate_graph.add_crate_root(crate_root);
ids.insert(crate_name, crate_id);
}
for (crate_name, (_, deps)) in graph.0.iter() {
let from = ids[crate_name];
for dep in deps {
let to = ids[dep];
crate_graph.add_dep(from, dep.as_str().into(), to).unwrap();
}
}
self.set_crate_graph(Arc::new(crate_graph))
}
fn from_fixture(fixture: &str) -> (MockDatabase, Option<FilePosition>) {
let mut db = MockDatabase::default();
@ -212,3 +230,20 @@ pub fn log_executed(&self, f: impl FnOnce()) -> Vec<String> {
.collect()
}
}
#[derive(Default)]
pub struct CrateGraphFixture(pub FxHashMap<String, (String, Vec<String>)>);
#[macro_export]
macro_rules! crate_graph {
($($crate_name:literal: ($crate_path:literal, [$($dep:literal),*]),)*) => {{
let mut res = $crate::mock::CrateGraphFixture::default();
$(
res.0.insert(
$crate_name.to_string(),
($crate_path.to_string(), vec![$($dep.to_string()),*])
);
)*
res
}}
}

View File

@ -1,6 +1,6 @@
use std::sync::Arc;
use ra_db::{CrateGraph, SourceDatabase};
use ra_db::SourceDatabase;
use test_utils::{assert_eq_text, covers};
use crate::{
@ -19,20 +19,6 @@ fn item_map(fixture: &str) -> (Arc<ItemMap>, ModuleId) {
(db.item_map(krate), module_id)
}
/// Sets the crate root to the file of the cursor marker
fn item_map_custom_crate_root(fixture: &str) -> (Arc<ItemMap>, ModuleId) {
let (mut db, pos) = MockDatabase::with_position(fixture);
let mut crate_graph = CrateGraph::default();
crate_graph.add_crate_root(pos.file_id);
db.set_crate_graph(Arc::new(crate_graph));
let module = crate::source_binder::module_from_position(&db, pos).unwrap();
let krate = module.krate(&db).unwrap();
let module_id = module.module_id;
(db.item_map(krate), module_id)
}
fn check_module_item_map(map: &ItemMap, module_id: ModuleId, expected: &str) {
let mut lines = map[module_id]
.items
@ -258,17 +244,13 @@ fn glob_across_crates() {
//- /lib.rs
pub struct Baz;
",
",
);
db.set_crate_graph_from_fixture(crate_graph! {
"main": ("/main.rs", ["test_crate"]),
"test_crate": ("/lib.rs", []),
});
let main_id = db.file_id_of("/main.rs");
let lib_id = db.file_id_of("/lib.rs");
let mut crate_graph = CrateGraph::default();
let main_crate = crate_graph.add_crate_root(main_id);
let lib_crate = crate_graph.add_crate_root(lib_id);
crate_graph.add_dep(main_crate, "test_crate".into(), lib_crate).unwrap();
db.set_crate_graph(Arc::new(crate_graph));
let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
let krate = module.krate(&db).unwrap();
@ -285,22 +267,31 @@ fn glob_across_crates() {
#[test]
fn module_resolution_works_for_non_standard_filenames() {
let (item_map, module_id) = item_map_custom_crate_root(
let mut db = MockDatabase::with_files(
"
//- /my_library.rs
mod foo;
use self::foo::Bar;
<|>
//- /foo/mod.rs
pub struct Bar;
",
",
);
db.set_crate_graph_from_fixture(crate_graph! {
"my_library": ("/my_library.rs", []),
});
let file_id = db.file_id_of("/my_library.rs");
let module = crate::source_binder::module_from_file_id(&db, file_id).unwrap();
let krate = module.krate(&db).unwrap();
let module_id = module.module_id;
let item_map = db.item_map(krate);
check_module_item_map(
&item_map,
module_id,
"
Bar: t v
foo: t
Bar: t v
foo: t
",
);
}
@ -417,17 +408,13 @@ fn item_map_across_crates() {
//- /lib.rs
pub struct Baz;
",
",
);
db.set_crate_graph_from_fixture(crate_graph! {
"main": ("/main.rs", ["test_crate"]),
"test_crate": ("/lib.rs", []),
});
let main_id = db.file_id_of("/main.rs");
let lib_id = db.file_id_of("/lib.rs");
let mut crate_graph = CrateGraph::default();
let main_crate = crate_graph.add_crate_root(main_id);
let lib_crate = crate_graph.add_crate_root(lib_id);
crate_graph.add_dep(main_crate, "test_crate".into(), lib_crate).unwrap();
db.set_crate_graph(Arc::new(crate_graph));
let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
let krate = module.krate(&db).unwrap();
@ -437,7 +424,7 @@ fn item_map_across_crates() {
&item_map,
module.module_id,
"
Baz: t v
Baz: t v
",
);
}
@ -457,18 +444,13 @@ fn extern_crate_rename() {
//- /lib.rs
struct Arc;
",
",
);
let main_id = db.file_id_of("/main.rs");
db.set_crate_graph_from_fixture(crate_graph! {
"main": ("/main.rs", ["alloc"]),
"alloc": ("/lib.rs", []),
});
let sync_id = db.file_id_of("/sync.rs");
let lib_id = db.file_id_of("/lib.rs");
let mut crate_graph = CrateGraph::default();
let main_crate = crate_graph.add_crate_root(main_id);
let lib_crate = crate_graph.add_crate_root(lib_id);
crate_graph.add_dep(main_crate, "alloc".into(), lib_crate).unwrap();
db.set_crate_graph(Arc::new(crate_graph));
let module = crate::source_binder::module_from_file_id(&db, sync_id).unwrap();
let krate = module.krate(&db).unwrap();
@ -478,7 +460,7 @@ fn extern_crate_rename() {
&item_map,
module.module_id,
"
Arc: t v
Arc: t v
",
);
}
@ -494,21 +476,17 @@ pub mod b {
}
}
//- root /test_crate/
//- root /main/
//- /test_crate/main.rs
//- /main/main.rs
use test_crate::a::b::C;
",
);
let lib_id = db.file_id_of("/lib.rs");
let main_id = db.file_id_of("/test_crate/main.rs");
let mut crate_graph = CrateGraph::default();
let main_crate = crate_graph.add_crate_root(main_id);
let lib_crate = crate_graph.add_crate_root(lib_id);
crate_graph.add_dep(main_crate, "test_crate".into(), lib_crate).unwrap();
db.set_crate_graph(Arc::new(crate_graph));
db.set_crate_graph_from_fixture(crate_graph! {
"main": ("/main/main.rs", ["test_crate"]),
"test_crate": ("/lib.rs", []),
});
let main_id = db.file_id_of("/main/main.rs");
let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
let krate = module.krate(&db).unwrap();
@ -537,17 +515,13 @@ fn reexport_across_crates() {
//- /foo.rs
pub struct Baz;
",
",
);
db.set_crate_graph_from_fixture(crate_graph! {
"main": ("/main.rs", ["test_crate"]),
"test_crate": ("/lib.rs", []),
});
let main_id = db.file_id_of("/main.rs");
let lib_id = db.file_id_of("/lib.rs");
let mut crate_graph = CrateGraph::default();
let main_crate = crate_graph.add_crate_root(main_id);
let lib_crate = crate_graph.add_crate_root(lib_id);
crate_graph.add_dep(main_crate, "test_crate".into(), lib_crate).unwrap();
db.set_crate_graph(Arc::new(crate_graph));
let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
let krate = module.krate(&db).unwrap();
@ -557,7 +531,7 @@ fn reexport_across_crates() {
&item_map,
module.module_id,
"
Baz: t v
Baz: t v
",
);
}