changeset 19:8920f09345d5

Implement tests for Repeat and fix Max repetition
author Lewin Bormann <lewin@lewin-bormann.info>
date Tue, 04 Jun 2019 00:09:14 +0200
parents d9f4c7963c9f
children 728109a7df09
files src/combinators.rs
diffstat 1 files changed, 41 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/combinators.rs	Mon Jun 03 23:51:52 2019 +0200
+++ b/src/combinators.rs	Tue Jun 04 00:09:14 2019 +0200
@@ -281,10 +281,6 @@
         let mut v: Self::Result = Vec::new();
         let hold = st.hold();
         for i in 0.. {
-            if i > max {
-                st.release(hold);
-                return Ok(v);
-            }
             match self.inner.parse(st) {
                 Ok(r) => v.push(r),
                 Err(e) => {
@@ -297,6 +293,10 @@
                     }
                 }
             }
+            if i >= max - 1 {
+                st.release(hold);
+                return Ok(v);
+            }
         }
         unreachable!()
     }
@@ -378,6 +378,43 @@
     }
 
     #[test]
+    fn test_repeat() {
+        let mut ps = ParseState::new("aaa aaa aaaa aaaa");
+        assert_eq!(
+            3,
+            Repeat::new(StringParser::new("a"), RepeatSpec::Any)
+                .parse(&mut ps)
+                .unwrap()
+                .len()
+        );
+        assert!(StringParser::new(" ").parse(&mut ps).is_ok());
+        assert_eq!(
+            3,
+            Repeat::new(StringParser::new("a"), RepeatSpec::Min(2))
+                .parse(&mut ps)
+                .unwrap()
+                .len()
+        );
+        assert!(StringParser::new(" ").parse(&mut ps).is_ok());
+        assert_eq!(
+            3,
+            Repeat::new(StringParser::new("a"), RepeatSpec::Max(3))
+                .parse(&mut ps)
+                .unwrap()
+                .len()
+        );
+        assert!(StringParser::new("a ").parse(&mut ps).is_ok());
+        assert_eq!(
+            3,
+            Repeat::new(StringParser::new("a"), RepeatSpec::Between(1, 3))
+                .parse(&mut ps)
+                .unwrap()
+                .len()
+        );
+        assert!(StringParser::new("a").parse(&mut ps).is_ok());
+    }
+
+    #[test]
     fn test_partial_sequence() {
         let mut p =
             PartialSequence::new((StringParser::new("a"), StringParser::new("c"), Int64::new()));