Diffstat (limited to 'tests/walkers/core/struct.rs')
| -rw-r--r-- | tests/walkers/core/struct.rs | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/tests/walkers/core/struct.rs b/tests/walkers/core/struct.rs new file mode 100644 index 0000000..9ea8c31 --- /dev/null +++ b/tests/walkers/core/struct.rs @@ -0,0 +1,132 @@ +use mockall::{predicate::eq, Sequence}; +use treaty::{any::{static_wrapper::{DynOwnedStatic, OwnedStatic}, TypeNameId}, effect::{BlockOn, Blocking, Effect, Future, Spin}, protocol::{visitor::{tag::{DynTag, TagConst}, value::DynValue}, Visitor}, walkers::core::{r#struct::{StructTypeInfo, StructWalker}, value::ValueWalker}, Builder, DefaultMode, Flow, Walker, TAG_STRUCT, TAG_TYPE_NAME}; + +use crate::common::{builder::MockBuilder, protocol::{tag::MockTagVisitor, visitor::MockValueVisitor}}; + +struct Demo { + a: bool, + b: bool, +} + +impl<'ctx, M> StructTypeInfo<'ctx, M> for Demo { + const NAME: &'static str = "Demo"; + + const FIELDS: &'static [&'static str] = &["a", "b"]; + + type FieldError = (); + + type T = Demo; + + fn walk_field<'a, E: Effect>( + index: usize, + value: &'ctx Self::T, + visitor: Visitor<'a, 'ctx>, + ) -> Future<'a, Result<Flow, Self::FieldError>, E> { + E::wrap(async move { + match index { + 0 => { + let walker = ValueWalker::<bool>::new(value.a); + Walker::<E>::walk(walker, visitor).await.unwrap(); + Ok(Flow::Continue) + } + 1 => { + let walker = ValueWalker::<bool>::new(value.b); + Walker::<E>::walk(walker, visitor).await.unwrap(); + Ok(Flow::Continue) + } + _ => Ok(Flow::Done), + } + }) + } +} + +#[test] +fn demo2() { + let mut builder = MockBuilder::<(), (), ()>::new(); + + let mut seq = Sequence::new(); + + builder + .expect_traits_mut() + .times(4) + .in_sequence(&mut seq) + .return_var(None); + + builder + .expect_traits_mut() + .once() + .with(eq(TypeNameId::of::< + DynTag<'static, TagConst<{ TAG_STRUCT.to_int() }>, Blocking>, + >())) + .in_sequence(&mut seq) + .return_var(Some(Box::new({ + let mut mock = MockTagVisitor::<TagConst<{ TAG_STRUCT.to_int() }>, Blocking>::new(); + + mock.expect_visit().once().returning(|_, walker| { + let mut builder = MockBuilder::<(), (), ()>::new(); + assert_eq!( + Spin::block_on(walker.walk(Builder::<Blocking>::as_visitor(&mut builder))), + Flow::Done + ); + + Flow::Continue + }); + + mock + }))); + + builder + .expect_traits_mut() + .once() + .with(eq(TypeNameId::of::< + DynTag<'static, TagConst<{ TAG_TYPE_NAME.to_int() }>, Blocking>, + >())) + .in_sequence(&mut seq) + .return_var(Some(Box::new({ + let mut mock = + MockTagVisitor::<TagConst<{ TAG_TYPE_NAME.to_int() }>, Blocking>::new(); + + mock.expect_visit().return_once(|_, walker| { + let mut builder = MockBuilder::<(), (), ()>::new(); + + builder + .expect_traits_mut() + .once() + .with(eq(TypeNameId::of::< + DynValue<'static, DynOwnedStatic<&'static str>, Blocking>, + >())) + .return_var(Some(Box::new({ + let mut mock = + MockValueVisitor::<DynOwnedStatic<&'static str>, Blocking>::new(); + + mock.expect_visit() + .once() + .with(eq(OwnedStatic("Demo"))) + .return_const(Flow::Done); + + mock + }))); + + assert_eq!( + Spin::block_on(walker.walk(Builder::<Blocking>::as_visitor(&mut builder))), + Flow::Done + ); + + Flow::Continue + }); + + mock + }))); + + builder + .expect_traits_mut() + .times(3) + .in_sequence(&mut seq) + .return_var(None); + + let value = Demo { a: true, b: false }; + + let walker = StructWalker::<Demo, Demo, DefaultMode, Blocking>::new(&value); + + Spin::block_on(walker.walk(Builder::<Blocking>::as_visitor(&mut builder))).unwrap(); +} |