Allow taking an Arc<Deterministic> in [gpui::test]-decorated tests

This commit is contained in:
Antonio Scandurra 2022-04-11 10:58:57 +02:00
parent 28f44a3252
commit bb8dc6120b

View file

@ -75,68 +75,65 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream {
match last_segment.map(|s| s.ident.to_string()).as_deref() { match last_segment.map(|s| s.ident.to_string()).as_deref() {
Some("StdRng") => { Some("StdRng") => {
inner_fn_args.extend(quote!(rand::SeedableRng::seed_from_u64(seed),)); inner_fn_args.extend(quote!(rand::SeedableRng::seed_from_u64(seed),));
continue;
} }
Some("bool") => { Some("bool") => {
inner_fn_args.extend(quote!(is_last_iteration,)); inner_fn_args.extend(quote!(is_last_iteration,));
continue;
} }
_ => { Some("Arc") => {
return TokenStream::from( if let syn::PathArguments::AngleBracketed(args) =
syn::Error::new_spanned(arg, "invalid argument") &last_segment.unwrap().arguments
.into_compile_error(), {
) if let Some(syn::GenericArgument::Type(syn::Type::Path(ty))) =
} args.args.last()
} {
} else if let Type::Reference(ty) = &*arg.ty { let last_segment = ty.path.segments.last();
match &*ty.elem { if let Some("Deterministic") =
Type::Path(ty) => { last_segment.map(|s| s.ident.to_string()).as_deref()
let last_segment = ty.path.segments.last(); {
match last_segment.map(|s| s.ident.to_string()).as_deref() { inner_fn_args.extend(quote!(deterministic.clone(),));
Some("TestAppContext") => { continue;
let first_entity_id = ix * 100_000; }
let cx_varname = format_ident!("cx_{}", ix);
cx_vars.extend(quote!(
let mut #cx_varname = #namespace::TestAppContext::new(
foreground_platform.clone(),
cx.platform().clone(),
deterministic.build_foreground(#ix),
deterministic.build_background(),
cx.font_cache().clone(),
cx.leak_detector(),
#first_entity_id,
);
));
cx_teardowns.extend(quote!(
#cx_varname.update(|cx| cx.remove_all_windows());
deterministic.run_until_parked();
#cx_varname.update(|_| {}); // flush effects
));
inner_fn_args.extend(quote!(&mut #cx_varname,));
}
_ => {
return TokenStream::from(
syn::Error::new_spanned(arg, "invalid argument")
.into_compile_error(),
)
} }
} }
} }
_ => { _ => {}
return TokenStream::from( }
syn::Error::new_spanned(arg, "invalid argument") } else if let Type::Reference(ty) = &*arg.ty {
.into_compile_error(), if let Type::Path(ty) = &*ty.elem {
) let last_segment = ty.path.segments.last();
if let Some("TestAppContext") =
last_segment.map(|s| s.ident.to_string()).as_deref()
{
let first_entity_id = ix * 100_000;
let cx_varname = format_ident!("cx_{}", ix);
cx_vars.extend(quote!(
let mut #cx_varname = #namespace::TestAppContext::new(
foreground_platform.clone(),
cx.platform().clone(),
deterministic.build_foreground(#ix),
deterministic.build_background(),
cx.font_cache().clone(),
cx.leak_detector(),
#first_entity_id,
);
));
cx_teardowns.extend(quote!(
#cx_varname.update(|cx| cx.remove_all_windows());
deterministic.run_until_parked();
#cx_varname.update(|_| {}); // flush effects
));
inner_fn_args.extend(quote!(&mut #cx_varname,));
continue;
} }
} }
} else {
return TokenStream::from(
syn::Error::new_spanned(arg, "invalid argument").into_compile_error(),
);
} }
} else {
return TokenStream::from(
syn::Error::new_spanned(arg, "invalid argument").into_compile_error(),
);
} }
return TokenStream::from(
syn::Error::new_spanned(arg, "invalid argument").into_compile_error(),
);
} }
parse_quote! { parse_quote! {