Add tests for concrete instantiations in test_gen

This commit is contained in:
David Tolnay
2016-07-22 08:49:51 -07:00
parent 85772726ee
commit fb6fc4e19f
+44 -4
View File
@@ -10,12 +10,15 @@ use std::marker::PhantomData;
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
#[test]
fn test_gen() {
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct With<T> { struct With<T> {
t: T, t: T,
#[serde(serialize_with="ser_x", deserialize_with="de_x")] #[serde(serialize_with="ser_x", deserialize_with="de_x")]
x: X, x: X,
} }
assert::<With<i32>>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct WithRef<'a, T: 'a> { struct WithRef<'a, T: 'a> {
@@ -24,11 +27,13 @@ struct WithRef<'a, T: 'a> {
#[serde(serialize_with="ser_x", deserialize_with="de_x")] #[serde(serialize_with="ser_x", deserialize_with="de_x")]
x: X, x: X,
} }
assert::<WithRef<i32>>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct PhantomX { struct PhantomX {
x: PhantomData<X>, x: PhantomData<X>,
} }
assert::<PhantomX>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct Bounds<T: Serialize + Deserialize> { struct Bounds<T: Serialize + Deserialize> {
@@ -37,6 +42,7 @@ struct Bounds<T: Serialize + Deserialize> {
boxed: Box<T>, boxed: Box<T>,
option_boxed: Option<Box<T>>, option_boxed: Option<Box<T>>,
} }
assert::<Bounds<i32>>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct NoBounds<T> { struct NoBounds<T> {
@@ -45,6 +51,7 @@ struct NoBounds<T> {
boxed: Box<T>, boxed: Box<T>,
option_boxed: Option<Box<T>>, option_boxed: Option<Box<T>>,
} }
assert::<NoBounds<i32>>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
enum EnumWith<T> { enum EnumWith<T> {
@@ -61,19 +68,21 @@ enum EnumWith<T> {
#[serde(serialize_with="ser_x", deserialize_with="de_x")] #[serde(serialize_with="ser_x", deserialize_with="de_x")]
x: X }, x: X },
} }
assert::<EnumWith<i32>>();
#[derive(Serialize)] #[derive(Serialize)]
#[allow(dead_code)]
struct MultipleRef<'a, 'b, 'c, T> where T: 'c, 'c: 'b, 'b: 'a { struct MultipleRef<'a, 'b, 'c, T> where T: 'c, 'c: 'b, 'b: 'a {
t: T, t: T,
rrrt: &'a &'b &'c T, rrrt: &'a &'b &'c T,
} }
assert_ser::<MultipleRef<i32>>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct Newtype( struct Newtype(
#[serde(serialize_with="ser_x", deserialize_with="de_x")] #[serde(serialize_with="ser_x", deserialize_with="de_x")]
X X
); );
assert::<Newtype>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct Tuple<T>( struct Tuple<T>(
@@ -81,6 +90,7 @@ struct Tuple<T>(
#[serde(serialize_with="ser_x", deserialize_with="de_x")] #[serde(serialize_with="ser_x", deserialize_with="de_x")]
X, X,
); );
assert::<Tuple<i32>>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
enum TreeNode<D> { enum TreeNode<D> {
@@ -92,41 +102,47 @@ enum TreeNode<D> {
data: D, data: D,
}, },
} }
assert::<TreeNode<i32>>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct ListNode<D> { struct ListNode<D> {
data: D, data: D,
next: Box<ListNode<D>>, next: Box<ListNode<D>>,
} }
assert::<ListNode<i32>>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct RecursiveA { struct RecursiveA {
b: Box<RecursiveB>, b: Box<RecursiveB>,
} }
assert::<RecursiveA>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
enum RecursiveB { enum RecursiveB {
A(RecursiveA), A(RecursiveA),
} }
assert::<RecursiveB>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct RecursiveGenericA<T> { struct RecursiveGenericA<T> {
t: T, t: T,
b: Box<RecursiveGenericB<T>>, b: Box<RecursiveGenericB<T>>,
} }
assert::<RecursiveGenericA<i32>>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
enum RecursiveGenericB<T> { enum RecursiveGenericB<T> {
T(T), T(T),
A(RecursiveGenericA<T>), A(RecursiveGenericA<T>),
} }
assert::<RecursiveGenericB<i32>>();
#[derive(Serialize)] #[derive(Serialize)]
#[allow(dead_code)]
struct OptionStatic<'a> { struct OptionStatic<'a> {
a: Option<&'a str>, a: Option<&'a str>,
b: Option<&'static str>, b: Option<&'static str>,
} }
assert_ser::<OptionStatic>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(bound="D: SerializeWith + DeserializeWith")] #[serde(bound="D: SerializeWith + DeserializeWith")]
@@ -139,6 +155,7 @@ struct WithTraits1<D, E> {
bound="E: SerializeWith + DeserializeWith")] bound="E: SerializeWith + DeserializeWith")]
e: E, e: E,
} }
assert::<WithTraits1<X, X>>();
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(bound(serialize="D: SerializeWith", #[serde(bound(serialize="D: SerializeWith",
@@ -153,9 +170,14 @@ struct WithTraits2<D, E> {
bound(deserialize="E: DeserializeWith"))] bound(deserialize="E: DeserializeWith"))]
e: E, e: E,
} }
assert::<WithTraits2<X, X>>();
}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
fn assert<T: Serialize + Deserialize>() {}
fn assert_ser<T: Serialize>() {}
trait SerializeWith { trait SerializeWith {
fn serialize_with<S: Serializer>(_: &Self, _: &mut S) -> Result<(), S::Error>; fn serialize_with<S: Serializer>(_: &Self, _: &mut S) -> Result<(), S::Error>;
} }
@@ -166,5 +188,23 @@ trait DeserializeWith: Sized {
// Implements neither Serialize nor Deserialize // Implements neither Serialize nor Deserialize
struct X; struct X;
fn ser_x<S: Serializer>(_: &X, _: &mut S) -> Result<(), S::Error> { panic!() }
fn de_x<D: Deserializer>(_: &mut D) -> Result<X, D::Error> { panic!() } fn ser_x<S: Serializer>(_: &X, _: &mut S) -> Result<(), S::Error> {
unimplemented!()
}
fn de_x<D: Deserializer>(_: &mut D) -> Result<X, D::Error> {
unimplemented!()
}
impl SerializeWith for X {
fn serialize_with<S: Serializer>(_: &Self, _: &mut S) -> Result<(), S::Error> {
unimplemented!()
}
}
impl DeserializeWith for X {
fn deserialize_with<D: Deserializer>(_: &mut D) -> Result<Self, D::Error> {
unimplemented!()
}
}