|
1 | 1 | use assert_fs::prelude::PathChild;
|
2 | 2 | use assert_fs::TempDir;
|
| 3 | +use cairo_lang_macro::TokenStream; |
3 | 4 | use scarb_proc_macro_server_types::methods::defined_macros::DefinedMacros;
|
4 | 5 | use scarb_proc_macro_server_types::methods::defined_macros::DefinedMacrosParams;
|
| 6 | +use scarb_proc_macro_server_types::methods::expand::ExpandAttribute; |
| 7 | +use scarb_proc_macro_server_types::methods::expand::ExpandAttributeParams; |
5 | 8 | use scarb_test_support::cairo_plugin_project_builder::CairoPluginProjectBuilder;
|
6 | 9 | use scarb_test_support::proc_macro_server::ProcMacroClient;
|
7 | 10 | use scarb_test_support::proc_macro_server::SIMPLE_MACROS;
|
@@ -36,3 +39,52 @@ fn defined_macros() {
|
36 | 39 | assert_eq!(response.inline_macros, vec!["inline_some".to_string()]);
|
37 | 40 | assert_eq!(response.executables, vec!["some_executable".to_string()]);
|
38 | 41 | }
|
| 42 | + |
| 43 | +#[test] |
| 44 | +fn expand_attribute() { |
| 45 | + let t = TempDir::new().unwrap(); |
| 46 | + let plugin_package = t.child("some"); |
| 47 | + |
| 48 | + let rename_to_very_new_name = r##" |
| 49 | + #[attribute_macro] |
| 50 | + pub fn rename_to_very_new_name(_attr: TokenStream, token_stream: TokenStream) -> ProcMacroResult {{ |
| 51 | + let re = regex::Regex::new(r#"fn (\w+)\(.*\)\{.*\}"#).unwrap(); |
| 52 | + let input = token_stream.to_string(); |
| 53 | + let name = re.captures(&input).unwrap().get(1).unwrap().as_str(); |
| 54 | +
|
| 55 | + let output = input.replace(name, "very_new_name"); |
| 56 | +
|
| 57 | + ProcMacroResult::new(TokenStream::new(output)) |
| 58 | + }} |
| 59 | + "##; |
| 60 | + |
| 61 | + CairoPluginProjectBuilder::default() |
| 62 | + .lib_rs(format!("{SIMPLE_MACROS}\n{rename_to_very_new_name}")) |
| 63 | + .add_dep(r#"regex = "1.11.1""#) |
| 64 | + .build(&plugin_package); |
| 65 | + |
| 66 | + let project = t.child("test_package"); |
| 67 | + |
| 68 | + ProjectBuilder::start() |
| 69 | + .name("test_package") |
| 70 | + .version("1.0.0") |
| 71 | + .lib_cairo("") |
| 72 | + .dep("some", plugin_package) |
| 73 | + .build(&project); |
| 74 | + |
| 75 | + let mut proc_macro_server = ProcMacroClient::new(&project); |
| 76 | + |
| 77 | + let response = proc_macro_server |
| 78 | + .request_and_wait::<ExpandAttribute>(ExpandAttributeParams { |
| 79 | + attr: "rename_to_very_new_name".to_string(), |
| 80 | + args: TokenStream::empty(), |
| 81 | + item: TokenStream::new("fn some_test_fn(){}".to_string()), |
| 82 | + }) |
| 83 | + .unwrap(); |
| 84 | + |
| 85 | + assert_eq!(response.diagnostics, vec![]); |
| 86 | + assert_eq!( |
| 87 | + response.token_stream, |
| 88 | + TokenStream::new("fn very_new_name(){}".to_string()) |
| 89 | + ); |
| 90 | +} |
0 commit comments