use { dialectic_compiler::{syntax, Invocation, Spanned, Syntax}, quote::ToTokens, syn::Type, }; #[test] fn tally_client_expr_call_ast() { let client_ast: Spanned = Syntax::Loop( None, Box::new( Syntax::Choose(vec![ Syntax::Break(None).into(), Syntax::Block(vec![ Syntax::send("Operation").into(), Syntax::call(Syntax::type_("ClientTally")).into(), ]) .into(), ]) .into(), ), ) .into(); let s = format!("{}", syntax::compile(&client_ast).unwrap()); assert_eq!( s, "Loop>>)>>" ); } #[test] fn tally_client_expr_call_parse_string() { let to_parse = "loop { choose { 0 => break, 1 => { send Operation; call ClientTally; }, } }"; let ast = syn::parse_str::>(to_parse).unwrap(); let s = format!("{}", syntax::compile(&ast).unwrap()); assert_eq!( s, "Loop>>)>>" ); } #[test] fn tally_client_invocation_call_parse_string() { let to_parse = "loop { choose { 0 => break, 1 => { send Operation; call ClientTally; }, } }"; let ast = syn::parse_str::>(to_parse).unwrap(); let s = format!("{}", syntax::compile(&ast).unwrap()); assert_eq!( s, "Loop>>)>>" ); } #[test] fn tally_client_invocation_direct_subst_parse_string() { let to_parse = "'client: loop { choose { 0 => break, 1 => { send Operation; ClientTally; }, } }"; let ast = syn::parse_str::>(to_parse).unwrap(); let s = format!("{}", syntax::compile(&ast).unwrap()); assert_eq!( s, "Loop>>::Combined>)>>" ); } #[test] fn tally_client_direct_subst_nested_loop_break() { let to_parse = "'client: loop { choose { 0 => break, 1 => { send Operation; loop { choose { 0 => send i64, 1 => { recv i64; continue 'client; } } } }, } }"; let lhs: Type = syn::parse2( syn::parse_str::(to_parse) .unwrap() .compile() .unwrap() .into_token_stream(), ) .unwrap(); let rhs: Type = syn::parse_str( "::dialectic::types::Loop< ::dialectic::types::Choose<( ::dialectic::types::Done, ::dialectic::types::Send< Operation, ::dialectic::types::Loop< ::dialectic::types::Choose<( ::dialectic::types::Send>, ::dialectic::types::Recv>, )> > >, )> >", ) .unwrap(); assert_eq!( lhs.to_token_stream().to_string(), rhs.to_token_stream().to_string() ); }