use quote::ToTokens;
use super::*;
fn rules(enabled: &[&str], disabled: &[&str]) -> CfgExprRules {
CfgExprRules {
enabled_features: enabled.iter().map(|s| s.to_string()).collect(),
disabled_features: disabled.iter().map(|s| s.to_string()).collect(),
..Default::default()
}
}
#[test]
fn cfg_on_fn_parameter_is_filtered() {
let src = SourceLocation::default();
let make = || -> syn::Item {
syn::parse_quote! {
pub fn f(a: i32, #[cfg(feature = "unstable")] b: i64) -> i32 { a }
}
};
let mut item = make();
assert!(process_item_features(
&mut item,
&rules(&[], &["unstable"]),
&src
));
let s = item.to_token_stream().to_string();
assert!(s.contains("a : i32"), "{s}");
assert!(!s.contains("b : i64"), "{s}");
assert!(!s.contains("cfg"), "cfg attr should be gone: {s}");
let mut item = make();
assert!(process_item_features(
&mut item,
&rules(&["unstable"], &[]),
&src
));
let s = item.to_token_stream().to_string();
assert!(s.contains("a : i32"), "{s}");
assert!(s.contains("b : i64"), "{s}");
assert!(
!s.contains("cfg"),
"cfg attr should be stripped on keep: {s}"
);
}
#[test]
fn fn_parameters_without_cfg_are_preserved() {
let src = SourceLocation::default();
let mut item: syn::Item = syn::parse_quote! {
pub fn g(x: u8, y: u16, z: u32) {}
};
assert!(process_item_features(
&mut item,
&rules(&[], &["unstable"]),
&src
));
let s = item.to_token_stream().to_string();
assert!(
s.contains("x : u8") && s.contains("y : u16") && s.contains("z : u32"),
"{s}"
);
}