From 9e16bada6c0c903782f944100c754e05c8c52aec Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 5 Apr 2021 17:12:41 +0100 Subject: [PATCH] wdriver: Generalise LogIgnoreBefore Signed-off-by: Ian Jackson --- wdriver/wdriver.rs | 49 ++++++++++++++++++++++++++++--------------- wdriver/wdt-hand.rs | 2 +- wdriver/wdt-simple.rs | 3 ++- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/wdriver/wdriver.rs b/wdriver/wdriver.rs index b008eb82..745d7a05 100644 --- a/wdriver/wdriver.rs +++ b/wdriver/wdriver.rs @@ -260,6 +260,15 @@ pub struct WPiece { p: JsV, } +pub trait LogIgnoreBefore { + fn matches(&mut self, s: &str) -> bool; +} +type LogIgnoreBeforeFn<'r> = &'r mut dyn FnMut(&str) -> bool; + +impl<'r> LogIgnoreBefore for LogIgnoreBeforeFn<'r> { + fn matches<'s>(&mut self, s: &'s str) -> bool { self(s) } +} + impl<'g> WindowGuard<'g> { #[throws(AE)] pub fn piece_vpid(&'g self, some_pieceid: &'_ str) -> Vpid { @@ -395,25 +404,31 @@ impl<'g> WindowGuard<'g> { } #[throws(AE)] - pub fn retrieve_log( - &self, - ignore_before: &mut dyn FnMut(&str) -> bool) - -> Vec + pub fn retrieve_log(&self, mut ignore_before: I) + -> Vec { - let log = self.find_elements(By::ClassName("logmsg"))?; - let log = log.iter() - .rev() - .map(|e| e.inner_html()) - .take_while(|h| { - h.as_ref().ok() - .map(|s: &String| ignore_before(s)) - != Some(true) - }) - .collect::,_>>()?; - - assert!( ! log.is_empty() ); + #[throws(AE)] + fn inner<'g, 'i> + (w: &'g WindowGuard, ignore_before: LogIgnoreBeforeFn<'i>) + -> Vec + { + let log = w.find_elements(By::ClassName("logmsg"))?; + let log = log.iter() + .rev() + .map(|e| e.inner_html()) + .take_while(|h| { + h.as_ref().ok() + .map(|s: &String| ignore_before(s)) + != Some(true) + }) + .collect::,_>>()?; + + assert!( ! log.is_empty() ); + + dbg!(log) + } - dbg!(log) + inner(&self, &mut move |s| ignore_before.matches(s))? } #[throws(AE)] diff --git a/wdriver/wdt-hand.rs b/wdriver/wdt-hand.rs index ac6d7829..ab567a07 100644 --- a/wdriver/wdt-hand.rs +++ b/wdriver/wdt-hand.rs @@ -101,7 +101,7 @@ impl Ctx { for side in &[&self.alice, &self.bob] { let mut w = su.w(side)?; w.synch()?; - let log = w.retrieve_log(&mut |_|false)?; + let log = w.retrieve_log((&mut |_: &'_ _| false) as LogIgnoreBeforeFn)?; assert_eq!(log.find_conflict(), None); } diff --git a/wdriver/wdt-simple.rs b/wdriver/wdt-simple.rs index 896d8644..6c54a508 100644 --- a/wdriver/wdt-simple.rs +++ b/wdriver/wdt-simple.rs @@ -244,7 +244,8 @@ impl Ctx { let p = w.find_piece(pc)?; let now = p.posg()?; - let log = w.retrieve_log(&mut |s| s.contains("black knight"))?; + let log = w.retrieve_log((&mut |s: &str| s.contains("black knight")) + as LogIgnoreBeforeFn)?; let held = w.piece_held(&pc)?; let client = w.client()?; let yes = held.as_ref() == Some(&client); -- 2.30.2