Skip to content

Commit 5eaa35f

Browse files
committed
Add remaining use-case tests
1 parent 3b23fc8 commit 5eaa35f

File tree

6 files changed

+239
-12
lines changed

6 files changed

+239
-12
lines changed

non-msrv-tests/tests/ui/use_case.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,20 @@ enum EnumNone {
2626
A(u8),
2727
}
2828

29+
#[derive(DeriveWhere)]
30+
#[derive_where(Clone; T)]
31+
struct SameGenerics<T>(T);
32+
33+
#[derive(DeriveWhere)]
34+
#[derive_where(Clone, Debug; T)]
35+
#[derive_where(skip_inner)]
36+
struct Skip<T>(T);
37+
38+
#[derive(DeriveWhere)]
39+
#[derive_where(Clone, Default; T)]
40+
enum Default<T> {
41+
#[derive_where(default)]
42+
A(T),
43+
}
44+
2945
fn main() {}

non-msrv-tests/tests/ui/use_case.stderr

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,32 @@ error: derive-where doesn't support empty items, as this can already be handled
2626
17 | | struct UnionEmpty {}
2727
| |____________________^
2828

29-
error: derive-where doesn't support items without generics, `skip` attributes or `enum`s implementing `Default`, as this can already be handled by standard `#[derive(..)]`
30-
--> tests/ui/use_case.rs:20:1
29+
error: this can be handled by standard `#[derive(..)]`, use a `skip` attribute, implement `Default` on an enum, of different generic type parameters
30+
--> tests/ui/use_case.rs:20:16
3131
|
32-
20 | / #[derive_where(Clone)]
33-
21 | | struct StructNone(u8);
34-
| |______________________^
32+
20 | #[derive_where(Clone)]
33+
| ^^^^^
3534

