summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/iter.rs3
-rw-r--r--src/monthinfo.rs8
-rw-r--r--tests/rrule.rs515
3 files changed, 525 insertions, 1 deletions
diff --git a/src/iter.rs b/src/iter.rs
index 401207e..d6f78b5 100644
--- a/src/iter.rs
+++ b/src/iter.rs
@@ -115,10 +115,12 @@ pub fn iter(iter_result: &mut IterResult, options: &mut ParsedOptions) -> Vec<Da
counter_date.month() as usize,
counter_date.day() as usize,
);
+
let mut dayset = dayset
.into_iter()
.map(|s| Some(s as isize))
.collect::<Vec<Option<isize>>>();
+ println!("dayset: {:?}", dayset);
let filtered = remove_filtered_days(&mut dayset, start, end, &ii, options);
@@ -156,6 +158,7 @@ pub fn iter(iter_result: &mut IterResult, options: &mut ParsedOptions) -> Vec<Da
let current_day = current_day.unwrap();
let date = from_ordinal(ii.yearordinal().unwrap() + current_day);
+ println!("timeset: {}", timeset.len());
for k in 0..timeset.len() {
let res = Utc.ymd(date.year(), date.month(), date.day()).and_hms(
timeset[k].hour as u32,
diff --git a/src/monthinfo.rs b/src/monthinfo.rs
index 4b70c17..a22cf8c 100644
--- a/src/monthinfo.rs
+++ b/src/monthinfo.rs
@@ -30,7 +30,7 @@ pub fn rebuild_month(
let mut ranges: Vec<(isize, isize)> = vec![];
if options.freq == Frequenzy::YEARLY {
if options.bymonth.is_empty() {
- ranges = vec![(0, year as isize)];
+ ranges = vec![(0, yearlen as isize)];
} else {
for j in 0..options.bymonth.len() {
let m = options.bymonth[j];
@@ -49,6 +49,9 @@ pub fn rebuild_month(
// care about cross-year weekly periods.
result.nwdaymask = vec![0; yearlen];
+ println!("{:?}", options.bynweekday);
+ println!("{:?}", ranges);
+
for j in 0..ranges.len() {
let rang = ranges[j];
let first = rang.0;
@@ -60,9 +63,12 @@ pub fn rebuild_month(
let n = options.bynweekday[k][1];
if n < 0 {
i = last + (n + 1) * 7;
+ println!("n: {}, last: {}", n, last);
+ println!("i 1 is {}", i);
i -= pymod(wdaymask[i as usize] as isize - wday, 7);
} else {
i = first + (n - 1) * 7;
+ println!("i 2 is {}", i);
i += pymod(7 - wdaymask[i as usize] as isize + wday, 7);
}
if first <= i && i <= last {
diff --git a/tests/rrule.rs b/tests/rrule.rs
index 6330073..3691fbb 100644
--- a/tests/rrule.rs
+++ b/tests/rrule.rs
@@ -44,6 +44,7 @@ mod test {
}
}
+ #[ignore = "change options"]
#[test]
fn int_works() {
let mut options = ParsedOptions::new(Frequenzy::WEEKLY, &ymd_hms(2012, 1, 1, 10, 30, 0))
@@ -74,4 +75,518 @@ mod test {
],
);
}
+
+ #[test]
+ fn yearly_interval() {
+ let mut options = ParsedOptions::new(Frequenzy::YEARLY, &ymd_hms(1997, 9, 2, 9, 0, 0))
+ .count(3)
+ .interval(2);
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1997, 9, 2, 9, 0, 0),
+ ymd_hms(1999, 9, 2, 9, 0, 0),
+ ymd_hms(2001, 9, 2, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_interval_large() {
+ let mut options = ParsedOptions::new(Frequenzy::YEARLY, &ymd_hms(1997, 9, 2, 9, 0, 0))
+ .count(3)
+ .interval(40);
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1997, 9, 2, 9, 0, 0),
+ ymd_hms(2037, 9, 2, 9, 0, 0),
+ ymd_hms(2077, 9, 2, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_month() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(3),
+ bymonth: vec![1, 3],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![],
+ bymonthday: vec![2],
+ bynweekday: vec![],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1998, 1, 2, 9, 0, 0),
+ ymd_hms(1998, 3, 2, 9, 0, 0),
+ ymd_hms(1999, 1, 2, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_monthday() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(3),
+ bymonth: vec![],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![],
+ bymonthday: vec![1, 3],
+ bynweekday: vec![],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1997, 9, 3, 9, 0, 0),
+ ymd_hms(1997, 10, 1, 9, 0, 0),
+ ymd_hms(1997, 10, 3, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_month_and_monthday() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(3),
+ bymonth: vec![1, 3],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![],
+ bymonthday: vec![5, 7],
+ bynweekday: vec![],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1998, 1, 5, 9, 0, 0),
+ ymd_hms(1998, 1, 7, 9, 0, 0),
+ ymd_hms(1998, 3, 5, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_weekday() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(3),
+ bymonth: vec![],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![1, 3],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![],
+ bymonthday: vec![],
+ bynweekday: vec![],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1997, 9, 2, 9, 0, 0),
+ ymd_hms(1997, 9, 4, 9, 0, 0),
+ ymd_hms(1997, 9, 9, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_nweekday() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(3),
+ bymonth: vec![],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![],
+ bymonthday: vec![],
+ bynweekday: vec![vec![1, 1], vec![3, -1]],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1997, 12, 25, 9, 0, 0),
+ ymd_hms(1998, 1, 6, 9, 0, 0),
+ ymd_hms(1998, 12, 31, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_nweekday_large() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(3),
+ bymonth: vec![],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![],
+ bymonthday: vec![],
+ bynweekday: vec![vec![1, 13], vec![3, -13]],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1997, 10, 2, 9, 0, 0),
+ ymd_hms(1998, 3, 31, 9, 0, 0),
+ ymd_hms(1998, 10, 8, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_month_and_weekday() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(3),
+ bymonth: vec![1, 3],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![1, 3],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![],
+ bymonthday: vec![],
+ bynweekday: vec![],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1998, 1, 1, 9, 0, 0),
+ ymd_hms(1998, 1, 6, 9, 0, 0),
+ ymd_hms(1998, 1, 8, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_month_and_nweekday() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(3),
+ bymonth: vec![1, 3],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![],
+ bymonthday: vec![],
+ bynweekday: vec![vec![1, 1], vec![3, -1]],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1998, 1, 6, 9, 0, 0),
+ ymd_hms(1998, 1, 29, 9, 0, 0),
+ ymd_hms(1998, 3, 3, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_month_and_nweekday_large() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(3),
+ bymonth: vec![1, 3],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![],
+ bymonthday: vec![],
+ bynweekday: vec![vec![1, 3], vec![3, -3]],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1998, 1, 15, 9, 0, 0),
+ ymd_hms(1998, 1, 20, 9, 0, 0),
+ ymd_hms(1998, 3, 12, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_monthday_and_weekday() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(3),
+ bymonth: vec![],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![1, 3],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![],
+ bymonthday: vec![1, 3],
+ bynweekday: vec![],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1998, 1, 1, 9, 0, 0),
+ ymd_hms(1998, 2, 3, 9, 0, 0),
+ ymd_hms(1998, 3, 3, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_month_and_monthday_and_weekday() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(3),
+ bymonth: vec![1, 3],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![1, 3],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![],
+ bymonthday: vec![1, 3],
+ bynweekday: vec![],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1998, 1, 1, 9, 0, 0),
+ ymd_hms(1998, 3, 3, 9, 0, 0),
+ ymd_hms(2001, 3, 1, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_yearday() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(4),
+ bymonth: vec![],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![1, 100, 200, 365],
+ bymonthday: vec![],
+ bynweekday: vec![],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1997, 12, 31, 9, 0, 0),
+ ymd_hms(1998, 1, 1, 9, 0, 0),
+ ymd_hms(1998, 4, 10, 9, 0, 0),
+ ymd_hms(1998, 7, 19, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[ignore = "negative yeardays are not supported"]
+ #[test]
+ fn yearly_by_yeardayneq() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(4),
+ bymonth: vec![],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![365],
+ bymonthday: vec![],
+ bynweekday: vec![],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1997, 12, 31, 9, 0, 0),
+ ymd_hms(1998, 1, 1, 9, 0, 0),
+ ymd_hms(1998, 4, 10, 9, 0, 0),
+ ymd_hms(1998, 7, 19, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_month_and_yearday() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(4),
+ bymonth: vec![4, 7],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![1, 100, 200, 365],
+ bymonthday: vec![],
+ bynweekday: vec![],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1998, 4, 10, 9, 0, 0),
+ ymd_hms(1998, 7, 19, 9, 0, 0),
+ ymd_hms(1999, 4, 10, 9, 0, 0),
+ ymd_hms(1999, 7, 19, 9, 0, 0),
+ ],
+ );
+ }
+
+ #[test]
+ fn yearly_by_weekno() {
+ let mut options = ParsedOptions {
+ freq: Frequenzy::YEARLY,
+ count: Some(3),
+ bymonth: vec![],
+ dtstart: ymd_hms(1997, 9, 2, 9, 0, 0),
+ byweekday: vec![20],
+ byhour: vec![9],
+ bysetpos: vec![],
+ byweekno: vec![],
+ byminute: vec![0],
+ bysecond: vec![0],
+ byyearday: vec![],
+ bymonthday: vec![],
+ bynweekday: vec![],
+ bynmonthday: vec![],
+ until: None,
+ wkst: 0,
+ tzid: None,
+ interval: 1,
+ };
+ test_recurring(
+ &mut options,
+ &vec![
+ ymd_hms(1998, 5, 11, 9, 0, 0),
+ ymd_hms(1999, 5, 12, 9, 0, 0),
+ ymd_hms(1999, 5, 13, 9, 0, 0),
+ ],
+ );
+ }
}