-
Notifications
You must be signed in to change notification settings - Fork 0
/
rrule_set_test.rs
237 lines (228 loc) · 9.33 KB
/
rrule_set_test.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
use chrono_tz::Tz;
use rrule_rust::{point_time::PointTime, rrule_set::RRuleSet};
fn run_test_by_vec(test_vec: Vec<(&str, Vec<&str>)>) {
test_vec.iter().for_each(|(str, vec)| {
assert_eq!(
RRuleSet::from_str(str).unwrap().all(),
vec.iter()
.map(|time| time.parse::<PointTime>().unwrap().with_timezone(&Tz::UTC))
.collect::<Vec<_>>()
)
});
}
#[test]
fn test_expand_by_day() {
let test_vec = vec![
(
"DTSTART:20231023T180000Z\nRRULE:FREQ=DAILY;COUNT=3",
vec!["20231023T180000", "20231024T180000", "20231025T180000"],
),
(
"DTSTART:20231023T180000Z\nRRULE:FREQ=DAILY;COUNT=3;INTERVAL=2",
vec!["20231023T180000", "20231025T180000", "20231027T180000"],
),
(
"DTSTART:20231023T180000Z\nRRULE:FREQ=DAILY;COUNT=3;INTERVAL=2;BYDAY=MO,TU",
vec!["20231023T180000", "20231031T180000", "20231106T180000"],
),
(
"DTSTART:20231023T180000Z\nRRULE:FREQ=DAILY;COUNT=3;INTERVAL=2;BYDAY=MO,TU;BYMONTH=1",
vec!["20240101T180000", "20240109T180000", "20240115T180000"],
),
(
"DTSTART:20231023T180000Z\nRRULE:FREQ=DAILY;COUNT=3;INTERVAL=2;BYDAY=MO,TU;BYMONTHDAY=1",
vec!["20240101T180000", "20240701T180000", "20241001T180000"],
),
(
"DTSTART:20231023T180000Z\nRRULE:FREQ=DAILY;COUNT=3;INTERVAL=2;BYDAY=MO,TU;BYMONTHDAY=-2",
vec!["20241230T180000", "20250429T180000", "20260629T180000"],
),
(
"DTSTART:20231023T180000Z\nRRULE:FREQ=DAILY;COUNT=3;INTERVAL=2;BYDAY=MO,TU;BYYEARDAY=-1",
vec!["20301231T180000", "20351231T180000", "20411231T180000"],
),
(
"DTSTART:20231023T180000Z\nRRULE:FREQ=DAILY;COUNT=3;INTERVAL=2;BYDAY=MO,TU;BYYEARDAY=2",
vec!["20290102T180000", "20340102T180000", "20450102T180000"],
),
(
"DTSTART:20231023T180000Z\nRRULE:FREQ=DAILY;COUNT=3;INTERVAL=1;BYWEEKNO=20;BYDAY=MO",
vec!["20240513T180000", "20250512T180000", "20260511T180000"],
),
(
"DTSTART:20231023T180000Z\nRRULE:FREQ=DAILY;COUNT=3;INTERVAL=1;BYWEEKNO=-1;BYDAY=MO",
vec!["20231225T180000", "20241223T180000", "20251222T180000"],
),
];
run_test_by_vec(test_vec);
}
#[test]
fn test_expand_by_week() {
let test_vec = vec![
(
"DTSTART:20231123T180000Z\nRRULE:FREQ=WEEKLY;COUNT=3;WKST=MO;",
vec!["20231123T180000", "20231130T180000", "20231207T180000"],
),
(
"DTSTART:20231223T180000Z\nRRULE:FREQ=WEEKLY;COUNT=3;WKST=MO;BYDAY=WE",
vec!["20231227T180000", "20240103T180000", "20240110T180000"],
),
(
"DTSTART:20231223T180000Z\nRRULE:FREQ=WEEKLY;COUNT=5;WKST=MO;BYDAY=WE;BYMONTH=3",
vec!["20240306T180000", "20240313T180000", "20240320T180000", "20240327T180000", "20250305T180000"],
),
(
"DTSTART:20231223T180000Z\nRRULE:FREQ=WEEKLY;COUNT=3;WKST=MO;BYDAY=WE;BYMONTHDAY=1",
vec!["20240501T180000", "20250101T180000", "20251001T180000"],
),
(
"DTSTART:20231223T180000Z\nRRULE:FREQ=WEEKLY;COUNT=3;WKST=MO;BYDAY=WE;BYYEARDAY=2",
vec!["20300102T180000", "20360102T180000", "20410102T180000"],
),
(
"DTSTART:20231223T180000Z\nRRULE:FREQ=WEEKLY;COUNT=3;WKST=MO;BYDAY=WE;BYYEARDAY=2;BYWEEKNO=2",
vec![],
),
(
"DTSTART:20231223T180000Z\nRRULE:FREQ=WEEKLY;COUNT=3;WKST=MO;BYDAY=WE;BYWEEKNO=2",
vec!["20240110T180000", "20250108T180000", "20260107T180000"],
),
(
"DTSTART:20231224T180000Z\nRRULE:FREQ=WEEKLY;COUNT=3;WKST=MO;BYDAY=WE;INTERVAL=2",
vec!["20240103T180000", "20240117T180000", "20240131T180000"],
),
(
"DTSTART:20231224T180000Z\nRRULE:FREQ=WEEKLY;COUNT=3;WKST=SU;BYDAY=WE;INTERVAL=2",
vec!["20231227T180000", "20240110T180000", "20240124T180000"],
),
(
"DTSTART:20231224T180000Z\nRRULE:FREQ=WEEKLY;COUNT=3;WKST=SU;INTERVAL=2",
vec!["20231224T180000", "20240107T180000", "20240121T180000"],
),
];
run_test_by_vec(test_vec);
}
#[test]
fn test_expand_by_month() {
let test_vec = vec![
(
"DTSTART:20231029T091800Z\nRRULE:FREQ=MONTHLY;COUNT=3;WKST=MO;",
vec!["20231029T091800", "20231129T091800", "20231229T091800"],
),
(
"DTSTART:20231029T091800Z\nRRULE:FREQ=MONTHLY;COUNT=3;WKST=MO;INTERVAL=2",
vec!["20231029T091800", "20231229T091800", "20240229T091800"],
),
(
"DTSTART:20231029T091800Z\nRRULE:FREQ=MONTHLY;COUNT=3;WKST=MO;BYMONTHDAY=1,3",
vec!["20231101T091800", "20231103T091800", "20231201T091800"],
),
(
"DTSTART:20231029T091800Z\nRRULE:FREQ=MONTHLY;COUNT=3;WKST=MO;BYMONTHDAY=1,3;BYDAY=FR",
vec!["20231103T091800", "20231201T091800", "20240301T091800"],
),
(
"DTSTART:20231029T091800Z\nRRULE:FREQ=MONTHLY;COUNT=3;WKST=MO;BYMONTHDAY=1;BYDAY=1FR",
vec!["20231201T091800", "20240301T091800", "20241101T091800"],
),
(
"DTSTART:20231123T091800Z\nRRULE:FREQ=MONTHLY;COUNT=3;WKST=MO;BYMONTHDAY=1;BYDAY=1FR;INTERVAL=2",
vec!["20240301T091800", "20241101T091800", "20260501T091800"],
),
(
"DTSTART:20231123T091800Z\nRRULE:FREQ=MONTHLY;COUNT=3;WKST=MO;BYDAY=2FR;",
vec!["20231208T091800", "20240112T091800", "20240209T091800"],
),
(
"DTSTART:20231126T091800Z\nRRULE:FREQ=MONTHLY;COUNT=3;WKST=MO;BYDAY=-2FR;",
vec!["20231222T091800", "20240119T091800", "20240216T091800"],
),
(
"DTSTART:20231023T180000Z\nRRULE:FREQ=MONTHLY;COUNT=3;INTERVAL=1;BYDAY=MO",
vec!["20231023T180000", "20231030T180000", "20231106T180000"],
),
];
run_test_by_vec(test_vec);
}
#[test]
fn test_set_tz_in_str() {
let str = "DTSTART;TZID=America/New_York:20231013T003000\nRRULE:FREQ=WEEKLY;WKST=SU;INTERVAL=1;BYDAY=FR;UNTIL=20231128T105959";
let mut set = RRuleSet::from_str(str).unwrap();
assert_eq!(set.tz, Tz::America__New_York);
set.tz("America/Maceio");
assert_eq!(set.tz, Tz::America__Maceio);
}
#[test]
fn test_set_until_in_str() {
let str = "DTSTART;TZID=America/New_York:20231013T003000\nRRULE:FREQ=WEEKLY;WKST=SU;INTERVAL=1;BYDAY=FR;UNTIL=20231128T105959";
let mut set = RRuleSet::from_str(str).unwrap();
assert_eq!(set.tz, Tz::America__New_York);
set.set_until("20231129T105959");
let rrule = set.rrule.get(0).unwrap();
assert_eq!(
rrule.until.as_ref().unwrap(),
&"20231129T105959".parse::<PointTime>().unwrap()
);
}
#[test]
fn test_set_between() {
let str = "DTSTART;TZID=America/New_York:20231013T091800\nRRULE:FREQ=WEEKLY;WKST=SU;INTERVAL=1;BYDAY=FR;UNTIL=20231128T105959";
let mut set = RRuleSet::from_str(str).unwrap();
set.set_until("20231129T105959");
set.between("20231101T000000", "20231120T000000");
let list: Vec<chrono::prelude::DateTime<Tz>> = set.all();
assert_eq!(
list,
vec!["20231103T091800", "20231110T091800", "20231117T091800"]
.iter()
.map(|time| time
.parse::<PointTime>()
.unwrap()
.with_timezone(&Tz::America__New_York))
.collect::<Vec<_>>()
);
set.between("20231129T000000", "20231220T000000");
assert!(set.all().is_empty());
}
#[test]
fn test_expand_by_year() {
let test_vec = vec![
(
"DTSTART:20231123T091800Z\nRRULE:FREQ=YEARLY;COUNT=3;WKST=MO;",
vec!["20231123T091800", "20241123T091800", "20251123T091800"],
),
(
"DTSTART:20231123T091800Z\nRRULE:FREQ=YEARLY;COUNT=3;WKST=MO;INTERVAL=2",
vec!["20231123T091800", "20251123T091800", "20271123T091800"],
),
(
"DTSTART:20231123T091800Z\nRRULE:FREQ=YEARLY;COUNT=3;WKST=MO;BYDAY=MO",
vec!["20231127T091800", "20231204T091800", "20231211T091800"],
),
(
"DTSTART:20231123T091800Z\nRRULE:FREQ=YEARLY;COUNT=3;WKST=MO;BYDAY=MO,FR",
vec!["20231124T091800", "20231127T091800", "20231201T091800"],
),
(
"DTSTART:20231123T091800Z\nRRULE:FREQ=YEARLY;COUNT=3;WKST=MO;BYDAY=-1FR",
vec!["20231229T091800", "20241227T091800", "20251226T091800"],
),
(
"DTSTART:20231123T091800Z\nRRULE:FREQ=YEARLY;COUNT=3;WKST=MO;BYDAY=FR;BYMONTH=2",
vec!["20240202T091800", "20240209T091800", "20240216T091800"],
),
(
"DTSTART:20231123T091800Z\nRRULE:FREQ=YEARLY;COUNT=3;WKST=MO;BYDAY=MO,FR;BYYEARDAY=20",
vec!["20250120T091800", "20310120T091800", "20340120T091800"],
),
(
"DTSTART:20231123T091800Z\nRRULE:FREQ=YEARLY;COUNT=3;WKST=MO;BYDAY=MO;BYWEEKNO=3",
vec!["20240115T091800", "20250113T091800", "20260112T091800"],
),
(
"DTSTART:20231123T091800Z\nRRULE:FREQ=YEARLY;COUNT=30;WKST=MO;BYDAY=MO;BYWEEKNO=3;UNTIL=20260112T091700",
vec!["20240115T091800", "20250113T091800", "20260112T091800"],
),
];
run_test_by_vec(test_vec);
}