36-
error: derive-where doesn't support items without generics, `skip` attributes or `enum`s implementing `Default`, as this can already be handled by standard `#[derive(..)]`
37-
--> tests/ui/use_case.rs:24:1
35+
error: this can be handled by standard `#[derive(..)]`, use a `skip` attribute, implement `Default` on an enum, of different generic type parameters
36+
--> tests/ui/use_case.rs:24:16
3837
|
39-
24 | / #[derive_where(Clone)]
40-
25 | | enum EnumNone {
41-
26 | | A(u8),
42-
27 | | }
43-
| |_^
38+
24 | #[derive_where(Clone)]
39+
| ^^^^^
40+
41+
error: this can be handled by standard `#[derive(..)]`, use a `skip` attribute, implement `Default` on an enum, of different generic type parameters
42+
--> tests/ui/use_case.rs:30:16
43+
|
44+
30 | #[derive_where(Clone; T)]
45+
| ^^^^^
46+
47+
error: this can be handled by standard `#[derive(..)]`, use a `skip` attribute, implement `Default` on an enum, of different generic type parameters
48+
--> tests/ui/use_case.rs:34:16
49+
|
50+
34 | #[derive_where(Clone, Debug; T)]
51+
| ^^^^^
52+
53+
error: this can be handled by standard `#[derive(..)]`, use a `skip` attribute, implement `Default` on an enum, of different generic type parameters
54+
--> tests/ui/use_case.rs:39:16
55+
|
56+
39 | #[derive_where(Clone, Default; T)]
57+
| ^^^^^
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
extern crate zeroize_ as zeroize;
2+
3+
use derive_where::DeriveWhere;
4+
5+
#[derive(DeriveWhere)]
6+
#[derive_where(Clone, Zeroize(crate = "zeroize_"); T)]
7+
struct ZeroizeCrate<T>(T);
8+
9+
#[derive(DeriveWhere)]
10+
#[derive_where(Clone, Zeroize; T)]
11+
struct ZeroizeFqs<T>(#[derive_where(Zeroize(fqs))] T);
12+
13+
fn main() {}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
error: this can be handled by standard `#[derive(..)]`, use a `skip` attribute, implement `Default` on an enum, of different generic type parameters
2+
--> tests/ui/zeroize/use_case.rs:6:16
3+
|
4+
6 | #[derive_where(Clone, Zeroize(crate = "zeroize_"); T)]
5+
| ^^^^^
6+
7+
error: this can be handled by standard `#[derive(..)]`, use a `skip` attribute, implement `Default` on an enum, of different generic type parameters
8+
--> tests/ui/zeroize/use_case.rs:10:16
9+
|
10+
10 | #[derive_where(Clone, Zeroize; T)]
11+
| ^^^^^

src/test/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ mod bound;
33
mod enum_;
44
mod misc;
55
mod skip;
6+
mod use_case;
67
#[cfg(feature = "zeroize")]
78
mod zeroize;
89

@@ -17,3 +18,7 @@ fn test_derive(input: TokenStream, expected: TokenStream) -> Result<()> {
1718
assert_eq!(left, right);
1819
Ok(())
1920
}
21+
22+
fn compiles(input: TokenStream) -> Result<()> {
23+
crate::derive_where_internal(input).map(|_| ())
24+
}

src/test/use_case.rs

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
use quote::quote;
2+
use syn::Result;
3+
4+
use super::compiles;
5+
6+
#[test]
7+
fn struct_skip() -> Result<()> {
8+
compiles(quote! {
9+
#[derive(DeriveWhere)]
10+
#[derive_where(Debug)]
11+
struct Test(#[derive_where(skip)] u8);
12+
})
13+
}
14+
15+
#[test]
16+
fn struct_skip_multiple() -> Result<()> {
17+
compiles(quote! {
18+
#[derive(DeriveWhere)]
19+
#[derive_where(Debug)]
20+
struct Test(#[derive_where(skip)] u8, u8);
21+
})
22+
}
23+
24+
#[test]
25+
fn struct_skip_trait() -> Result<()> {
26+
compiles(quote! {
27+
#[derive(DeriveWhere)]
28+
#[derive_where(Debug)]
29+
struct Test(#[derive_where(skip(Debug))] u8);
30+
})
31+
}
32+
33+
#[test]
34+
fn struct_skip_trait_multiple() -> Result<()> {
35+
compiles(quote! {
36+
#[derive(DeriveWhere)]
37+
#[derive_where(Debug)]
38+
struct Test(#[derive_where(skip(Debug))] u8, u8);
39+
})
40+
}
41+
42+
#[test]
43+
fn struct_skip_inner() -> Result<()> {
44+
compiles(quote! {
45+
#[derive(DeriveWhere)]
46+
#[derive_where(Debug)]
47+
#[derive_where(skip_inner)]
48+
struct Test(u8);
49+
})
50+
}
51+
52+
#[test]
53+
fn struct_skip_inner_trait() -> Result<()> {
54+
compiles(quote! {
55+
#[derive(DeriveWhere)]
56+
#[derive_where(Debug)]
57+
#[derive_where(skip_inner(Debug))]
58+
struct Test(u8);
59+
})
60+
}
61+
#[test]
62+
fn enum_skip() -> Result<()> {
63+
compiles(quote! {
64+
#[derive(DeriveWhere)]
65+
#[derive_where(Debug)]
66+
enum Test {
67+
A(#[derive_where(skip)] u8),
68+
}
69+
})
70+
}
71+
72+
#[test]
73+
fn enum_skip_multiple() -> Result<()> {
74+
compiles(quote! {
75+
#[derive(DeriveWhere)]
76+
#[derive_where(Debug)]
77+
enum Test {
78+
A(#[derive_where(skip)] u8),
79+
B,
80+
}
81+
})
82+
}
83+
84+
#[test]
85+
fn enum_skip_trait() -> Result<()> {
86+
compiles(quote! {
87+
#[derive(DeriveWhere)]
88+
#[derive_where(Debug)]
89+
enum Test {
90+
A(#[derive_where(skip(Debug))] u8),
91+
}
92+
})
93+
}
94+
95+
#[test]
96+
fn enum_skip_trait_multiple() -> Result<()> {
97+
compiles(quote! {
98+
#[derive(DeriveWhere)]
99+
#[derive_where(Debug)]
100+
enum Test {
101+
A(#[derive_where(skip(Debug))] u8),
102+
B,
103+
}
104+
})
105+
}
106+
107+
#[test]
108+
fn enum_skip_inner() -> Result<()> {
109+
compiles(quote! {
110+
#[derive(DeriveWhere)]
111+
#[derive_where(Debug)]
112+
enum Test {
113+
#[derive_where(skip_inner)]
114+
A(u8),
115+
}
116+
})
117+
}
118+
119+
#[test]
120+
fn enum_skip_inner_trait() -> Result<()> {
121+
compiles(quote! {
122+
#[derive(DeriveWhere)]
123+
#[derive_where(Debug)]
124+
enum Test {
125+
#[derive_where(skip_inner(Debug))]
126+
A(u8),
127+
}
128+
})
129+
}
130+
131+
#[test]
132+
fn default() -> Result<()> {
133+
compiles(quote! {
134+
#[derive(DeriveWhere)]
135+
#[derive_where(Default)]
136+
enum Test {
137+
#[derive_where(default)]
138+
A,
139+
}
140+
})
141+
}
142+
143+
#[test]
144+
#[cfg(feature = "zeroize")]
145+
fn zeroize_crate() -> Result<()> {
146+
compiles(quote! {
147+
#[derive_where(Zeroize(crate = "zeroize_"))]
148+
struct Test(u8);
149+
})
150+
}
151+
152+
#[test]
153+
#[cfg(feature = "zeroize")]
154+
fn zeroize_fqs() -> Result<()> {
155+
compiles(quote! {
156+
#[derive_where(Zeroize)]
157+
struct Test(#[derive_where(Zeroize(fqs))] u8);
158+
})
159+
}
160+
161+
#[test]
162+
fn custom_bound() -> Result<()> {
163+
compiles(quote! {
164+
#[derive(DeriveWhere)]
165+
#[derive_where(Debug; T: Clone)]
166+
struct Test<T>(T);
167+
})
168+
}

0 commit comments

Comments
 (0)