Skip to content

Commit c33e89b

Browse files
committed
test(Export): add UI tests
1 parent a12fd4d commit c33e89b

File tree

7 files changed

+59
-14
lines changed

7 files changed

+59
-14
lines changed

gdnative-derive/src/export.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
1-
use proc_macro2::TokenStream as TokenStream2;
1+
use proc_macro2::{Span, TokenStream as TokenStream2};
2+
use syn::spanned::Spanned;
23
use syn::{DeriveInput, Fields};
34

5+
fn err_only_supports_fieldless_enums(span: Span) -> syn::Error {
6+
syn::Error::new(span, "#[derive(Export)] only supports fieldless enums")
7+
}
8+
49
pub(crate) fn derive_export(input: &DeriveInput) -> syn::Result<TokenStream2> {
510
let derived_enum = match &input.data {
611
syn::Data::Enum(data) => data,
7-
_ => {
8-
return Err(syn::Error::new(
9-
input.ident.span(),
10-
"#[derive(Export)] only supports fieldless enums",
11-
))
12+
syn::Data::Struct(data) => {
13+
return Err(err_only_supports_fieldless_enums(data.struct_token.span()));
14+
}
15+
syn::Data::Union(data) => {
16+
return Err(err_only_supports_fieldless_enums(data.union_token.span()));
1217
}
1318
};
1419

@@ -20,14 +25,8 @@ fn impl_export(enum_ty: &syn::Ident, data: &syn::DataEnum) -> syn::Result<TokenS
2025
let err = data
2126
.variants
2227
.iter()
23-
.filter_map(|variant| {
24-
(!matches!(variant.fields, Fields::Unit)).then(|| {
25-
syn::Error::new(
26-
variant.ident.span(),
27-
"#[derive(Export)] only supports fieldless enums",
28-
)
29-
})
30-
})
28+
.filter(|variant| !matches!(variant.fields, Fields::Unit))
29+
.map(|variant| err_only_supports_fieldless_enums(variant.ident.span()))
3130
.reduce(|mut acc, err| {
3231
acc.combine(err);
3332
acc

gdnative/tests/ui.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ fn ui_tests() {
4242
t.compile_fail("tests/ui/from_variant_fail_09.rs");
4343

4444
// Export
45+
t.pass("tests/ui/export_pass.rs");
4546
t.compile_fail("tests/ui/export_fail_01.rs");
47+
t.compile_fail("tests/ui/export_fail_02.rs");
48+
t.compile_fail("tests/ui/export_fail_03.rs");
4649
}
4750

4851
// FIXME(rust/issues/54725): Full path spans are only available on nightly as of now

gdnative/tests/ui/export_fail_02.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
use gdnative::prelude::*;
2+
3+
#[derive(Export, ToVariant)]
4+
pub struct Foo {
5+
bar: i32,
6+
}
7+
8+
fn main() {}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
error: #[derive(Export)] only supports fieldless enums
2+
--> tests/ui/export_fail_02.rs:4:5
3+
|
4+
4 | pub struct Foo {
5+
| ^^^^^^

gdnative/tests/ui/export_fail_03.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
use gdnative::prelude::*;
2+
3+
#[derive(Export, ToVariant)]
4+
pub union Foo {
5+
bar: i32,
6+
}
7+
8+
fn main() {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
error: #[derive(Export)] only supports fieldless enums
2+
--> tests/ui/export_fail_03.rs:4:5
3+
|
4+
4 | pub union Foo {
5+
| ^^^^^
6+
7+
error: Variant conversion derive macro does not work on unions.
8+
--> tests/ui/export_fail_03.rs:4:1
9+
|
10+
4 | pub union Foo {
11+
| ^^^

gdnative/tests/ui/export_pass.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
use gdnative::prelude::*;
2+
3+
#[derive(Export, ToVariant, Clone, Copy)]
4+
#[variant(enum = "repr")]
5+
#[repr(i32)]
6+
pub enum Foo {
7+
Bar,
8+
Baz,
9+
}
10+
11+
fn main() {}

0 commit comments

Comments
 (0)