#[macro_use] extern crate mashup; #[test] fn test_basic() { mashup! { m["k"] = a b c; } m! { impl Struct { fn "k"() {} } } struct Struct; Struct::abc(); } #[test] fn test_shared_hygiene() { mashup! { m["a"] = a a; m["b"] = b b; } m! { let "a" = 1; let "b" = 2; assert_eq!("a" + 1, "b"); } } #[test] fn test_two_macros() { mashup! { m[x] = A B C; n[x] = D E F; } const ABC: &'static str = "abc"; const DEF: &'static str = "def"; assert_eq!(m![x], "abc"); assert_eq!(n![x], "def"); } #[test] fn test_duplicate() { mashup! { m[K] = A B C; m[K] = D E F; } const ABC: &'static str = "abc"; m! { assert_eq!(K, "abc"); } } #[test] fn test_repeat() { const ROCKET_A: &'static str = "/a"; const ROCKET_B: &'static str = "/b"; macro_rules! routes { ($($route:ident),*) => {{ mashup! { $( m["rocket" $route] = ROCKET_ $route; )* } m! { vec![$("rocket" $route),*] } }} } let routes = routes!(A, B); assert_eq!(routes, vec!["/a", "/b"]); } #[test] fn test_integer() { const CONST0: &'static str = "const0"; mashup! { m["id"] = CONST 0; } assert_eq!(m!["id"], CONST0); } #[test] fn test_empty() { mashup!{} } #[test] fn test_underscore() { mashup! { m[X] = A _ B; } m! { const A_B: usize = 0; assert_eq!(X, 0); } } #[test] fn test_lifetime() { mashup! { m['life time] = 'd e; } m! { #[allow(dead_code)] struct S<'life time> { q: &'life time str, } } } #[test] fn test_type_macro() { mashup! { m["T"] = A a; } struct Aa; type Foo = m!["T"]; let _: Foo = Aa; } #[test] fn test_pattern_macro() { mashup! { m["T"] = A a; } struct Aa(usize); let m!["T"(i)] = Aa(1); assert_eq!(i, 1); } #[test] fn test_keyword() { mashup! { m["x"] = F move; } m! { struct "x"; } let _ = Fmove; } #[test] #[allow(non_camel_case_types)] fn test_literal_str() { mashup! { m["x"] = Foo "Bar-Baz"; } m! { struct "x"; } let _ = FooBar_Baz; } #[test] fn test_env_literal() { mashup! { m["x"] = Lib env bar; } m! { struct "x"; } let _ = Libenvbar; } #[test] fn test_env_present() { mashup! { m["x"] = Lib env!("CARGO_PKG_NAME"); } m! { struct "x"; } let _ = Libmashup; } macro_rules! conditionally_ignore { { #[cfg(not($cfg:ident))] mod $name:ident; } => { #[cfg(not($cfg))] include!(concat!("conditional/", stringify!($name), ".rs")); #[cfg($cfg)] #[test] #[ignore] fn $name() { panic!("not tested"); } }; } conditionally_ignore! { #[cfg(not(no_attributes))] mod test_attributes; } conditionally_ignore! { #[cfg(not(no_raw_identifiers))] mod test_raw_identifiers; }