From 6794104cc456bd86a802acd82cf6651e51ed953a Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sun, 19 Nov 2017 13:56:34 +0100 Subject: Fix: Offset problem The core iterator did not yield the base on the first iteration. This is fixed with this commit, using a flag to check whether it already yielded the base and if, start incrementing. Not a clean solution, but a working one. --- README.md | 5 ----- src/iter.rs | 67 +++++++++++++++++++++++++++++++++-------------------------- src/parser.rs | 24 ++++++++++----------- 3 files changed, 49 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index b064e18..0a5d012 100644 --- a/README.md +++ b/README.md @@ -44,11 +44,6 @@ Plus, we want to offer a string-parser which can be used to parse user input into such things. This will be a compiletime option to include the parser or not. -# Known Problems - -* Iterators such as "today daily" start one day off. So "today daily" yields - tomorrow as first item. - # License MPL 2.0 diff --git a/src/iter.rs b/src/iter.rs index b253f9f..85463c8 100644 --- a/src/iter.rs +++ b/src/iter.rs @@ -13,6 +13,7 @@ use matcher::Matcher; pub struct Iter { base: TimeType, increment: TimeType, + had_first: bool, } // An iterator for creating new TimeType instances based on a base-date plus some increment value @@ -29,8 +30,9 @@ impl Iter { Err(KE::from_kind(KEK::ArgumentErrorNotAnAmount(inc))) } else { Ok(Iter { - base: TimeType::moment(base), - increment: inc, + base: TimeType::moment(base), + increment: inc, + had_first: false, }) } } @@ -76,7 +78,12 @@ impl Iterator for Iter { type Item = Result; fn next(&mut self) -> Option { - Some(self.skip().map(|_| self.base.clone())) + if !self.had_first { + self.had_first = true; + Some(Ok(self.base.clone())) + } else { + Some(self.skip().map(|_| self.base.clone())) + } } } @@ -428,11 +435,11 @@ pub mod extensions { .take(5) .collect::>(); - assert_eq!(ymd_hms(2000, 1, 1, 0, 1, 0), *minutes[0].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 1, 1, 0, 2, 0), *minutes[1].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 1, 1, 0, 3, 0), *minutes[2].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 1, 1, 0, 4, 0), *minutes[3].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 1, 1, 0, 5, 0), *minutes[4].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 0, 0, 0), *minutes[0].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 0, 1, 0), *minutes[1].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 0, 2, 0), *minutes[2].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 0, 3, 0), *minutes[3].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 0, 4, 0), *minutes[4].as_ref().unwrap()); } #[test] @@ -443,11 +450,11 @@ pub mod extensions { .take(5) .collect::>(); - assert_eq!(ymd_hms(2000, 1, 1, 1, 0, 0), *minutes[0].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 1, 1, 2, 0, 0), *minutes[1].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 1, 1, 3, 0, 0), *minutes[2].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 1, 1, 4, 0, 0), *minutes[3].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 1, 1, 5, 0, 0), *minutes[4].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 0, 0, 0), *minutes[0].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 1, 0, 0), *minutes[1].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 2, 0, 0), *minutes[2].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 3, 0, 0), *minutes[3].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 4, 0, 0), *minutes[4].as_ref().unwrap()); } #[test] @@ -458,11 +465,11 @@ pub mod extensions { .take(5) .collect::>(); - assert_eq!(ymd_hms(2000, 1, 8, 1, 0, 0), *minutes[0].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 1,15, 1, 0, 0), *minutes[1].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 1,22, 1, 0, 0), *minutes[2].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 1,29, 1, 0, 0), *minutes[3].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 2, 5, 1, 0, 0), *minutes[4].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 1, 0, 0), *minutes[0].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 8, 1, 0, 0), *minutes[1].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1,15, 1, 0, 0), *minutes[2].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1,22, 1, 0, 0), *minutes[3].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1,29, 1, 0, 0), *minutes[4].as_ref().unwrap()); } #[test] @@ -473,11 +480,11 @@ pub mod extensions { .take(5) .collect::>(); - assert_eq!(ymd_hms(2000, 2, 1, 0, 0, 0), *minutes[0].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 3, 1, 0, 0, 0), *minutes[1].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 4, 1, 0, 0, 0), *minutes[2].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 5, 1, 0, 0, 0), *minutes[3].as_ref().unwrap()); - assert_eq!(ymd_hms(2000, 6, 1, 0, 0, 0), *minutes[4].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 0, 0, 0), *minutes[0].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 2, 1, 0, 0, 0), *minutes[1].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 3, 1, 0, 0, 0), *minutes[2].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 4, 1, 0, 0, 0), *minutes[3].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 5, 1, 0, 0, 0), *minutes[4].as_ref().unwrap()); } #[test] @@ -488,11 +495,11 @@ pub mod extensions { .take(5) .collect::>(); - assert_eq!(ymd_hms(2001, 1, 1, 0, 0, 0), *minutes[0].as_ref().unwrap()); - assert_eq!(ymd_hms(2002, 1, 1, 0, 0, 0), *minutes[1].as_ref().unwrap()); - assert_eq!(ymd_hms(2003, 1, 1, 0, 0, 0), *minutes[2].as_ref().unwrap()); - assert_eq!(ymd_hms(2004, 1, 1, 0, 0, 0), *minutes[3].as_ref().unwrap()); - assert_eq!(ymd_hms(2005, 1, 1, 0, 0, 0), *minutes[4].as_ref().unwrap()); + assert_eq!(ymd_hms(2000, 1, 1, 0, 0, 0), *minutes[0].as_ref().unwrap()); + assert_eq!(ymd_hms(2001, 1, 1, 0, 0, 0), *minutes[1].as_ref().unwrap()); + assert_eq!(ymd_hms(2002, 1, 1, 0, 0, 0), *minutes[2].as_ref().unwrap()); + assert_eq!(ymd_hms(2003, 1, 1, 0, 0, 0), *minutes[3].as_ref().unwrap()); + assert_eq!(ymd_hms(2004, 1, 1, 0, 0, 0), *minutes[4].as_ref().unwrap()); } } @@ -582,7 +589,7 @@ mod test_until { #[test] fn test_until_1() { - let end = (TimeType::today() + TimeType::days(2)) + let end = (TimeType::today() + TimeType::days(1)) .calculate() .unwrap() .get_moment() @@ -613,7 +620,7 @@ mod test_until { .until(end) .collect::>(); - assert_eq!(v.len(), 48 - 1); // -1 because we do not start to iterate with 0, but 1 + assert_eq!(v.len(), 48); } } diff --git a/src/parser.rs b/src/parser.rs index 723f4f3..5d518f5 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -785,7 +785,7 @@ mod tests { assert!(ui.is_ok(), "Not okay: {:#?}", ui); let mut ui = ui.unwrap(); - for hour in 1..10 { // 10 is randomly chosen (fair dice roll... ) + for hour in 0..10 { // 10 is randomly chosen (fair dice roll... ) let n = ui.next().unwrap(); assert!(n.is_ok(), "Not ok: {:#?}", n); let tt = n.unwrap(); @@ -809,7 +809,7 @@ mod tests { assert!(ui.is_ok(), "Not okay: {:#?}", ui); let mut ui = ui.unwrap(); - for min in (1..60).into_iter().filter(|n| n % 2 == 0) { + for min in (0..59).into_iter().filter(|n| n % 2 == 0) { let n = ui.next().unwrap(); assert!(n.is_ok(), "Not ok: {:#?}", n); let tt = n.unwrap(); @@ -833,7 +833,7 @@ mod tests { assert!(ui.is_ok(), "Not okay: {:#?}", ui); let mut ui = ui.unwrap(); - for day in 2..30 { + for day in 1..29 { let n = ui.next().unwrap(); assert!(n.is_ok(), "Not ok: {:#?}", n); let tt = n.unwrap(); @@ -857,7 +857,7 @@ mod tests { assert!(ui.is_ok(), "Not okay: {:#?}", ui); let mut ui = ui.unwrap(); - for week in 1..3 { + for week in 0..3 { let n = ui.next().unwrap(); assert!(n.is_ok(), "Not ok: {:#?}", n); let tt = n.unwrap(); @@ -890,8 +890,8 @@ mod tests { let mut ui = ui.unwrap(); println!("Okay: {:#?}", ui); - for hour in 1..10 { // 10 is randomly chosen (fair dice roll... ) - if hour > 5 - 1 { + for hour in 0..10 { // 10 is randomly chosen (fair dice roll... ) + if hour > 4 { let n = ui.next(); assert!(n.is_none(), "Is Some, should be None: {:?}", n); return; @@ -920,8 +920,8 @@ mod tests { assert!(ui.is_ok(), "Not okay: {:#?}", ui); let mut ui = ui.unwrap(); - for min in (1..60).into_iter().filter(|n| n % 2 == 0) { - if min > 10 - 1 { + for min in (0..60).into_iter().filter(|n| n % 2 == 0) { + if min > 9 { let n = ui.next(); assert!(n.is_none(), "Is Some, should be None: {:?}", n); return; @@ -950,8 +950,8 @@ mod tests { assert!(ui.is_ok(), "Not okay: {:#?}", ui); let mut ui = ui.unwrap(); - for day in 2..30 { - if day > 5 - 1 { + for day in 1..30 { + if day > 4 { let n = ui.next(); assert!(n.is_none(), "Is Some, should be None: {:?}", n); return; @@ -980,8 +980,8 @@ mod tests { assert!(ui.is_ok(), "Not okay: {:#?}", ui); let mut ui = ui.unwrap(); - for week in 1..3 { - if (week * 7 + 1) > 14 { + for week in 0..3 { + if (week * 7) > 13 { let n = ui.next(); assert!(n.is_none(), "Is Some, should be None: {:?}", n); return; -- cgit v1.2.3