From aa644b55859c6b5c6695a5d4fb35d1b6efbbebcc Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Wed, 16 Jun 2021 21:45:02 +0200 Subject: Move test_utils into tests module --- crates/ide_completion/src/completions/attribute.rs | 4 +- .../src/completions/attribute/derive.rs | 4 +- .../src/completions/attribute/lint.rs | 2 +- crates/ide_completion/src/completions/dot.rs | 4 +- crates/ide_completion/src/completions/flyimport.rs | 4 +- crates/ide_completion/src/completions/fn_param.rs | 4 +- crates/ide_completion/src/completions/keyword.rs | 4 +- crates/ide_completion/src/completions/lifetime.rs | 5 +- crates/ide_completion/src/completions/mod_.rs | 4 +- crates/ide_completion/src/completions/pattern.rs | 6 +- crates/ide_completion/src/completions/postfix.rs | 4 +- .../src/completions/qualified_path.rs | 6 +- crates/ide_completion/src/completions/record.rs | 8 +- crates/ide_completion/src/completions/snippet.rs | 4 +- .../ide_completion/src/completions/trait_impl.rs | 4 +- .../src/completions/unqualified_path.rs | 5 +- crates/ide_completion/src/context.rs | 2 +- crates/ide_completion/src/lib.rs | 2 - crates/ide_completion/src/patterns.rs | 4 +- crates/ide_completion/src/render.rs | 2 +- crates/ide_completion/src/render/enum_variant.rs | 2 +- crates/ide_completion/src/render/function.rs | 2 +- crates/ide_completion/src/render/macro_.rs | 2 +- crates/ide_completion/src/test_utils.rs | 154 -------------------- crates/ide_completion/src/tests.rs | 158 +++++++++++++++++---- crates/ide_completion/src/tests/item_list.rs | 32 +++-- 26 files changed, 194 insertions(+), 238 deletions(-) delete mode 100644 crates/ide_completion/src/test_utils.rs (limited to 'crates') diff --git a/crates/ide_completion/src/completions/attribute.rs b/crates/ide_completion/src/completions/attribute.rs index 6df569c2a..3866c5917 100644 --- a/crates/ide_completion/src/completions/attribute.rs +++ b/crates/ide_completion/src/completions/attribute.rs @@ -322,7 +322,7 @@ mod tests { use expect_test::{expect, Expect}; - use crate::{test_utils::completion_list, CompletionKind}; + use crate::{tests::filtered_completion_list, CompletionKind}; #[test] fn attributes_are_sorted() { @@ -341,7 +341,7 @@ mod tests { } fn check(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Attribute); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Attribute); expect.assert_eq(&actual); } diff --git a/crates/ide_completion/src/completions/attribute/derive.rs b/crates/ide_completion/src/completions/attribute/derive.rs index 20bbbba46..5201095e8 100644 --- a/crates/ide_completion/src/completions/attribute/derive.rs +++ b/crates/ide_completion/src/completions/attribute/derive.rs @@ -82,7 +82,7 @@ const DEFAULT_DERIVE_COMPLETIONS: &[DeriveDependencies] = &[ mod tests { use expect_test::{expect, Expect}; - use crate::{test_utils::completion_list, CompletionKind}; + use crate::{tests::filtered_completion_list, CompletionKind}; fn check(ra_fixture: &str, expect: Expect) { let builtin_derives = r#" @@ -106,7 +106,7 @@ pub macro PartialOrd {} pub macro Ord {} "#; - let actual = completion_list( + let actual = filtered_completion_list( &format!("{} {}", builtin_derives, ra_fixture), CompletionKind::Attribute, ); diff --git a/crates/ide_completion/src/completions/attribute/lint.rs b/crates/ide_completion/src/completions/attribute/lint.rs index ca99e9759..4812b075c 100644 --- a/crates/ide_completion/src/completions/attribute/lint.rs +++ b/crates/ide_completion/src/completions/attribute/lint.rs @@ -34,7 +34,7 @@ pub(super) fn complete_lint( #[cfg(test)] mod tests { - use crate::test_utils::check_edit; + use crate::tests::check_edit; #[test] fn check_empty() { diff --git a/crates/ide_completion/src/completions/dot.rs b/crates/ide_completion/src/completions/dot.rs index 9552875c1..7f75d4298 100644 --- a/crates/ide_completion/src/completions/dot.rs +++ b/crates/ide_completion/src/completions/dot.rs @@ -101,10 +101,10 @@ fn complete_methods( mod tests { use expect_test::{expect, Expect}; - use crate::{test_utils::completion_list, CompletionKind}; + use crate::{tests::filtered_completion_list, CompletionKind}; fn check(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Reference); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Reference); expect.assert_eq(&actual); } diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index 30b8d44bd..4604feb5d 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs @@ -227,11 +227,11 @@ mod tests { use crate::{ item::CompletionKind, - test_utils::{check_edit, check_edit_with_config, completion_list, TEST_CONFIG}, + tests::{check_edit, check_edit_with_config, filtered_completion_list, TEST_CONFIG}, }; fn check(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Magic); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Magic); expect.assert_eq(&actual); } diff --git a/crates/ide_completion/src/completions/fn_param.rs b/crates/ide_completion/src/completions/fn_param.rs index cb90e8a3e..c9f0e2473 100644 --- a/crates/ide_completion/src/completions/fn_param.rs +++ b/crates/ide_completion/src/completions/fn_param.rs @@ -64,10 +64,10 @@ pub(crate) fn complete_fn_param(acc: &mut Completions, ctx: &CompletionContext) mod tests { use expect_test::{expect, Expect}; - use crate::{test_utils::completion_list, CompletionKind}; + use crate::{tests::filtered_completion_list, CompletionKind}; fn check(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Magic); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Magic); expect.assert_eq(&actual); } diff --git a/crates/ide_completion/src/completions/keyword.rs b/crates/ide_completion/src/completions/keyword.rs index 0a3df79d4..73bbc4345 100644 --- a/crates/ide_completion/src/completions/keyword.rs +++ b/crates/ide_completion/src/completions/keyword.rs @@ -190,12 +190,12 @@ mod tests { use expect_test::{expect, Expect}; use crate::{ - test_utils::{check_edit, completion_list}, + tests::{check_edit, filtered_completion_list}, CompletionKind, }; fn check(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Keyword); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Keyword); expect.assert_eq(&actual) } diff --git a/crates/ide_completion/src/completions/lifetime.rs b/crates/ide_completion/src/completions/lifetime.rs index 8ccccb646..36f595164 100644 --- a/crates/ide_completion/src/completions/lifetime.rs +++ b/crates/ide_completion/src/completions/lifetime.rs @@ -50,7 +50,7 @@ mod tests { use expect_test::{expect, Expect}; use crate::{ - test_utils::{check_edit, completion_list_with_config, TEST_CONFIG}, + tests::{check_edit, filtered_completion_list_with_config, TEST_CONFIG}, CompletionConfig, CompletionKind, }; @@ -59,7 +59,8 @@ mod tests { } fn check_with_config(config: CompletionConfig, ra_fixture: &str, expect: Expect) { - let actual = completion_list_with_config(config, ra_fixture, CompletionKind::Reference); + let actual = + filtered_completion_list_with_config(config, ra_fixture, CompletionKind::Reference); expect.assert_eq(&actual) } diff --git a/crates/ide_completion/src/completions/mod_.rs b/crates/ide_completion/src/completions/mod_.rs index 6a5746fb9..5def0d06a 100644 --- a/crates/ide_completion/src/completions/mod_.rs +++ b/crates/ide_completion/src/completions/mod_.rs @@ -141,11 +141,11 @@ fn module_chain_to_containing_module_file( #[cfg(test)] mod tests { - use crate::{test_utils::completion_list, CompletionKind}; + use crate::{tests::filtered_completion_list, CompletionKind}; use expect_test::{expect, Expect}; fn check(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Magic); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Magic); expect.assert_eq(&actual); } diff --git a/crates/ide_completion/src/completions/pattern.rs b/crates/ide_completion/src/completions/pattern.rs index e45b2a1ea..efe3c957a 100644 --- a/crates/ide_completion/src/completions/pattern.rs +++ b/crates/ide_completion/src/completions/pattern.rs @@ -61,17 +61,17 @@ mod tests { use expect_test::{expect, Expect}; use crate::{ - test_utils::{check_edit, completion_list}, + tests::{check_edit, filtered_completion_list}, CompletionKind, }; fn check(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Reference); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Reference); expect.assert_eq(&actual) } fn check_snippet(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Snippet); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Snippet); expect.assert_eq(&actual) } diff --git a/crates/ide_completion/src/completions/postfix.rs b/crates/ide_completion/src/completions/postfix.rs index 9f98b21be..c3c7e4589 100644 --- a/crates/ide_completion/src/completions/postfix.rs +++ b/crates/ide_completion/src/completions/postfix.rs @@ -307,12 +307,12 @@ mod tests { use expect_test::{expect, Expect}; use crate::{ - test_utils::{check_edit, completion_list}, + tests::{check_edit, filtered_completion_list}, CompletionKind, }; fn check(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Postfix); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Postfix); expect.assert_eq(&actual) } diff --git a/crates/ide_completion/src/completions/qualified_path.rs b/crates/ide_completion/src/completions/qualified_path.rs index 165b9e6a5..9432caa22 100644 --- a/crates/ide_completion/src/completions/qualified_path.rs +++ b/crates/ide_completion/src/completions/qualified_path.rs @@ -198,17 +198,17 @@ mod tests { use expect_test::{expect, Expect}; use crate::{ - test_utils::{check_edit, completion_list}, + tests::{check_edit, filtered_completion_list}, CompletionKind, }; fn check(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Reference); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Reference); expect.assert_eq(&actual); } fn check_builtin(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::BuiltinType); + let actual = filtered_completion_list(ra_fixture, CompletionKind::BuiltinType); expect.assert_eq(&actual); } diff --git a/crates/ide_completion/src/completions/record.rs b/crates/ide_completion/src/completions/record.rs index 0ac47cdbe..47523f72f 100644 --- a/crates/ide_completion/src/completions/record.rs +++ b/crates/ide_completion/src/completions/record.rs @@ -51,17 +51,17 @@ mod tests { use ide_db::helpers::FamousDefs; use crate::{ - test_utils::{self, completion_list}, + tests::{self, filtered_completion_list}, CompletionKind, }; fn check(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Reference); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Reference); expect.assert_eq(&actual); } fn check_snippet(ra_fixture: &str, expect: Expect) { - let actual = completion_list( + let actual = filtered_completion_list( &format!("//- /main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE), CompletionKind::Snippet, ); @@ -69,7 +69,7 @@ mod tests { } fn check_edit(what: &str, ra_fixture_before: &str, ra_fixture_after: &str) { - test_utils::check_edit( + tests::check_edit( what, &format!( "//- /main.rs crate:main deps:core{}\n{}", diff --git a/crates/ide_completion/src/completions/snippet.rs b/crates/ide_completion/src/completions/snippet.rs index d142265e0..81ddfa34f 100644 --- a/crates/ide_completion/src/completions/snippet.rs +++ b/crates/ide_completion/src/completions/snippet.rs @@ -87,10 +87,10 @@ fn ${1:feature}() { mod tests { use expect_test::{expect, Expect}; - use crate::{test_utils::completion_list, CompletionKind}; + use crate::{tests::filtered_completion_list, CompletionKind}; fn check(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Snippet); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Snippet); expect.assert_eq(&actual) } diff --git a/crates/ide_completion/src/completions/trait_impl.rs b/crates/ide_completion/src/completions/trait_impl.rs index a60e5f43c..dc1d198cc 100644 --- a/crates/ide_completion/src/completions/trait_impl.rs +++ b/crates/ide_completion/src/completions/trait_impl.rs @@ -246,12 +246,12 @@ mod tests { use expect_test::{expect, Expect}; use crate::{ - test_utils::{check_edit, completion_list}, + tests::{check_edit, filtered_completion_list}, CompletionKind, }; fn check(ra_fixture: &str, expect: Expect) { - let actual = completion_list(ra_fixture, CompletionKind::Magic); + let actual = filtered_completion_list(ra_fixture, CompletionKind::Magic); expect.assert_eq(&actual) } diff --git a/crates/ide_completion/src/completions/unqualified_path.rs b/crates/ide_completion/src/completions/unqualified_path.rs index 3910de2c4..2868d9b18 100644 --- a/crates/ide_completion/src/completions/unqualified_path.rs +++ b/crates/ide_completion/src/completions/unqualified_path.rs @@ -93,7 +93,7 @@ mod tests { use expect_test::{expect, Expect}; use crate::{ - test_utils::{check_edit, completion_list_with_config, TEST_CONFIG}, + tests::{check_edit, filtered_completion_list_with_config, TEST_CONFIG}, CompletionConfig, CompletionKind, }; @@ -102,7 +102,8 @@ mod tests { } fn check_with_config(config: CompletionConfig, ra_fixture: &str, expect: Expect) { - let actual = completion_list_with_config(config, ra_fixture, CompletionKind::Reference); + let actual = + filtered_completion_list_with_config(config, ra_fixture, CompletionKind::Reference); expect.assert_eq(&actual) } diff --git a/crates/ide_completion/src/context.rs b/crates/ide_completion/src/context.rs index 441c080b1..121909857 100644 --- a/crates/ide_completion/src/context.rs +++ b/crates/ide_completion/src/context.rs @@ -695,7 +695,7 @@ mod tests { use expect_test::{expect, Expect}; use hir::HirDisplay; - use crate::test_utils::{position, TEST_CONFIG}; + use crate::tests::{position, TEST_CONFIG}; use super::CompletionContext; diff --git a/crates/ide_completion/src/lib.rs b/crates/ide_completion/src/lib.rs index be6442426..bf73818dc 100644 --- a/crates/ide_completion/src/lib.rs +++ b/crates/ide_completion/src/lib.rs @@ -9,8 +9,6 @@ mod render; #[cfg(test)] mod tests; -#[cfg(test)] -mod test_utils; use completions::flyimport::position_for_import; use ide_db::{ diff --git a/crates/ide_completion/src/patterns.rs b/crates/ide_completion/src/patterns.rs index 02cfe91e1..62e4334de 100644 --- a/crates/ide_completion/src/patterns.rs +++ b/crates/ide_completion/src/patterns.rs @@ -11,7 +11,7 @@ use syntax::{ }; #[cfg(test)] -use crate::test_utils::{check_pattern_is_applicable, check_pattern_is_not_applicable}; +use crate::tests::{check_pattern_is_applicable, check_pattern_is_not_applicable}; /// Immediate previous node to what we are completing. #[derive(Copy, Clone, Debug, PartialEq, Eq)] @@ -324,7 +324,7 @@ fn previous_non_trivia_token(token: SyntaxToken) -> Option { mod tests { use syntax::algo::find_node_at_offset; - use crate::test_utils::position; + use crate::tests::position; use super::*; diff --git a/crates/ide_completion/src/render.rs b/crates/ide_completion/src/render.rs index 2bd2c44d0..4b55f7504 100644 --- a/crates/ide_completion/src/render.rs +++ b/crates/ide_completion/src/render.rs @@ -335,7 +335,7 @@ mod tests { use crate::{ item::CompletionRelevanceTypeMatch, - test_utils::{check_edit, do_completion, get_all_items, TEST_CONFIG}, + tests::{check_edit, do_completion, get_all_items, TEST_CONFIG}, CompletionKind, CompletionRelevance, }; diff --git a/crates/ide_completion/src/render/enum_variant.rs b/crates/ide_completion/src/render/enum_variant.rs index 28f056e77..91dc178f3 100644 --- a/crates/ide_completion/src/render/enum_variant.rs +++ b/crates/ide_completion/src/render/enum_variant.rs @@ -121,7 +121,7 @@ impl<'a> EnumRender<'a> { #[cfg(test)] mod tests { - use crate::test_utils::check_edit; + use crate::tests::check_edit; #[test] fn inserts_parens_for_tuple_enums() { diff --git a/crates/ide_completion/src/render/function.rs b/crates/ide_completion/src/render/function.rs index 1357b9f4a..19f2c86e9 100644 --- a/crates/ide_completion/src/render/function.rs +++ b/crates/ide_completion/src/render/function.rs @@ -191,7 +191,7 @@ impl<'a> FunctionRender<'a> { #[cfg(test)] mod tests { use crate::{ - test_utils::{check_edit, check_edit_with_config, TEST_CONFIG}, + tests::{check_edit, check_edit_with_config, TEST_CONFIG}, CompletionConfig, }; diff --git a/crates/ide_completion/src/render/macro_.rs b/crates/ide_completion/src/render/macro_.rs index 3a7238bb8..d5a1f45d3 100644 --- a/crates/ide_completion/src/render/macro_.rs +++ b/crates/ide_completion/src/render/macro_.rs @@ -133,7 +133,7 @@ fn guess_macro_braces(macro_name: &str, docs: &str) -> (&'static str, &'static s #[cfg(test)] mod tests { - use crate::test_utils::check_edit; + use crate::tests::check_edit; #[test] fn dont_insert_macro_call_parens_unncessary() { diff --git a/crates/ide_completion/src/test_utils.rs b/crates/ide_completion/src/test_utils.rs deleted file mode 100644 index b0a4b2026..000000000 --- a/crates/ide_completion/src/test_utils.rs +++ /dev/null @@ -1,154 +0,0 @@ -//! Runs completion for testing purposes. - -use hir::{PrefixKind, Semantics}; -use ide_db::{ - base_db::{fixture::ChangeFixture, FileLoader, FilePosition}, - helpers::{ - insert_use::{ImportGranularity, InsertUseConfig}, - SnippetCap, - }, - RootDatabase, -}; -use itertools::Itertools; -use stdx::{format_to, trim_indent}; -use syntax::{AstNode, NodeOrToken, SyntaxElement}; -use test_utils::assert_eq_text; - -use crate::{item::CompletionKind, CompletionConfig, CompletionItem}; - -pub(crate) const TEST_CONFIG: CompletionConfig = CompletionConfig { - enable_postfix_completions: true, - enable_imports_on_the_fly: true, - enable_self_on_the_fly: true, - add_call_parenthesis: true, - add_call_argument_snippets: true, - snippet_cap: SnippetCap::new(true), - insert_use: InsertUseConfig { - granularity: ImportGranularity::Crate, - prefix_kind: PrefixKind::Plain, - enforce_granularity: true, - group: true, - }, -}; - -/// Creates analysis from a multi-file fixture, returns positions marked with $0. -pub(crate) fn position(ra_fixture: &str) -> (RootDatabase, FilePosition) { - let change_fixture = ChangeFixture::parse(ra_fixture); - let mut database = RootDatabase::default(); - database.apply_change(change_fixture.change); - let (file_id, range_or_offset) = change_fixture.file_position.expect("expected a marker ($0)"); - let offset = range_or_offset.expect_offset(); - (database, FilePosition { file_id, offset }) -} - -pub(crate) fn do_completion(code: &str, kind: CompletionKind) -> Vec { - do_completion_with_config(TEST_CONFIG, code, kind) -} - -pub(crate) fn do_completion_with_config( - config: CompletionConfig, - code: &str, - kind: CompletionKind, -) -> Vec { - get_all_items(config, code) - .into_iter() - .filter(|c| c.completion_kind == kind) - .sorted_by(|l, r| l.label().cmp(r.label())) - .collect() -} - -pub(crate) fn completion_list(code: &str, kind: CompletionKind) -> String { - completion_list_with_config(TEST_CONFIG, code, kind) -} - -pub(crate) fn completion_list_with_config( - config: CompletionConfig, - code: &str, - kind: CompletionKind, -) -> String { - let kind_completions: Vec = - get_all_items(config, code).into_iter().filter(|c| c.completion_kind == kind).collect(); - let label_width = kind_completions - .iter() - .map(|it| monospace_width(it.label())) - .max() - .unwrap_or_default() - .min(16); - kind_completions - .into_iter() - .map(|it| { - let tag = it.kind().unwrap().tag(); - let var_name = format!("{} {}", tag, it.label()); - let mut buf = var_name; - if let Some(detail) = it.detail() { - let width = label_width.saturating_sub(monospace_width(it.label())); - format_to!(buf, "{:width$} {}", "", detail, width = width); - } - if it.deprecated() { - format_to!(buf, " DEPRECATED"); - } - format_to!(buf, "\n"); - buf - }) - .collect() -} - -fn monospace_width(s: &str) -> usize { - s.chars().count() -} - -pub(crate) fn check_edit(what: &str, ra_fixture_before: &str, ra_fixture_after: &str) { - check_edit_with_config(TEST_CONFIG, what, ra_fixture_before, ra_fixture_after) -} - -pub(crate) fn check_edit_with_config( - config: CompletionConfig, - what: &str, - ra_fixture_before: &str, - ra_fixture_after: &str, -) { - let ra_fixture_after = trim_indent(ra_fixture_after); - let (db, position) = position(ra_fixture_before); - let completions: Vec = - crate::completions(&db, &config, position).unwrap().into(); - let (completion,) = completions - .iter() - .filter(|it| it.lookup() == what) - .collect_tuple() - .unwrap_or_else(|| panic!("can't find {:?} completion in {:#?}", what, completions)); - let mut actual = db.file_text(position.file_id).to_string(); - - let mut combined_edit = completion.text_edit().to_owned(); - if let Some(import_text_edit) = - completion.import_to_add().and_then(|edit| edit.to_text_edit(config.insert_use)) - { - combined_edit.union(import_text_edit).expect( - "Failed to apply completion resolve changes: change ranges overlap, but should not", - ) - } - - combined_edit.apply(&mut actual); - assert_eq_text!(&ra_fixture_after, &actual) -} - -pub(crate) fn check_pattern_is_applicable(code: &str, check: impl FnOnce(SyntaxElement) -> bool) { - let (db, pos) = position(code); - - let sema = Semantics::new(&db); - let original_file = sema.parse(pos.file_id); - let token = original_file.syntax().token_at_offset(pos.offset).left_biased().unwrap(); - assert!(check(NodeOrToken::Token(token))); -} - -pub(crate) fn check_pattern_is_not_applicable(code: &str, check: fn(SyntaxElement) -> bool) { - let (db, pos) = position(code); - let sema = Semantics::new(&db); - let original_file = sema.parse(pos.file_id); - let token = original_file.syntax().token_at_offset(pos.offset).left_biased().unwrap(); - assert!(!check(NodeOrToken::Token(token))); -} - -pub(crate) fn get_all_items(config: CompletionConfig, code: &str) -> Vec { - let (db, position) = position(code); - crate::completions(&db, &config, position).unwrap().into() -} diff --git a/crates/ide_completion/src/tests.rs b/crates/ide_completion/src/tests.rs index 2205603fa..1495924ea 100644 --- a/crates/ide_completion/src/tests.rs +++ b/crates/ide_completion/src/tests.rs @@ -1,11 +1,34 @@ mod item_list; -use expect_test::Expect; -use stdx::format_to; +use hir::{PrefixKind, Semantics}; +use ide_db::{ + base_db::{fixture::ChangeFixture, FileLoader, FilePosition}, + helpers::{ + insert_use::{ImportGranularity, InsertUseConfig}, + SnippetCap, + }, + RootDatabase, +}; +use itertools::Itertools; +use stdx::{format_to, trim_indent}; +use syntax::{AstNode, NodeOrToken, SyntaxElement}; +use test_utils::assert_eq_text; + +use crate::{item::CompletionKind, CompletionConfig, CompletionItem}; -use crate::{ - test_utils::{self, get_all_items, TEST_CONFIG}, - CompletionConfig, CompletionItem, +pub(crate) const TEST_CONFIG: CompletionConfig = CompletionConfig { + enable_postfix_completions: true, + enable_imports_on_the_fly: true, + enable_self_on_the_fly: true, + add_call_parenthesis: true, + add_call_argument_snippets: true, + snippet_cap: SnippetCap::new(true), + insert_use: InsertUseConfig { + granularity: ImportGranularity::Crate, + prefix_kind: PrefixKind::Plain, + enforce_granularity: true, + group: true, + }, }; fn completion_list(code: &str) -> String { @@ -13,18 +36,56 @@ fn completion_list(code: &str) -> String { } fn completion_list_with_config(config: CompletionConfig, code: &str) -> String { + render_completion_list(get_all_items(config, code)) +} + +/// Creates analysis from a multi-file fixture, returns positions marked with $0. +pub(crate) fn position(ra_fixture: &str) -> (RootDatabase, FilePosition) { + let change_fixture = ChangeFixture::parse(ra_fixture); + let mut database = RootDatabase::default(); + database.apply_change(change_fixture.change); + let (file_id, range_or_offset) = change_fixture.file_position.expect("expected a marker ($0)"); + let offset = range_or_offset.expect_offset(); + (database, FilePosition { file_id, offset }) +} + +pub(crate) fn do_completion(code: &str, kind: CompletionKind) -> Vec { + do_completion_with_config(TEST_CONFIG, code, kind) +} + +pub(crate) fn do_completion_with_config( + config: CompletionConfig, + code: &str, + kind: CompletionKind, +) -> Vec { + get_all_items(config, code) + .into_iter() + .filter(|c| c.completion_kind == kind) + .sorted_by(|l, r| l.label().cmp(r.label())) + .collect() +} + +pub(crate) fn filtered_completion_list(code: &str, kind: CompletionKind) -> String { + filtered_completion_list_with_config(TEST_CONFIG, code, kind) +} + +pub(crate) fn filtered_completion_list_with_config( + config: CompletionConfig, + code: &str, + kind: CompletionKind, +) -> String { + let kind_completions: Vec = + get_all_items(config, code).into_iter().filter(|c| c.completion_kind == kind).collect(); + render_completion_list(kind_completions) +} + +fn render_completion_list(completions: Vec) -> String { fn monospace_width(s: &str) -> usize { s.chars().count() } - - let kind_completions: Vec = get_all_items(config, code).into_iter().collect(); - let label_width = kind_completions - .iter() - .map(|it| monospace_width(it.label())) - .max() - .unwrap_or_default() - .min(16); - kind_completions + let label_width = + completions.iter().map(|it| monospace_width(it.label())).max().unwrap_or_default().min(16); + completions .into_iter() .map(|it| { let tag = it.kind().unwrap().tag(); @@ -43,23 +104,64 @@ fn completion_list_with_config(config: CompletionConfig, code: &str) -> String { .collect() } -fn check(ra_fixture: &str, expect: Expect) { - let base = r#"#[rustc_builtin_macro] -pub macro Clone {} -enum Enum { Variant } -struct Struct {} -#[macro_export] -macro_rules! foo {} -mod bar {} -const CONST: () = (); -trait Trait {} -"#; - let actual = completion_list(&format!("{}{}", base, ra_fixture)); - expect.assert_eq(&actual) +pub(crate) fn check_edit(what: &str, ra_fixture_before: &str, ra_fixture_after: &str) { + check_edit_with_config(TEST_CONFIG, what, ra_fixture_before, ra_fixture_after) +} + +pub(crate) fn check_edit_with_config( + config: CompletionConfig, + what: &str, + ra_fixture_before: &str, + ra_fixture_after: &str, +) { + let ra_fixture_after = trim_indent(ra_fixture_after); + let (db, position) = position(ra_fixture_before); + let completions: Vec = + crate::completions(&db, &config, position).unwrap().into(); + let (completion,) = completions + .iter() + .filter(|it| it.lookup() == what) + .collect_tuple() + .unwrap_or_else(|| panic!("can't find {:?} completion in {:#?}", what, completions)); + let mut actual = db.file_text(position.file_id).to_string(); + + let mut combined_edit = completion.text_edit().to_owned(); + if let Some(import_text_edit) = + completion.import_to_add().and_then(|edit| edit.to_text_edit(config.insert_use)) + { + combined_edit.union(import_text_edit).expect( + "Failed to apply completion resolve changes: change ranges overlap, but should not", + ) + } + + combined_edit.apply(&mut actual); + assert_eq_text!(&ra_fixture_after, &actual) +} + +pub(crate) fn check_pattern_is_applicable(code: &str, check: impl FnOnce(SyntaxElement) -> bool) { + let (db, pos) = position(code); + + let sema = Semantics::new(&db); + let original_file = sema.parse(pos.file_id); + let token = original_file.syntax().token_at_offset(pos.offset).left_biased().unwrap(); + assert!(check(NodeOrToken::Token(token))); +} + +pub(crate) fn check_pattern_is_not_applicable(code: &str, check: fn(SyntaxElement) -> bool) { + let (db, pos) = position(code); + let sema = Semantics::new(&db); + let original_file = sema.parse(pos.file_id); + let token = original_file.syntax().token_at_offset(pos.offset).left_biased().unwrap(); + assert!(!check(NodeOrToken::Token(token))); +} + +pub(crate) fn get_all_items(config: CompletionConfig, code: &str) -> Vec { + let (db, position) = position(code); + crate::completions(&db, &config, position).unwrap().into() } fn check_no_completion(ra_fixture: &str) { - let (db, position) = test_utils::position(ra_fixture); + let (db, position) = position(ra_fixture); assert!( crate::completions(&db, &TEST_CONFIG, position).is_none(), diff --git a/crates/ide_completion/src/tests/item_list.rs b/crates/ide_completion/src/tests/item_list.rs index 33b23b8b4..7c124ac37 100644 --- a/crates/ide_completion/src/tests/item_list.rs +++ b/crates/ide_completion/src/tests/item_list.rs @@ -1,14 +1,26 @@ -use expect_test::expect; +use expect_test::{expect, Expect}; -use crate::tests::check; +use crate::tests::completion_list; + +fn check(ra_fixture: &str, expect: Expect) { + let base = r#"#[rustc_builtin_macro] +pub macro Clone {} +enum Enum { Variant } +struct Struct {} +#[macro_export] +macro_rules! foo {} +mod bar {} +const CONST: () = (); +trait Trait {} +"#; + let actual = completion_list(&format!("{}{}", base, ra_fixture)); + expect.assert_eq(&actual) +} #[test] fn in_mod_item_list() { check( - r#"mod tests { - $0 -} -"#, + r#"mod tests { $0 }"#, expect![[r##" kw pub(crate) kw pub @@ -164,9 +176,7 @@ fn after_visibility_unsafe() { #[test] fn in_impl_assoc_item_list() { check( - r#"impl Struct { - $0 -}"#, + r#"impl Struct { $0 }"#, expect![[r##" kw pub(crate) kw pub @@ -184,9 +194,7 @@ fn in_impl_assoc_item_list() { #[test] fn in_impl_assoc_item_list_after_attr() { check( - r#"impl Struct { - #[attr] $0 -}"#, + r#"impl Struct { #[attr] $0 }"#, expect![[r#" kw pub(crate) kw pub -- cgit v1.2.3