]>
git.proxmox.com Git - rustc.git/blob - src/vendor/quote/tests/test.rs
1 #![cfg_attr(feature = "cargo-clippy", allow(blacklisted_name))]
5 extern crate proc_macro2
;
9 use proc_macro2
::{Span, Term}
;
13 impl quote
::ToTokens
for X
{
14 fn to_tokens(&self, tokens
: &mut quote
::Tokens
) {
15 tokens
.append(proc_macro2
::TokenTree
{
16 kind
: proc_macro2
::TokenNode
::Term(Term
::intern("X")),
17 span
: Span
::def_site(),
23 fn test_quote_impl() {
25 impl<'a
, T
: ToTokens
> ToTokens
for &'a T
{
26 fn to_tokens(&self, tokens
: &mut Tokens
) {
27 (**self).to_tokens(tokens
)
32 let expected
= concat
!(
33 "impl < 'a , T : ToTokens > ToTokens for & 'a T { ",
34 "fn to_tokens ( & self , tokens : & mut Tokens ) { ",
35 "( * * self ) . to_tokens ( tokens ) ",
40 assert_eq
!(expected
, tokens
.to_string());
44 fn test_substitution() {
46 let tokens
= quote
!(#x <#x> (#x) [#x] {#x});
48 let expected
= "X < X > ( X ) [ X ] { X }";
50 assert_eq
!(expected
, tokens
.to_string());
55 let primes
= &[X
, X
, X
, X
];
57 assert_eq
!("X X X X", quote
!(#(#primes)*).to_string());
59 assert_eq
!("X , X , X , X ,", quote
!(#(#primes,)*).to_string());
61 assert_eq
!("X , X , X , X", quote
!(#(#primes),*).to_string());
66 let generics
= quote
!( <'a
, T
> );
68 let where_clause
= quote
!( where T
: Serialize
);
70 let field_ty
= quote
!(String
);
72 let item_ty
= quote
!(Cow
<'a
, str>);
74 let path
= quote
!(SomeTrait
::serialize_with
);
76 let value
= quote
!(self.x
);
79 struct SerializeWith
#generics #where_clause {
81 phantom
: ::std
::marker
::PhantomData
<#item_ty>,
84 impl #generics ::serde::Serialize for SerializeWith #generics #where_clause {
85 fn serialize
<S
>(&self, s
: &mut S
) -> Result
<(), S
::Error
>
86 where S
: ::serde
::Serializer
94 phantom
: ::std
::marker
::PhantomData
::<#item_ty>,
98 let expected
= concat
!(
99 "struct SerializeWith < 'a , T > where T : Serialize { ",
100 "value : & 'a String , ",
101 "phantom : :: std :: marker :: PhantomData < Cow < 'a , str > > , ",
103 "impl < 'a , T > :: serde :: Serialize for SerializeWith < 'a , T > where T : Serialize { ",
104 "fn serialize < S > ( & self , s : & mut S ) -> Result < ( ) , S :: Error > ",
105 "where S : :: serde :: Serializer ",
107 "SomeTrait :: serialize_with ( self . value , s ) ",
111 "value : self . x , ",
112 "phantom : :: std :: marker :: PhantomData :: < Cow < 'a , str > > , ",
116 assert_eq
!(expected
, tokens
.to_string());
125 let iisize
= -1isize
;
132 let tokens
= quote
! {
133 #ii8 #ii16 #ii32 #ii64 #iisize
134 #uu8 #uu16 #uu32 #uu64 #uusize
136 let expected
= "-1i8 -1i16 -1i32 -1i64 -1isize 1u8 1u16 1u32 1u64 1usize";
137 assert_eq
!(expected
, tokens
.to_string());
146 let tokens
= quote
! {
150 let expected
= concat
!("2.345f32 2.345f64");
151 assert_eq
!(expected
, tokens
.to_string());
161 let heart = '\u{2764}';
163 let tokens = quote! {
164 #zero #pound #quote #apost #newline #heart
166 let expected = "'
\\u{0}' '
#' '\\\"' '\\'' '\\n' '\\u{2764}'";
167 assert_eq!(expected, tokens.to_string());
172 let s = "\0 a 'b \" c";
173 let tokens = quote!(#s);
174 let expected = "\"\\u{0} a \\'b \\\" c\"";
175 assert_eq!(expected, tokens.to_string());
180 let s = "\0 a 'b \" c".to_string();
181 let tokens = quote!(#s);
182 let expected = "\"\\u{0} a \\'b \\\" c\"";
183 assert_eq!(expected, tokens.to_string());
188 let foo = Term::intern("Foo");
189 let bar = Term::intern(&format!("Bar{}", 7));
190 let tokens = quote!(struct #foo; enum #bar {});
191 let expected = "struct Foo ; enum Bar7 { }";
192 assert_eq!(expected, tokens.to_string());
196 fn test_duplicate() {
199 let tokens = quote!(#ch #ch);
201 let expected = "'x' 'x'";
202 assert_eq!(expected, tokens.to_string());
206 fn test_fancy_repetition() {
207 let foo = vec!["a", "b"];
208 let bar = vec![true, false];
210 let tokens = quote! {
214 let expected = r#""a" : true , "b" : false"#;
215 assert_eq!(expected, tokens.to_string());
219 fn test_nested_fancy_repetition() {
220 let nested = vec![vec!['a', 'b', 'c'], vec!['x', 'y', 'z']];
222 let tokens = quote! {
228 let expected = "'a' 'b' 'c' , 'x' 'y' 'z'";
229 assert_eq!(expected, tokens.to_string());
233 fn test_empty_repetition() {
234 let tokens = quote!(#(a b)* #(c d),*);
235 assert_eq!("", tokens.to_string());
239 fn test_variable_name_conflict() {
240 // The implementation of `#(...),*` uses the variable `_i` but it should be
241 // fine, if a little confusing when debugging.
242 let _i = vec!['a', 'b'];
243 let tokens = quote! { #(#_i),* };
244 let expected = "'a' , 'b'";
245 assert_eq!(expected, tokens.to_string());
249 fn test_empty_quote() {
250 let tokens = quote!();
251 assert_eq!("", tokens.to_string());
256 let b = "str".to_owned().into_boxed_str();
257 let tokens = quote! { #b };
258 assert_eq!("\"str\"", tokens.to_string());
263 let owned: Cow<Term> = Cow::Owned(Term::intern("owned"));
265 let ident = Term::intern("borrowed");
266 let borrowed = Cow::Borrowed(&ident);
268 let tokens = quote! { #owned #borrowed };
269 assert_eq!("owned borrowed", tokens.to_string());
274 fn field_i(i: usize) -> Term {
275 Term::intern(&format!("__field{}", i))
278 let fields = (0usize..3)
279 .map(field_i as fn(_) -> _)
280 .map(|var| quote! { #var });
282 let tokens = quote! { #(#fields)* };
283 assert_eq!("__field0 __field1 __field2", tokens.to_string());
287 fn test_append_tokens() {
288 let mut a = quote!(a);
291 assert_eq!("a b", a.to_string());