rust/crates/ide-completion/src/tests/record.rs

238 lines
4.2 KiB
Rust

use expect_test::{expect, Expect};
use crate::tests::completion_list;
fn check(ra_fixture: &str, expect: Expect) {
let actual = completion_list(ra_fixture);
expect.assert_eq(&actual);
}
#[test]
fn without_default_impl() {
cov_mark::check!(no_keyword_completion_in_record_lit);
check(
r#"
struct Struct { foo: u32, bar: usize }
fn foo() {
let other = Struct {
foo: 5,
$0
};
}
"#,
expect![[r#"
fd bar usize
"#]],
);
}
#[test]
fn record_pattern_field() {
check(
r#"
struct Struct { foo: u32, bar: u32 }
fn foo(s: Struct) {
match s {
Struct { foo, $0: 92 } => (),
}
}
"#,
expect![[r#"
fd bar u32
kw mut
kw ref
"#]],
);
}
#[test]
fn pattern_enum_variant() {
check(
r#"
enum Enum { Variant { foo: u32, bar: u32 } }
fn foo(e: Enum) {
match e {
Enum::Variant { foo, $0 } => (),
}
}
"#,
expect![[r#"
fd bar u32
kw mut
kw ref
"#]],
);
}
#[test]
fn record_literal_field_in_macro() {
check(
r#"
macro_rules! m { ($e:expr) => { $e } }
struct Struct { field: u32 }
fn foo() {
m!(Struct { fie$0 })
}
"#,
expect![[r#"
fd field u32
"#]],
);
}
#[test]
fn record_pattern_field_in_macro() {
check(
r"
macro_rules! m { ($e:expr) => { $e } }
struct Struct { field: u32 }
fn foo(f: Struct) {
m!(match f {
Struct { f$0: 92 } => (),
})
}
",
expect![[r#"
fd field u32
kw mut
kw ref
"#]],
);
}
#[test]
fn functional_update() {
// FIXME: This should filter out all completions that do not have the type `Foo`
// FIXME: Fields should not show up after `.`
check(
r#"
//- minicore:default
struct Foo { foo1: u32, foo2: u32 }
impl Default for Foo {
fn default() -> Self { loop {} }
}
fn main() {
let thing = 1;
let foo = Foo { foo1: 0, foo2: 0 };
let foo2 = Foo { thing, $0 }
}
"#,
expect![[r#"
fd ..Default::default()
fd foo1 u32
fd foo2 u32
"#]],
);
check(
r#"
//- minicore:default
struct Foo { foo1: u32, foo2: u32 }
impl Default for Foo {
fn default() -> Self { loop {} }
}
fn main() {
let thing = 1;
let foo = Foo { foo1: 0, foo2: 0 };
let foo2 = Foo { thing, .$0 }
}
"#,
expect![[r#"
fd ..Default::default()
sn ..
"#]],
);
check(
r#"
//- minicore:default
struct Foo { foo1: u32, foo2: u32 }
impl Default for Foo {
fn default() -> Self { loop {} }
}
fn main() {
let thing = 1;
let foo = Foo { foo1: 0, foo2: 0 };
let foo2 = Foo { thing, ..$0 }
}
"#,
expect![[r#"
fd ..Default::default()
fd foo1 u32
fd foo2 u32
fn main() fn()
lc foo Foo
lc thing i32
md core
st Foo
st Foo {…} Foo { foo1: u32, foo2: u32 }
tt Default
tt Sized
bt u32
kw crate::
kw self::
kw super::
"#]],
);
check(
r#"
//- minicore:default
struct Foo { foo1: u32, foo2: u32 }
impl Default for Foo {
fn default() -> Self { loop {} }
}
fn main() {
let thing = 1;
let foo = Foo { foo1: 0, foo2: 0 };
let foo2 = Foo { thing, ..Default::$0 }
}
"#,
expect![[r#"
fd foo1 u32
fd foo2 u32
fn default() (as Default) fn() -> Self
"#]],
);
}
#[test]
fn empty_union_literal() {
check(
r#"
union Union { foo: u32, bar: f32 }
fn foo() {
let other = Union {
$0
};
}
"#,
expect![[r#"
fd bar f32
fd foo u32
"#]],
)
}
#[test]
fn dont_suggest_additional_union_fields() {
check(
r#"
union Union { foo: u32, bar: f32 }
fn foo() {
let other = Union {
foo: 1,
$0
};
}
"#,
expect![[r#""#]],
)
}