Skip to content

Commit 080048c

Browse files
committed
Add tests
1 parent d7e1fc0 commit 080048c

File tree

8 files changed

+199
-32
lines changed

8 files changed

+199
-32
lines changed

src/test/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ mod enum_;
77
mod incomparable;
88
mod misc;
99
mod partial_ord;
10+
#[cfg(feature = "serde")]
11+
mod serde;
1012
mod skip;
1113
mod use_case;
1214
#[cfg(feature = "zeroize")]

src/test/serde.rs

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
use quote::quote;
2+
use syn::Result;
3+
4+
use super::test_derive;
5+
6+
#[test]
7+
fn basic() -> Result<()> {
8+
test_derive(
9+
quote! {
10+
#[derive_where(Deserialize, Serialize)]
11+
struct Test<T>(std::marker::PhantomData<T>);
12+
},
13+
quote! {
14+
#[::core::prelude::v1::derive(::serde::Deserialize)]
15+
#[serde(bound(deserialize = ""))]
16+
#[::derive_where::derive_where_serde]
17+
#[derive_where(Deserialize, Serialize)]
18+
struct Test<T>(std::marker::PhantomData<T>);
19+
20+
#[::core::prelude::v1::derive(::serde::Serialize)]
21+
#[serde(bound(serialize = ""))]
22+
#[::derive_where::derive_where_serde]
23+
#[derive_where(Deserialize, Serialize)]
24+
struct Test<T>(std::marker::PhantomData<T>);
25+
},
26+
)
27+
}
28+
29+
#[test]
30+
fn bound() -> Result<()> {
31+
test_derive(
32+
quote! {
33+
#[derive_where(Deserialize, Serialize; T)]
34+
struct Test<T, U>(T, std::marker::PhantomData<U>);
35+
},
36+
quote! {
37+
#[::core::prelude::v1::derive(::serde::Deserialize)]
38+
#[serde(bound(deserialize = "T : :: serde :: Deserialize < 'de >"))]
39+
#[::derive_where::derive_where_serde]
40+
#[derive_where(Deserialize, Serialize; T)]
41+
struct Test<T, U>(T, std::marker::PhantomData<U>);
42+
43+
#[::core::prelude::v1::derive(::serde::Serialize)]
44+
#[serde(bound(serialize = "T : :: serde :: Serialize"))]
45+
#[::derive_where::derive_where_serde]
46+
#[derive_where(Deserialize, Serialize; T)]
47+
struct Test<T, U>(T, std::marker::PhantomData<U>);
48+
},
49+
)
50+
}
51+
52+
#[test]
53+
fn bound_two() -> Result<()> {
54+
test_derive(
55+
quote! {
56+
#[derive_where(Deserialize, Serialize; T, U)]
57+
struct Test<T, U, V>(T, U, std::marker::PhantomData<V>);
58+
},
59+
quote! {
60+
#[::core::prelude::v1::derive(::serde::Deserialize)]
61+
#[serde(bound(deserialize = "T : :: serde :: Deserialize < 'de > , U : :: serde :: Deserialize < 'de >"))]
62+
#[::derive_where::derive_where_serde]
63+
#[derive_where(Deserialize, Serialize; T, U)]
64+
struct Test<T, U, V>(T, U, std::marker::PhantomData<V>);
65+
66+
#[::core::prelude::v1::derive(::serde::Serialize)]
67+
#[serde(bound(serialize = "T : :: serde :: Serialize , U : :: serde :: Serialize"))]
68+
#[::derive_where::derive_where_serde]
69+
#[derive_where(Deserialize, Serialize; T, U)]
70+
struct Test<T, U, V>(T, U, std::marker::PhantomData<V>);
71+
},
72+
)
73+
}
74+
75+
#[test]
76+
fn attribute() -> Result<()> {
77+
test_derive(
78+
quote! {
79+
#[derive_where(Deserialize, Serialize)]
80+
#[serde(test_attribute)]
81+
struct Test<T>(std::marker::PhantomData<T>);
82+
},
83+
quote! {
84+
#[::core::prelude::v1::derive(::serde::Deserialize)]
85+
#[serde(bound(deserialize = ""))]
86+
#[::derive_where::derive_where_serde]
87+
#[derive_where(Deserialize, Serialize)]
88+
#[serde(test_attribute)]
89+
struct Test<T>(std::marker::PhantomData<T>);
90+
91+
#[::core::prelude::v1::derive(::serde::Serialize)]
92+
#[serde(bound(serialize = ""))]
93+
#[::derive_where::derive_where_serde]
94+
#[derive_where(Deserialize, Serialize)]
95+
#[serde(test_attribute)]
96+
struct Test<T>(std::marker::PhantomData<T>);
97+
},
98+
)
99+
}
100+
101+
#[test]
102+
fn crate_() -> Result<()> {
103+
test_derive(
104+
quote! {
105+
#[derive_where(Deserialize, Serialize)]
106+
#[serde(crate = "serde_")]
107+
struct Test<T>(std::marker::PhantomData<T>);
108+
},
109+
quote! {
110+
#[::core::prelude::v1::derive(serde_::Deserialize)]
111+
#[serde(bound(deserialize = ""))]
112+
#[::derive_where::derive_where_serde]
113+
#[derive_where(Deserialize, Serialize)]
114+
#[serde(crate = "serde_")]
115+
struct Test<T>(std::marker::PhantomData<T>);
116+
117+
#[::core::prelude::v1::derive(serde_::Serialize)]
118+
#[serde(bound(serialize = ""))]
119+
#[::derive_where::derive_where_serde]
120+
#[derive_where(Deserialize, Serialize)]
121+
#[serde(crate = "serde_")]
122+
struct Test<T>(std::marker::PhantomData<T>);
123+
},
124+
)
125+
}

