chiark / gitweb /
wdriver: Generalise LogIgnoreBefore
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Apr 2021 16:12:41 +0000 (17:12 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Apr 2021 16:31:23 +0000 (17:31 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
wdriver/wdriver.rs
wdriver/wdt-hand.rs
wdriver/wdt-simple.rs

index b008eb82f216a9ef22a1b9aad89a4b3c73213809..745d7a059026d09982fd58fdbe12295046da6f7e 100644 (file)
@@ -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<String>
+  pub fn retrieve_log<I: LogIgnoreBefore>(&self, mut ignore_before: I)
+                                          -> Vec<String>
   {
-    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::<Result<Vec<String>,_>>()?;
-
-    assert!( ! log.is_empty() );
+    #[throws(AE)]
+    fn inner<'g, 'i>
+      (w: &'g WindowGuard, ignore_before: LogIgnoreBeforeFn<'i>)
+       -> Vec<String>
+    {
+      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::<Result<Vec<String>,_>>()?;
+
+      assert!( ! log.is_empty() );
+
+      dbg!(log)
+    }
 
-    dbg!(log)
+    inner(&self, &mut move |s| ignore_before.matches(s))?
   }
 
   #[throws(AE)]
index ac6d7829b07507d7b55d7b5ab73058beb766ac4b..ab567a077e6d196ef1fe4e088b2ac4759307989e 100644 (file)
@@ -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);
     }
 
index 896d8644b9c7d65b3adca70b039a0e73f1b1bc15..6c54a508e2613f84ac97f060fc3cc7af6a09414c 100644 (file)
@@ -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);