extern crate template_quote; use template_quote::quote; #[test] fn test_conditional_if() { let v = vec![1, 10, 2, 13, 4, 19]; let tokens = quote! { #( #(if v >= &10){ #v } )* }; assert_eq!("10i32 13i32 19i32", tokens.to_string()); let tokens = quote! { #( #(if v >= &10){ #v } #(else){ -#v } )* }; assert_eq!("-1i32 10i32 -2i32 13i32 -4i32 19i32", tokens.to_string()); } #[test] fn test_conditional_for() { let v = vec![(1, "one"), (2, "two"), (3, "three")]; let tokens = quote! { #(for (i, name) in v),{ #i is #name } }; assert_eq!( "1i32 is \"one\" , 2i32 is \"two\" , 3i32 is \"three\"", tokens.to_string() ); let v = vec![vec![1, 2, 3], vec![4, 5, 6]]; let vv = vec![1]; let tokens = quote! { #( #(for inner in &v);{ [#( #inner ),*] } #vv )* }; assert_eq!( "[1i32 , 2i32 , 3i32] ; [4i32 , 5i32 , 6i32] 1i32", tokens.to_string() ); #[allow(unreachable_code)] let tokens = quote! { #(for inner in 0..10);{ { #inner #{break;} } } }; assert_eq!("", tokens.to_string()); } #[test] fn test_conditional_let() { let v = vec![1, 2, 3]; let b = vec![true]; let tokens = quote! { #( #(let (i, s) = (&v, v.iter().map(|i| i.to_string()).collect::>())){ #(#i is #s),* } #b )* }; assert_eq!( "1i32 is \"1\" , 2i32 is \"2\" , 3i32 is \"3\" true", tokens.to_string() ); #[allow(unused)] struct STuple(i32, i32); struct SStruct { a: i32, b: i32, _c: i32, } let vv = vec![true]; let tup = STuple(123, 456); let sct = SStruct { a: 789, b: 12, _c: 345, }; let tokens = quote! { #( #(let STuple(a, ..) = tup) { #a } #(let SStruct{ a: d, b, .. } = sct) { #d, #b #vv } )* }; assert_eq!("123i32 789i32 , 12i32 true", tokens.to_string()); } #[test] fn test_conditional_while() { let mut v = vec![1, 2, 3].into_iter(); let tokens = quote! { #(while let Some(i) = v.next()){ #i } }; assert_eq!("1i32 2i32 3i32", tokens.to_string()); let mut v = vec![1, 2, 3].into_iter(); let tokens = quote! { #(while let Some(i) = v.next()){ #i #{ if i > 1 { break; }; } } }; assert_eq!("1i32 2i32", tokens.to_string()); let mut v = vec![vec![1, 2, 3], vec![4, 5]].into_iter(); let tokens = quote! { { #(while let Some(i) = v.next()){ #(#i),* #{break;} } } }; assert_eq!("{ 1i32 , 2i32 , 3i32 }", tokens.to_string()); } #[test] fn test_break() { let v = vec![1, 2, 3]; let tokens = quote! { #( #v #{ if v >= &2 { break; }; } )* }; assert_eq!("1i32 2i32", tokens.to_string()); } #[test] fn test_punct() { let v = vec![vec![1, 2], vec![3]]; let tokens = quote! { #( #(for i in #v) { #i } ),* }; assert_eq!("1i32 2i32 , 3i32", tokens.to_string()); let tokens = quote! { #( #(for i in #v.iter().map(|a| a + 1)) { #i } ),* }; assert_eq!("2i32 3i32 , 4i32", tokens.to_string()); let v = vec![1, 2, 3]; let tokens = quote! { #( #(for i in 0..*#v) { #i } ),* }; assert_eq!("0i32 , 0i32 1i32 , 0i32 1i32 2i32", tokens.to_string()); let tokens = quote! { #( #{#v.to_string()} ),* }; assert_eq!("\"1\" , \"2\" , \"3\"", tokens.to_string()); let v = vec![1, 2, 3]; let tokens = quote! { #( #(if #v > &2) { + #v } #(else) { - #v } )* }; assert_eq!("- 1i32 - 2i32 + 3i32", tokens.to_string()); } #[test] fn test_complex_assign() { let v = vec![1, 2, 3]; let v = Some(v.as_slice()); let tokens = quote! { #(if let Option::Some([a, b, c]) = v) { #a - #b - #c } }; assert_eq!("1i32 - 2i32 - 3i32", tokens.to_string()); }