Macro tests

This commit is contained in:
Aleksey Kladov 2020-07-04 15:04:57 +02:00
parent 03ca33406e
commit 216e093f90
2 changed files with 69 additions and 118 deletions

View File

@ -15,130 +15,27 @@ pub(super) fn complete_macro_in_item_position(acc: &mut Completions, ctx: &Compl
#[cfg(test)]
mod tests {
use insta::assert_debug_snapshot;
use expect::{expect, Expect};
use crate::completion::{test_utils::do_completion, CompletionItem, CompletionKind};
use crate::completion::{test_utils::completion_list, CompletionKind};
fn do_reference_completion(code: &str) -> Vec<CompletionItem> {
do_completion(code, CompletionKind::Reference)
fn check(ra_fixture: &str, expect: Expect) {
let actual = completion_list(ra_fixture, CompletionKind::Reference);
expect.assert_eq(&actual)
}
#[test]
fn completes_macros_as_item() {
assert_debug_snapshot!(
do_reference_completion(
"
//- /main.rs
macro_rules! foo {
() => {}
}
check(
r#"
macro_rules! foo { () => {} }
fn foo() {}
fn foo() {}
<|>
"
),
@r###"
[
CompletionItem {
label: "foo!(…)",
source_range: 48..48,
delete: 48..48,
insert: "foo!($0)",
kind: Macro,
detail: "macro_rules! foo",
},
]
"###
);
}
#[test]
fn completes_vec_macros_with_square_brackets() {
assert_debug_snapshot!(
do_reference_completion(
"
//- /main.rs
/// Creates a [`Vec`] containing the arguments.
///
/// - Create a [`Vec`] containing a given list of elements:
///
/// ```
/// let v = vec![1, 2, 3];
/// assert_eq!(v[0], 1);
/// assert_eq!(v[1], 2);
/// assert_eq!(v[2], 3);
/// ```
macro_rules! vec {
() => {}
}
fn foo() {}
<|>
"
),
@r###"
[
CompletionItem {
label: "vec![…]",
source_range: 282..282,
delete: 282..282,
insert: "vec![$0]",
kind: Macro,
detail: "macro_rules! vec",
documentation: Documentation(
"Creates a [`Vec`] containing the arguments.\n\n- Create a [`Vec`] containing a given list of elements:\n\n```\nlet v = vec![1, 2, 3];\nassert_eq!(v[0], 1);\nassert_eq!(v[1], 2);\nassert_eq!(v[2], 3);\n```",
),
},
]
"###
);
}
#[test]
fn completes_macros_braces_guessing() {
assert_debug_snapshot!(
do_reference_completion(
"
//- /main.rs
/// Foo
///
/// Not call `fooo!()` `fooo!()`, or `_foo![]` `_foo![]`.
/// Call as `let _=foo! { hello world };`
macro_rules! foo {
() => {}
}
fn main() {
<|>
}
"
),
@r###"
[
CompletionItem {
label: "foo! {…}",
source_range: 164..164,
delete: 164..164,
insert: "foo! {$0}",
kind: Macro,
detail: "macro_rules! foo",
documentation: Documentation(
"Foo\n\nNot call `fooo!()` `fooo!()`, or `_foo![]` `_foo![]`.\nCall as `let _=foo! { hello world };`",
),
},
CompletionItem {
label: "main()",
source_range: 164..164,
delete: 164..164,
insert: "main()$0",
kind: Function,
lookup: "main",
detail: "fn main()",
},
]
"###
);
<|>
"#,
expect![[r#"
ma foo!() macro_rules! foo
"#]],
)
}
}

View File

@ -174,6 +174,7 @@ pub(crate) fn add_macro(
builder
.insert_snippet(cap, format!("{}!{}$0{}", name, bra, ket))
.label(format!("{}!{}{}", name, bra, ket))
.lookup_by(format!("{}!", name))
}
None if needs_bang => builder.insert_text(format!("{}!", name)),
_ => {
@ -1079,4 +1080,57 @@ fn go(…) []
"#]],
);
}
#[test]
fn guesses_macro_braces() {
check_edit(
"vec!",
r#"
/// Creates a [`Vec`] containing the arguments.
///
/// ```
/// let v = vec![1, 2, 3];
/// assert_eq!(v[0], 1);
/// assert_eq!(v[1], 2);
/// assert_eq!(v[2], 3);
/// ```
macro_rules! vec { () => {} }
fn fn main() { v<|> }
"#,
r#"
/// Creates a [`Vec`] containing the arguments.
///
/// ```
/// let v = vec![1, 2, 3];
/// assert_eq!(v[0], 1);
/// assert_eq!(v[1], 2);
/// assert_eq!(v[2], 3);
/// ```
macro_rules! vec { () => {} }
fn fn main() { vec![$0] }
"#,
);
check_edit(
"foo!",
r#"
/// Foo
///
/// Don't call `fooo!()` `fooo!()`, or `_foo![]` `_foo![]`,
/// call as `let _=foo! { hello world };`
macro_rules! foo { () => {} }
fn main() { <|> }
"#,
r#"
/// Foo
///
/// Don't call `fooo!()` `fooo!()`, or `_foo![]` `_foo![]`,
/// call as `let _=foo! { hello world };`
macro_rules! foo { () => {} }
fn main() { foo! {$0} }
"#,
)
}
}