Diffstat (limited to 'tests/common/protocol/hint.rs')
-rw-r--r--tests/common/protocol/hint.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/common/protocol/hint.rs b/tests/common/protocol/hint.rs
new file mode 100644
index 0000000..bcc2a02
--- /dev/null
+++ b/tests/common/protocol/hint.rs
@@ -0,0 +1,46 @@
+use mockall::mock;
+use treaty::{
+ any::{any_trait, TypeName},
+ effect::{Effect, Future},
+ protocol::{
+ walker::hint::{Hint, HintMeta, HintProto, Known},
+ Visitor,
+ },
+ Flow,
+};
+
+pub type KnownFactory<P> =
+ for<'a, 'ctx> fn(&'ctx (), &'a <P as HintMeta>::Hint) -> Result<Known<'a, 'ctx, P>, ()>;
+
+mock! {
+ pub HintVisitor<P: HintMeta, E> {
+ pub fn hint<'a, 'ctx>(&'a mut self, visitor: Visitor<'a, 'ctx>, hint: <P as HintMeta>::Hint) -> Flow;
+
+ pub fn known(&self) -> KnownFactory<P>;
+ }
+}
+
+any_trait! {
+ impl['ctx, P, E] MockHintVisitor<P, E> = [
+ HintProto<P, E>
+ ] where
+ P: HintMeta,
+ E: Effect,
+}
+
+impl<'ctx, P: HintMeta, E: Effect> Hint<'ctx, P, E> for MockHintVisitor<P, E> {
+ fn hint<'a>(
+ &'a mut self,
+ visitor: Visitor<'a, 'ctx>,
+ hint: <P as HintMeta>::Hint,
+ ) -> Future<'a, Flow, E> {
+ E::ready(self.hint(visitor, hint))
+ }
+
+ fn known<'a>(
+ &'a mut self,
+ hint: &'a <P as HintMeta>::Hint,
+ ) -> Future<'a, Result<Known<'a, 'ctx, P>, ()>, E> {
+ E::ready(Self::known(self)(&(), hint))
+ }
+}