Diffstat (limited to 'tests/protocol_walker_hint.rs')
| -rw-r--r-- | tests/protocol_walker_hint.rs | 578 |
1 files changed, 289 insertions, 289 deletions
diff --git a/tests/protocol_walker_hint.rs b/tests/protocol_walker_hint.rs index a09b1f3..53f96da 100644 --- a/tests/protocol_walker_hint.rs +++ b/tests/protocol_walker_hint.rs @@ -19,295 +19,295 @@ use crate::common::{builder::MockBuilder, protocol::hint::KnownFactory}; mod common; -/// This tests for the hint protocol being able to give the known info and being able to hint. -#[test] -fn can_get_known_and_hint() { - // The protocol we will hint for. - struct MyProtocol; - - // The known value for the protocol. - #[derive(Debug, PartialEq)] - struct Known(f32); - - // Link the higher ranked type with the known type. - higher_ranked_type! { - impl Meta { - impl['a, 'ctx] type T['a, 'ctx] for Known = Known; - impl['a, 'ctx] type HigherRanked['a, 'ctx] for Known = Known; - } - } - - #[derive(Debug, PartialEq)] - struct Hint(i32); - - higher_ranked_type! { - impl Meta { - impl['a, 'ctx] type T['a, 'ctx] for Hint = Hint; - impl['a, 'ctx] type HigherRanked['a, 'ctx] for Hint = Hint; - } - } - - // Enroll the protocol in the hint system. - impl HintMeta for MyProtocol { - type Known = Known; - type Hint = Hint; - type Effect = Blocking; - } - - let mut mock = MockHintWalker::<MyProtocol>::new(); - - mock.expect_known() - .once() - .return_const((|_, Hint(hint)| Ok(Known(*hint as f32))) as KnownFactory<MyProtocol>); - - mock.expect_hint() - .once() - .withf(|_visitor, Hint(hint)| *hint == 123) - .return_const(Flow::Done); - - // Get the mock as a hint protocol trait object. - let walker: &mut dyn hint::Hint<MyProtocol> = &mut mock; - - // We can call known to get what the walker knows about the protocol. - assert_eq!(walker.known(&Hint(42)).value(), Ok(Known(42.0))); - - { - // A hint needs the visitor for the walker to walk. - let mut mock = MockBuilder::<(), (), ()>::new(); - - // We can call hint to "commit" to the protocol and ask the walker to use it. - assert_eq!( - walker.hint(DynVisitor(&mut mock), Hint(123)).value(), - Flow::Done - ); - } -} - -#[test] -fn known_can_have_temp_mutable_borrow() { - struct MyProtocol; - - struct KnownHrt; - - #[derive(Debug, PartialEq)] - struct Known<'a>(&'a mut String); - - higher_ranked_type! { - impl Meta { - impl['a, 'ctx] type T['a, 'ctx] for KnownHrt = Known<'a>; - impl['a, 'ctx] type HigherRanked['a, 'ctx] for Known<'a> = KnownHrt; - } - } - - impl HintMeta for MyProtocol { - type Known = KnownHrt; - type Hint = (); - type Effect = Blocking; - } - - struct Walker<'ctx>(&'ctx mut String); - - impl<'ctx> Hint<'ctx, MyProtocol> for Walker<'ctx> { - fn hint<'this, 'visitor, 'hint, 'e>( - &'this mut self, - visitor: DynVisitor<'visitor, 'ctx>, - hint: MetaHint<'hint, 'ctx, MyProtocol>, - ) -> ErasedEffective<'e, Flow, Blocking> - where - 'ctx: 'this + 'visitor + 'hint + 'e, - { - unreachable!() - } - - fn known<'a>( - &'a mut self, - (): &'a <MyProtocol as HintMeta>::Hint, - ) -> ErasedEffective<'a, Result<MetaKnown<'a, 'ctx, MyProtocol>, ()>, Blocking> { - self.0.push_str("test"); - - Blocking::<Spin>::ready(Ok(Known(self.0))) - } - } - - let mut context = String::new(); - - { - let mut walker = Walker(&mut context); - - // Get the mock as a hint protocol trait object. - let walker: &mut dyn Hint<MyProtocol> = &mut walker; - - // We can call known to get what the walker knows about the protocol. - let mut x = String::from("test"); - assert_eq!(walker.known(&()).value(), Ok(Known(&mut x))); - } - - drop(context); -} - -#[test] -fn known_can_have_context_borrow() { - struct MyProtocol; - - struct KnownHrt; - - #[derive(Debug, PartialEq)] - struct Known<'ctx>(&'ctx String); - - higher_ranked_type! { - impl Meta { - impl['a, 'ctx] type T['a, 'ctx] for KnownHrt = Known<'ctx>; - impl['a, 'ctx] type HigherRanked['a, 'ctx] for Known<'ctx> = KnownHrt; - } - } - - impl HintMeta for MyProtocol { - type Known = KnownHrt; - type Hint = (); - type Effect = Blocking; - } - - struct Walker<'ctx>(&'ctx String); - - impl<'ctx> Hint<'ctx, MyProtocol> for Walker<'ctx> { - fn hint<'this, 'visitor, 'hint, 'e>( - &'this mut self, - visitor: DynVisitor<'visitor, 'ctx>, - hint: MetaHint<'hint, 'ctx, MyProtocol>, - ) -> ErasedEffective<'e, Flow, Blocking> - where - 'ctx: 'this + 'visitor + 'hint + 'e, - { - unreachable!() - } - - fn known<'a>( - &'a mut self, - (): &'a <MyProtocol as HintMeta>::Hint, - ) -> ErasedEffective<'a, Result<MetaKnown<'a, 'ctx, MyProtocol>, ()>, Blocking> { - Blocking::<Spin>::ready(Ok(Known(self.0))) - } - } - - let context = String::from("test"); - - let ctx = { - let mut walker = Walker(&context); - - // Get the mock as a hint protocol trait object. - let walker: &mut dyn Hint<MyProtocol> = &mut walker; - - // We can call known to get what the walker knows about the protocol. - let Ok(Known(y)) = walker.known(&()).value() else { - unreachable!() - }; - y - }; - - assert_eq!(ctx, "test"); - - drop(context); -} - -#[test] -fn hint_can_have_temp_mutable_borrow() { - struct MyProtocol; - - struct HintHrt; - - #[derive(Debug, PartialEq)] - struct Hint<'a>(&'a mut String); - - higher_ranked_type! { - impl Meta { - impl['a, 'ctx] type T['a, 'ctx] for HintHrt = Hint<'a>; - impl['a, 'ctx] type HigherRanked['a, 'ctx] for Hint<'a> = HintHrt; - } - } - - impl HintMeta for MyProtocol { - type Known = (); - type Hint = HintHrt; - type Effect = Blocking; - } - - let mut mock = MockHintWalker::new(); - - mock.expect_hint().once().returning(|_, hint: Hint| { - hint.0.push_str("test"); - - Flow::Done - }); - - { - // Get the mock as a hint protocol trait object. - let walker: &mut dyn hint::Hint<MyProtocol> = &mut mock; - - let mut visitor = MockBuilder::<(), (), ()>::new(); - - let mut temp = String::new(); - - // We can call known to get what the walker knows about the protocol. - assert_eq!( - walker - .hint(DynVisitor(&mut visitor), Hint(&mut temp)) - .value(), - Flow::Done - ); - - assert_eq!(temp, "test"); - } -} - -#[test] -fn hint_can_have_context_borrow() { - struct MyProtocol; - - struct HintHrt; - - #[derive(Debug, PartialEq)] - struct Hint<'ctx>(&'ctx String); - - higher_ranked_type! { - impl Meta { - impl['a, 'ctx] type T['a, 'ctx] for HintHrt = Hint<'ctx>; - impl['a, 'ctx] type HigherRanked['a, 'ctx] for Hint<'ctx> = HintHrt; - } - } - - impl HintMeta for MyProtocol { - type Known = (); - type Hint = HintHrt; - type Effect = Blocking; - } - - let mut mock = MockHintWalker::new(); - - mock.expect_hint().once().returning(|_, hint: Hint| { - assert_eq!(hint.0, "test"); - - Flow::Done - }); - - let context = String::from("test"); - - { - // Get the mock as a hint protocol trait object. - let walker: &mut dyn hint::Hint<MyProtocol> = &mut mock; - - let mut visitor = MockBuilder::<(), (), ()>::new(); - - // We can call known to get what the walker knows about the protocol. - assert_eq!( - walker - .hint(DynVisitor(&mut visitor), Hint(&context)) - .value(), - Flow::Done - ); - } - - drop(context); -} +// /// This tests for the hint protocol being able to give the known info and being able to hint. +// #[test] +// fn can_get_known_and_hint() { +// // The protocol we will hint for. +// struct MyProtocol; +// +// // The known value for the protocol. +// #[derive(Debug, PartialEq)] +// struct Known(f32); +// +// // Link the higher ranked type with the known type. +// higher_ranked_type! { +// impl Meta { +// impl['a, 'ctx] type T['a, 'ctx] for Known = Known; +// impl['a, 'ctx] type HigherRanked['a, 'ctx] for Known = Known; +// } +// } +// +// #[derive(Debug, PartialEq)] +// struct Hint(i32); +// +// higher_ranked_type! { +// impl Meta { +// impl['a, 'ctx] type T['a, 'ctx] for Hint = Hint; +// impl['a, 'ctx] type HigherRanked['a, 'ctx] for Hint = Hint; +// } +// } +// +// // Enroll the protocol in the hint system. +// impl HintMeta for MyProtocol { +// type Known = Known; +// type Hint = Hint; +// type Effect = Blocking; +// } +// +// let mut mock = MockHintWalker::<MyProtocol>::new(); +// +// mock.expect_known() +// .once() +// .return_const((|_, Hint(hint)| Ok(Known(*hint as f32))) as KnownFactory<MyProtocol>); +// +// mock.expect_hint() +// .once() +// .withf(|_visitor, Hint(hint)| *hint == 123) +// .return_const(Flow::Done); +// +// // Get the mock as a hint protocol trait object. +// let walker: &mut dyn hint::Hint<MyProtocol> = &mut mock; +// +// // We can call known to get what the walker knows about the protocol. +// assert_eq!(walker.known(&Hint(42)).value(), Ok(Known(42.0))); +// +// { +// // A hint needs the visitor for the walker to walk. +// let mut mock = MockBuilder::<(), (), ()>::new(); +// +// // We can call hint to "commit" to the protocol and ask the walker to use it. +// assert_eq!( +// walker.hint(DynVisitor(&mut mock), Hint(123)).value(), +// Flow::Done +// ); +// } +// } + +// #[test] +// fn known_can_have_temp_mutable_borrow() { +// struct MyProtocol; +// +// struct KnownHrt; +// +// #[derive(Debug, PartialEq)] +// struct Known<'a>(&'a mut String); +// +// higher_ranked_type! { +// impl Meta { +// impl['a, 'ctx] type T['a, 'ctx] for KnownHrt = Known<'a>; +// impl['a, 'ctx] type HigherRanked['a, 'ctx] for Known<'a> = KnownHrt; +// } +// } +// +// impl HintMeta for MyProtocol { +// type Known = KnownHrt; +// type Hint = (); +// type Effect = Blocking; +// } +// +// struct Walker<'ctx>(&'ctx mut String); +// +// impl<'ctx> Hint<'ctx, MyProtocol> for Walker<'ctx> { +// fn hint<'this, 'visitor, 'hint, 'e>( +// &'this mut self, +// visitor: DynVisitor<'visitor, 'ctx>, +// hint: MetaHint<'hint, 'ctx, MyProtocol>, +// ) -> ErasedEffective<'e, Flow, Blocking> +// where +// 'ctx: 'this + 'visitor + 'hint + 'e, +// { +// unreachable!() +// } +// +// fn known<'a>( +// &'a mut self, +// (): &'a <MyProtocol as HintMeta>::Hint, +// ) -> ErasedEffective<'a, Result<MetaKnown<'a, 'ctx, MyProtocol>, ()>, Blocking> { +// self.0.push_str("test"); +// +// Blocking::<Spin>::ready(Ok(Known(self.0))) +// } +// } +// +// let mut context = String::new(); +// +// { +// let mut walker = Walker(&mut context); +// +// // Get the mock as a hint protocol trait object. +// let walker: &mut dyn Hint<MyProtocol> = &mut walker; +// +// // We can call known to get what the walker knows about the protocol. +// let mut x = String::from("test"); +// assert_eq!(walker.known(&()).value(), Ok(Known(&mut x))); +// } +// +// drop(context); +// } + +// #[test] +// fn known_can_have_context_borrow() { +// struct MyProtocol; +// +// struct KnownHrt; +// +// #[derive(Debug, PartialEq)] +// struct Known<'ctx>(&'ctx String); +// +// higher_ranked_type! { +// impl Meta { +// impl['a, 'ctx] type T['a, 'ctx] for KnownHrt = Known<'ctx>; +// impl['a, 'ctx] type HigherRanked['a, 'ctx] for Known<'ctx> = KnownHrt; +// } +// } +// +// impl HintMeta for MyProtocol { +// type Known = KnownHrt; +// type Hint = (); +// type Effect = Blocking; +// } +// +// struct Walker<'ctx>(&'ctx String); +// +// impl<'ctx> Hint<'ctx, MyProtocol> for Walker<'ctx> { +// fn hint<'this, 'visitor, 'hint, 'e>( +// &'this mut self, +// visitor: DynVisitor<'visitor, 'ctx>, +// hint: MetaHint<'hint, 'ctx, MyProtocol>, +// ) -> ErasedEffective<'e, Flow, Blocking> +// where +// 'ctx: 'this + 'visitor + 'hint + 'e, +// { +// unreachable!() +// } +// +// fn known<'a>( +// &'a mut self, +// (): &'a <MyProtocol as HintMeta>::Hint, +// ) -> ErasedEffective<'a, Result<MetaKnown<'a, 'ctx, MyProtocol>, ()>, Blocking> { +// Blocking::<Spin>::ready(Ok(Known(self.0))) +// } +// } +// +// let context = String::from("test"); +// +// let ctx = { +// let mut walker = Walker(&context); +// +// // Get the mock as a hint protocol trait object. +// let walker: &mut dyn Hint<MyProtocol> = &mut walker; +// +// // We can call known to get what the walker knows about the protocol. +// let Ok(Known(y)) = walker.known(&()).value() else { +// unreachable!() +// }; +// y +// }; +// +// assert_eq!(ctx, "test"); +// +// drop(context); +// } +// +// #[test] +// fn hint_can_have_temp_mutable_borrow() { +// struct MyProtocol; +// +// struct HintHrt; +// +// #[derive(Debug, PartialEq)] +// struct Hint<'a>(&'a mut String); +// +// higher_ranked_type! { +// impl Meta { +// impl['a, 'ctx] type T['a, 'ctx] for HintHrt = Hint<'a>; +// impl['a, 'ctx] type HigherRanked['a, 'ctx] for Hint<'a> = HintHrt; +// } +// } +// +// impl HintMeta for MyProtocol { +// type Known = (); +// type Hint = HintHrt; +// type Effect = Blocking; +// } +// +// let mut mock = MockHintWalker::new(); +// +// mock.expect_hint().once().returning(|_, hint: Hint| { +// hint.0.push_str("test"); +// +// Flow::Done +// }); +// +// { +// // Get the mock as a hint protocol trait object. +// let walker: &mut dyn hint::Hint<MyProtocol> = &mut mock; +// +// let mut visitor = MockBuilder::<(), (), ()>::new(); +// +// let mut temp = String::new(); +// +// // We can call known to get what the walker knows about the protocol. +// assert_eq!( +// walker +// .hint(DynVisitor(&mut visitor), Hint(&mut temp)) +// .value(), +// Flow::Done +// ); +// +// assert_eq!(temp, "test"); +// } +// } +// +// #[test] +// fn hint_can_have_context_borrow() { +// struct MyProtocol; +// +// struct HintHrt; +// +// #[derive(Debug, PartialEq)] +// struct Hint<'ctx>(&'ctx String); +// +// higher_ranked_type! { +// impl Meta { +// impl['a, 'ctx] type T['a, 'ctx] for HintHrt = Hint<'ctx>; +// impl['a, 'ctx] type HigherRanked['a, 'ctx] for Hint<'ctx> = HintHrt; +// } +// } +// +// impl HintMeta for MyProtocol { +// type Known = (); +// type Hint = HintHrt; +// type Effect = Blocking; +// } +// +// let mut mock = MockHintWalker::new(); +// +// mock.expect_hint().once().returning(|_, hint: Hint| { +// assert_eq!(hint.0, "test"); +// +// Flow::Done +// }); +// +// let context = String::from("test"); +// +// { +// // Get the mock as a hint protocol trait object. +// let walker: &mut dyn hint::Hint<MyProtocol> = &mut mock; +// +// let mut visitor = MockBuilder::<(), (), ()>::new(); +// +// // We can call known to get what the walker knows about the protocol. +// assert_eq!( +// walker +// .hint(DynVisitor(&mut visitor), Hint(&context)) +// .value(), +// Flow::Done +// ); +// } +// +// drop(context); +// } #[test] fn hint_proto() { |