Diffstat (limited to 'tests/walkers/core/struct.rs')
-rw-r--r--tests/walkers/core/struct.rs132
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();
+}