blob: c28f0444f6446ea8ae0c965a81d45043d361d26c [file] [log] [blame]
extern crate syn;
use syn::*;
fn simple_path(name: &'static str) -> Path {
Path {
global: false,
segments: vec![
PathSegment {
ident: Ident::new(name),
parameters: PathParameters::none(),
},
],
}
}
#[test]
fn test_split_for_impl() {
// <'a, 'b: 'a, T: 'a = ()> where T: Debug
let generics = Generics {
lifetimes: vec![
LifetimeDef {
lifetime: Lifetime::new("'a"),
bounds: Vec::new(),
},
LifetimeDef {
lifetime: Lifetime::new("'b"),
bounds: vec![
Lifetime::new("'a"),
],
},
],
ty_params: vec![
TyParam {
ident: Ident::new("T"),
bounds: vec![
TyParamBound::Region(Lifetime::new("'a")),
],
default: Some(Ty::Tup(Vec::new())),
},
],
where_clause: WhereClause {
predicates: vec![
WherePredicate::BoundPredicate(WhereBoundPredicate {
bound_lifetimes: Vec::new(),
bounded_ty: Ty::Path(None, simple_path("T")),
bounds: vec![
TyParamBound::Trait(
PolyTraitRef {
bound_lifetimes: Vec::new(),
trait_ref: simple_path("Debug"),
},
TraitBoundModifier::None,
),
],
}),
],
},
};
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
// <'a, 'b: 'a, T: 'a>
let expected_impl_generics = Generics {
lifetimes: vec![
LifetimeDef {
lifetime: Lifetime::new("'a"),
bounds: Vec::new(),
},
LifetimeDef {
lifetime: Lifetime::new("'b"),
bounds: vec![
Lifetime::new("'a"),
],
},
],
ty_params: vec![
TyParam {
ident: Ident::new("T"),
bounds: vec![
TyParamBound::Region(Lifetime::new("'a")),
],
default: None,
},
],
where_clause: WhereClause::none(),
};
// <'a, 'b, T>
let expected_ty_generics = Generics {
lifetimes: vec![
LifetimeDef {
lifetime: Lifetime::new("'a"),
bounds: Vec::new(),
},
LifetimeDef {
lifetime: Lifetime::new("'b"),
bounds: Vec::new(),
},
],
ty_params: vec![
TyParam {
ident: Ident::new("T"),
bounds: Vec::new(),
default: None,
},
],
where_clause: WhereClause::none(),
};
assert_eq!(impl_generics, expected_impl_generics);
assert_eq!(ty_generics, expected_ty_generics);
assert_eq!(where_clause, generics.where_clause);
}