Mercurial > lbo > hg > rcombinators
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()));