Add tests

This commit is contained in:
Edwin Cheng 2019-04-22 04:18:18 +08:00
parent 3d1cdc834d
commit 120bfde3c2

View File

@ -220,9 +220,10 @@ impl_froms!(TokenTree: Leaf, Subtree);
let expansion = syntax_node_to_token_tree(expansion.syntax()).unwrap().0;
let file = token_tree_to_macro_items(&expansion);
let file = file.unwrap().syntax().debug_dump().trim().to_string();
let file = file.replace("C_C__C", "$crate");
let tree = tree.unwrap().syntax().debug_dump().trim().to_string();
assert_eq!(tree.unwrap().syntax().debug_dump().trim(), file,);
let file = file.replace("C_C__C", "$crate");
assert_eq!(tree, file,);
}
#[test]
@ -348,6 +349,21 @@ impl_froms!(TokenTree: Leaf, Subtree);
assert_expansion(&rules, "foo! { foo, bar }", "fn baz {foo () ; bar () ;}");
}
#[test]
fn test_match_group_pattern_with_multiple_statement_without_semi() {
let rules = create_rules(
r#"
macro_rules! foo {
($ ($ i:ident),*) => ( fn baz { $ (
$i()
);*} );
}
"#,
);
assert_expansion(&rules, "foo! { foo, bar }", "fn baz {foo () ; bar () ;}");
}
#[test]
fn test_match_group_empty_fixed_token() {
let rules = create_rules(
@ -691,6 +707,33 @@ MACRO_ITEMS@[0; 40)
);
}
#[test]
fn test_ty_with_complex_type() {
let rules = create_rules(
r#"
macro_rules! foo {
($ i:ty) => (
fn bar() -> $ i { unimplemented!() }
)
}
"#,
);
// Reference lifetime struct with generic type
assert_expansion(
&rules,
"foo! { &'a Baz<u8> }",
"fn bar () -> & 'a Baz < u8 > {unimplemented ! ()}",
);
// extern "Rust" func type
assert_expansion(
&rules,
r#"foo! { extern "Rust" fn() -> Ret }"#,
r#"fn bar () -> extern "Rust" fn () -> Ret {unimplemented ! ()}"#,
);
}
#[test]
fn test_pat_() {
let rules = create_rules(
@ -853,6 +896,26 @@ MACRO_ITEMS@[0; 40)
}
// The following tests are based on real world situations
#[test]
fn test_vec() {
let rules = create_rules(
r#"
macro_rules! vec {
($($item:expr),*) => {
{
let mut v = Vec::new();
$(
v.push($item);
)*
v
}
};
}
"#,
);
assert_expansion(&rules, r#"vec!();"#, r#"{let mut v = Vec :: new () ; v}"#);
}
#[test]
fn test_winapi_struct() {
// from https://github.com/retep998/winapi-rs/blob/a7ef2bca086aae76cf6c4ce4c2552988ed9798ad/src/macros.rs#L366
@ -886,4 +949,26 @@ macro_rules! STRUCT {
assert_expansion(&rules, r#"STRUCT!{#[cfg_attr(target_arch = "x86", repr(packed))] struct D3DCONTENTPROTECTIONCAPS {Caps : u8 ,}}"#,
"# [repr (C)] # [derive (Copy)] # [cfg_attr (target_arch = \"x86\" , repr (packed))] pub struct D3DCONTENTPROTECTIONCAPS {pub Caps : u8 ,} impl Clone for D3DCONTENTPROTECTIONCAPS {# [inline] fn clone (& self) -> D3DCONTENTPROTECTIONCAPS {* self}} # [cfg (feature = \"impl-default\")] impl Default for D3DCONTENTPROTECTIONCAPS {# [inline] fn default () -> D3DCONTENTPROTECTIONCAPS {unsafe {$crate :: _core :: mem :: zeroed ()}}}");
}
#[test]
fn test_int_base() {
let rules = create_rules(
r#"
macro_rules! int_base {
($Trait:ident for $T:ident as $U:ident -> $Radix:ident) => {
#[stable(feature = "rust1", since = "1.0.0")]
impl fmt::$Trait for $T {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
$Radix.fmt_int(*self as $U, f)
}
}
}
}
"#,
);
assert_expansion(&rules, r#" int_base!{Binary for isize as usize -> Binary}"#,
"# [stable (feature = \"rust1\" , since = \"1.0.0\")] impl fmt :: Binary for isize {fn fmt (& self , f : & mut fmt :: Formatter < \'_ >) -> fmt :: Result {Binary . fmt_int (* self as usize , f)}}"
);
}
}