src/trait_/deserialize.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ impl TraitImpl for Deserialize {
6666
crate_,
6767
&self.crate_(),
6868
format_ident!("Deserialize"),
69+
format_ident!("deserialize"),
6970
full_item,
7071
where_clause,
7172
)

src/trait_/serde.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,22 +81,23 @@ pub fn impl_item(
8181
derive_where: Option<&Path>,
8282
serde: &Path,
8383
trait_: Ident,
84+
bound: Ident,
8485
full_item: &DeriveInput,
8586
where_clause: &Option<Cow<'_, WhereClause>>,
8687
) -> TokenStream {
8788
let derive_where = derive_where
8889
.map(Cow::Borrowed)
8990
.unwrap_or_else(|| Cow::Owned(util::path_from_strs(&[DERIVE_WHERE])));
9091

91-
let bound = if let Some(where_clause) = where_clause {
92+
let bounds = if let Some(where_clause) = where_clause {
9293
where_clause.predicates.to_token_stream().to_string()
9394
} else {
9495
String::new()
9596
};
9697

9798
quote! {
9899
#[::core::prelude::v1::derive(#serde::#trait_)]
99-
#[serde(bound = #bound)]
100+
#[serde(bound(#bound = #bounds))]
100101
#[#derive_where::derive_where_serde]
101102
#full_item
102103
}

src/trait_/serialize.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ impl TraitImpl for Serialize {
6565
crate_,
6666
&self.crate_(),
6767
format_ident!("Serialize"),
68+
format_ident!("serialize"),
6869
full_item,
6970
where_clause,
7071
)

tests/not-serde.rs

Lines changed: 0 additions & 27 deletions
This file was deleted.

tests/serde.rs

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,72 @@
1-
#![cfg(feature = "serde")]
1+
mod util;
22

33
use std::marker::PhantomData;
44

55
use derive_where::derive_where;
6+
#[cfg(not(feature = "serde"))]
7+
use serde_::{Deserialize, Serialize};
8+
use serde_test::Token;
9+
use util::Wrapper;
610

711
#[test]
8-
fn test() {
9-
#[derive_where(Deserialize, Serialize; T)]
12+
fn basic() {
13+
#[derive_where(Debug, PartialEq; T)]
14+
#[cfg_attr(
15+
feature = "serde",
16+
derive_where(Deserialize, Serialize; T)
17+
)]
18+
#[cfg_attr(not(feature = "serde"), derive(Deserialize, Serialize))]
19+
#[cfg_attr(
20+
not(feature = "serde"),
21+
serde(bound(deserialize = "T: Deserialize<'de>", serialize = "T: Serialize"))
22+
)]
1023
#[serde(crate = "serde_")]
1124
struct Test<T, U>(T, PhantomData<U>);
25+
26+
let test = Test(42, PhantomData::<i32>);
27+
28+
serde_test::assert_tokens(
29+
&test,
30+
&[
31+
Token::TupleStruct {
32+
name: "Test",
33+
len: 2,
34+
},
35+
Token::I32(42),
36+
Token::UnitStruct {
37+
name: "PhantomData",
38+
},
39+
Token::TupleStructEnd,
40+
],
41+
);
42+
}
43+
44+
#[test]
45+
fn attribute() {
46+
#[derive_where(Debug, PartialEq)]
47+
#[cfg_attr(feature = "serde", derive_where(Deserialize, Serialize))]
48+
#[cfg_attr(not(feature = "serde"), derive(Deserialize, Serialize))]
49+
#[cfg_attr(not(feature = "serde"), serde(bound = ""))]
50+
#[serde(crate = "serde_")]
51+
#[serde(transparent)]
52+
struct Test<T>(Wrapper<T>);
53+
54+
let test = Test(42.into());
55+
56+
serde_test::assert_tokens(
57+
&test,
58+
&[
59+
Token::Struct {
60+
name: "Wrapper",
61+
len: 2,
62+
},
63+
Token::Str("data"),
64+
Token::I32(42),
65+
Token::Str("hack"),
66+
Token::UnitStruct {
67+
name: "PhantomData",
68+
},
69+
Token::StructEnd,
70+
],
71+
);
1272
}

tests/util/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@ use std::{
88
ptr,
99
};
1010

11+
use serde_::{Deserialize, Serialize};
1112
#[cfg(feature = "zeroize")]
1213
use zeroize_::Zeroize;
1314
#[cfg(feature = "zeroize-on-drop")]
1415
use zeroize_::ZeroizeOnDrop;
1516

17+
#[derive(Deserialize, Serialize)]
18+
#[serde(crate = "serde_")]
19+
#[serde(bound = "")]
1620
pub struct Wrapper<T = ()> {
1721
data: i32,
1822
hack: PhantomData<T>,

0 commit comments

Comments
 (0)