Diffstat (limited to 'tests/common/walker.rs')
-rw-r--r--tests/common/walker.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/tests/common/walker.rs b/tests/common/walker.rs
new file mode 100644
index 0000000..b1064f6
--- /dev/null
+++ b/tests/common/walker.rs
@@ -0,0 +1,57 @@
+use mockall::mock;
+use treaty::{
+ any::{indirect, AnyTrait, AnyTraitObject, TypeNameId},
+ effect::{Effect, Future},
+ protocol::DynVisitor,
+ Builder, BuilderTypes, Walker, WalkerTypes,
+};
+
+mock! {
+ pub Walker<Output, Error> {
+ pub fn walk<'a, 'ctx>(self, visitor: DynVisitor<'a, 'ctx>) -> Result<Output, Error>;
+
+ pub fn traits(&self, id: TypeNameId) -> &Option<Box<dyn for<'ctx> AnyTrait<'ctx> + Send + Sync>>;
+ pub fn traits_mut(&mut self, id: TypeNameId) -> &mut Option<Box<dyn for<'ctx> AnyTrait<'ctx> + Send + Sync>>;
+ }
+}
+
+impl<Output: Send + Sync, Error: Send + Sync> WalkerTypes for MockWalker<Output, Error> {
+ type Error = Error;
+
+ type Output = Output;
+}
+
+impl<'ctx, Output: Send + Sync, Error: Send + Sync, E: Effect> Walker<'ctx, E>
+ for MockWalker<Output, Error>
+{
+ fn walk<'a>(
+ self,
+ visitor: DynVisitor<'a, 'ctx>,
+ ) -> Future<'a, Result<Self::Output, Self::Error>, E>
+ where
+ Self: 'a,
+ {
+ E::ready(self.walk(visitor))
+ }
+}
+
+impl<'ctx, Output, Error> AnyTrait<'ctx> for MockWalker<Output, Error> {
+ fn upcast_to_id<'a>(&'a self, id: TypeNameId) -> Option<AnyTraitObject<'a, 'ctx, indirect::Ref>>
+ where
+ 'ctx: 'a,
+ {
+ self.traits(id).as_ref().and_then(|t| t.upcast_to_id(id))
+ }
+
+ fn upcast_to_id_mut<'a>(
+ &'a mut self,
+ id: TypeNameId,
+ ) -> Option<AnyTraitObject<'a, 'ctx, indirect::Mut>>
+ where
+ 'ctx: 'a,
+ {
+ self.traits_mut(id)
+ .as_mut()
+ .and_then(|t| t.upcast_to_id_mut(id))
+ }
+}