Projet

Général

Profil

Paste
Télécharger (25,7 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / date / date_repeat / tests / date_repeat.test @ db9ffd17

1
<?php
2

    
3
/**
4
 * @file
5
 * Test Date Repeat calculations.
6
 */
7

    
8
class DateRepeatTestCase extends DrupalWebTestCase {
9
  public static function getInfo() {
10
    return array(
11
      'name' => t('Date Repeat'),
12
      'description' => t('Test Date Repeat functions to create arrays of dates from iCal rules.') ,
13
      'group' => t('Date'),
14
    );
15
  }
16

    
17
  /**
18
   * Implements setUp().
19
   */
20
  public function setUp() {
21
    // Load the date_repeat module.
22
    parent::setUp('date_api', 'date_repeat');
23
  }
24

    
25
  public function testDateRepeat() {
26
    require_once('./' . drupal_get_path('module', 'date_api') . '/date_api_ical.inc');
27
    require_once('./' . drupal_get_path('module', 'date_repeat') . '/date_repeat_calc.inc');
28
    // Examples adapted from http://www.faqs.org/rfcs/rfc2445.html and
29
    // http://www.kanzaki.com/docs/ical/rrule.html.
30

    
31
    //  Invalid value:
32
    $start = "1997-09-02 09:00:00";
33
    $end = "1997-09-30 09:00:00";
34
    $rule = "RRULE:FREQ=NONE;INTERVAL=0;COUNT=10";
35
    $dates = date_repeat_calc($rule, $start, $end, array());
36
    //  should be (1997 9:00 AM EDT)September 2-11
37
    $shouldbe = '';
38
    $result = implode(', ', $dates);
39
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
40

    
41
    //  Daily for 10 occurrences:
42
    $start = "1997-09-02 09:00:00";
43
    $end = "1997-09-30 09:00:00";
44
    $rule = "RRULE:FREQ=DAILY;COUNT=10";
45
    $dates = date_repeat_calc($rule, $start, $end, array());
46
    //  should be (1997 9:00 AM EDT)September 2-11
47
    $shouldbe = '1997-09-02 09:00:00, 1997-09-03 09:00:00, 1997-09-04 09:00:00, 1997-09-05 09:00:00, 1997-09-06 09:00:00, 1997-09-07 09:00:00, 1997-09-08 09:00:00, 1997-09-09 09:00:00, 1997-09-10 09:00:00, 1997-09-11 09:00:00';
48
    $result = implode(', ', $dates);
49
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
50

    
51
    //Daily until September 24, 1997:
52
    $start = "1997-09-02 09:00:00";
53
    $end = "1997-09-30 09:00:00";
54
    $rule = "RRULE:FREQ=DAILY;UNTIL=19970924T000000Z";
55
    $dates = date_repeat_calc($rule, $start, $end, array());
56
    //  should be (1997 9:00 AM EDT)September 2-23
57
    $shouldbe = '1997-09-02 09:00:00, 1997-09-03 09:00:00, 1997-09-04 09:00:00, 1997-09-05 09:00:00, 1997-09-06 09:00:00, 1997-09-07 09:00:00, 1997-09-08 09:00:00, 1997-09-09 09:00:00, 1997-09-10 09:00:00, 1997-09-11 09:00:00, 1997-09-12 09:00:00, 1997-09-13 09:00:00, 1997-09-14 09:00:00, 1997-09-15 09:00:00, 1997-09-16 09:00:00, 1997-09-17 09:00:00, 1997-09-18 09:00:00, 1997-09-19 09:00:00, 1997-09-20 09:00:00, 1997-09-21 09:00:00, 1997-09-22 09:00:00, 1997-09-23 09:00:00';
58
    $result = implode(', ', $dates);
59
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
60

    
61
    //Every other day - until September 30:
62
    $start = "1997-09-02 09:00:00";
63
    $end = "1997-09-30 09:00:00";
64
    $rule = "RRULE:FREQ=DAILY;INTERVAL=2";
65
    $dates = date_repeat_calc($rule, $start, $end, array());
66
    // should be (1997 9:00 AM EDT)September2,4,6,8...24,26,28,30;
67
    $shouldbe = '1997-09-02 09:00:00, 1997-09-04 09:00:00, 1997-09-06 09:00:00, 1997-09-08 09:00:00, 1997-09-10 09:00:00, 1997-09-12 09:00:00, 1997-09-14 09:00:00, 1997-09-16 09:00:00, 1997-09-18 09:00:00, 1997-09-20 09:00:00, 1997-09-22 09:00:00, 1997-09-24 09:00:00, 1997-09-26 09:00:00, 1997-09-28 09:00:00, 1997-09-30 09:00:00';
68
    $result = implode(', ', $dates);
69
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
70

    
71
    //Every 10 days, 2 occurrences:
72
    $start = "1997-09-02 09:00:00";
73
    $end = "1997-09-30 09:00:00";
74
    $rule = "RRULE:FREQ=DAILY;INTERVAL=10;COUNT=2";
75
    $dates = date_repeat_calc($rule, $start, $end, array());
76
    //  should be (1997 9:00 AM EDT)September 2,12
77
    $shouldbe = '1997-09-02 09:00:00, 1997-09-12 09:00:00';
78
    $result = implode(', ', $dates);
79
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
80

    
81
    //Weekly for 3 occurrences
82
    $start = "1997-09-02 09:00:00";
83
    $end = "1997-09-30 09:00:00";
84
    $rule = "RRULE:FREQ=WEEKLY;COUNT=3";
85
    $dates = date_repeat_calc($rule, $start, $end, array());
86
    //  should be (1997 9:00 AM EDT)September 2,9,16
87
    $shouldbe = '1997-09-02 09:00:00, 1997-09-09 09:00:00, 1997-09-16 09:00:00';
88
    $result = implode(', ', $dates);
89
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
90

    
91
    //Weekly until September 24, 1997
92
    $start = "1997-09-02 09:00:00";
93
    $end = "1997-09-30 09:00:00";
94
    $rule = "RRULE:FREQ=WEEKLY;UNTIL=19970924T000000Z";
95
    //  ==> (1997 9:00 AM EDT)September 2,9,16,23
96
    $dates = date_repeat_calc($rule, $start, $end, array());
97
    $shouldbe = '1997-09-02 09:00:00, 1997-09-09 09:00:00, 1997-09-16 09:00:00, 1997-09-23 09:00:00';
98
    $result = implode(', ', $dates);
99
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
100

    
101
    //Every other week - forever:
102
    $start = "1997-09-02 09:00:00";
103
    $end = "1997-09-30 09:00:00";
104
    $rule = "RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU";
105
    //  should be (1997 9:00 AM EDT)September 2,16,30
106
    $dates = date_repeat_calc($rule, $start, $end, array());
107
    $shouldbe = '1997-09-02 09:00:00, 1997-09-16 09:00:00, 1997-09-30 09:00:00';
108
    $result = implode(', ', $dates);
109
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
110

    
111
    //Weekly on Tuesday and Thursday for 4 weeks:
112
    $start = "1997-09-02 09:00:00";
113
    $end = "1997-09-30 09:00:00";
114
    $rule = "RRULE:FREQ=WEEKLY;COUNT=8;WKST=SU;BYDAY=TU,TH";
115
    // should be(1997 9:00 AM EDT)September 2,4,9,11,16,18,23,25
116
    $dates = date_repeat_calc($rule, $start, $end, array());
117
    $shouldbe = '1997-09-02 09:00:00, 1997-09-04 09:00:00, 1997-09-09 09:00:00, 1997-09-11 09:00:00, 1997-09-16 09:00:00, 1997-09-18 09:00:00, 1997-09-23 09:00:00, 1997-09-25 09:00:00';
118
    $result = implode(', ', $dates);
119
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
120

    
121
    //Every other week on Tuesday and Thursday, for 5 occurrences:
122
    $start = "1997-09-02 09:00:00";
123
    $end = "1997-09-30 09:00:00";
124
    $rule = "RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=5;WKST=SU;BYDAY=TU,TH";
125
    //  should be  (1997 9:00 AM EDT)September 2,4,16,18,30
126
    $dates = date_repeat_calc($rule, $start, $end, array());
127
    $shouldbe = '1997-09-02 09:00:00, 1997-09-04 09:00:00, 1997-09-16 09:00:00, 1997-09-18 09:00:00, 1997-09-30 09:00:00';
128
    $result = implode(', ', $dates);
129
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
130

    
131
    //Every other week on Monday, Wednesday and Friday until September 24, 1997,
132
    $start = "1997-09-02 09:00:00";
133
    $end = "1997-09-30 09:00:00";
134
    $rule = "RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19970924T000000Z;WKST=SU;BYDAY=MO,WE,FR";
135
    // should be (1997 9:00 AM EDT)September 2,3,5,15,17,19
136
    $dates = date_repeat_calc($rule, $start, $end, array());
137
    $shouldbe = '1997-09-02 09:00:00, 1997-09-03 09:00:00, 1997-09-05 09:00:00, 1997-09-15 09:00:00, 1997-09-17 09:00:00, 1997-09-19 09:00:00';
138
    $result = implode(', ', $dates);
139
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
140

    
141
    //Monthly on the 1st Friday for 2 occurrences:
142
    $start = "1997-09-05 09:00:00";
143
    $end = "1997-10-31 09:00:00";
144
    $rule = "RRULE:FREQ=MONTHLY;COUNT=2;BYDAY=1FR";
145
    //  should be (1997 9:00 AM EDT)September 5;October 3
146
    $dates = date_repeat_calc($rule, $start, $end, array());
147
    $shouldbe = '1997-09-05 09:00:00, 1997-10-03 09:00:00';
148
    $result = implode(', ', $dates);
149
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
150

    
151
    //Monthly on the 1st Friday until December 24, 1997:
152
    $start = "1997-09-05 09:00:00";
153
    $end = "1998-10-01 09:00:00";
154
    $rule = "RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR";
155
    $dates = date_repeat_calc($rule, $start, $end, array());
156
    $shouldbe = '1997-09-05 09:00:00, 1997-10-03 09:00:00, 1997-11-07 09:00:00, 1997-12-05 09:00:00';
157
    $result = implode(', ', $dates);
158
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
159

    
160
    //Every other month on the 1st and last Sunday of the month for 10 occurrences:
161
    $start = "1997-09-07 09:00:00";
162
    $end = "1998-10-01 09:00:00";
163
    $rule = "RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU";
164
    //  ==> (1997 9:00 AM EDT)September 7,28
165
    //      (1997 9:00 AM EST)November 2,30
166
    //      (1998 9:00 AM EST)January 4,25;March 1,29
167
    //      (1998 9:00 AM EDT)May 3,31
168
    $dates = date_repeat_calc($rule, $start, $end, array());
169
    $shouldbe = '1997-09-07 09:00:00, 1997-09-28 09:00:00, 1997-11-02 09:00:00, 1997-11-30 09:00:00, 1998-01-04 09:00:00, 1998-01-25 09:00:00, 1998-03-01 09:00:00, 1998-03-29 09:00:00, 1998-05-03 09:00:00, 1998-05-31 09:00:00';
170
    $result = implode(', ', $dates);
171
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
172

    
173
    //Monthly on the second to last Monday of the month for 6 months:
174
    $start = "1997-09-22 09:00:00";
175
    $end = "1998-10-01 09:00:00";
176
    $rule = "RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO";
177
    //==> (1997 9:00 AM EDT)September 22;October 20
178
    //  (1997 9:00 AM EST)November 17;December 22
179
    //  (1998 9:00 AM EST)January 19;February 16
180
    $dates = date_repeat_calc($rule, $start, $end, array());
181
    $shouldbe = '1997-09-22 09:00:00, 1997-10-20 09:00:00, 1997-11-17 09:00:00, 1997-12-22 09:00:00, 1998-01-19 09:00:00, 1998-02-16 09:00:00';
182
    $result = implode(', ', $dates);
183
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
184

    
185
    //Every Tuesday, every other month:
186
    $start = "1997-09-02 09:00:00";
187
    $end = "1998-02-01 09:00:00";
188
    $rule = "RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU";
189
    //  ==> (1997 9:00 AM EDT)September 2,9,16,23,30
190
    //      (1997 9:00 AM EST)November 4,11,18,25
191
    //      (1998 9:00 AM EST)January 6,13,20,27;March 3,10,17,24,31
192
    $dates = date_repeat_calc($rule, $start, $end, array());
193
    $shouldbe = '1997-09-02 09:00:00, 1997-09-09 09:00:00, 1997-09-16 09:00:00, 1997-09-23 09:00:00, 1997-09-30 09:00:00, 1997-11-04 09:00:00, 1997-11-11 09:00:00, 1997-11-18 09:00:00, 1997-11-25 09:00:00, 1998-01-06 09:00:00, 1998-01-13 09:00:00, 1998-01-20 09:00:00, 1998-01-27 09:00:00';
194
    $result = implode(', ', $dates);
195
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
196

    
197
    //Yearly in June and July for 10 occurrences:
198
    $start = "1997-06-10 09:00:00";
199
    $end = "2002-01-01 09:00:00";
200
    $rule = "RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7";
201
    //  ==> (1997 9:00 AM EDT)June 10;July 10
202
    //      (1998 9:00 AM EDT)June 10;July 10
203
    //      (1999 9:00 AM EDT)June 10;July 10
204
    //      (2000 9:00 AM EDT)June 10;July 10
205
    //      (2001 9:00 AM EDT)June 10;July 10
206
    //  Note: Since none of the BYDAY, BYMONTHDAY or BYYEARDAY components
207
    //  are specified, the day is gotten from DTSTART
208
    $dates = date_repeat_calc($rule, $start, $end, array());
209
    $shouldbe = '1997-06-10 09:00:00, 1997-07-10 09:00:00, 1998-06-10 09:00:00, 1998-07-10 09:00:00, 1999-06-10 09:00:00, 1999-07-10 09:00:00, 2000-06-10 09:00:00, 2000-07-10 09:00:00, 2001-06-10 09:00:00, 2001-07-10 09:00:00';
210
    $result = implode(', ', $dates);
211
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
212

    
213
    //Every other year on January, February, and March for 10 occurrences:
214
    $start = "1997-03-10 09:00:00";
215
    $end = "2004-01-01 09:00:00";
216
    $rule = "RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3";
217
    //  ==> (1997 9:00 AM EST)March 10
218
    //      (1999 9:00 AM EST)January 10;February 10;March 10
219
    //      (2001 9:00 AM EST)January 10;February 10;March 10
220
    //      (2003 9:00 AM EST)January 10;February 10;March 10
221
    $dates = date_repeat_calc($rule, $start, $end, array());
222
    $shouldbe = '1997-03-10 09:00:00, 1999-01-10 09:00:00, 1999-02-10 09:00:00, 1999-03-10 09:00:00, 2001-01-10 09:00:00, 2001-02-10 09:00:00, 2001-03-10 09:00:00, 2003-01-10 09:00:00, 2003-02-10 09:00:00, 2003-03-10 09:00:00';
223
    $result = implode(', ', $dates);
224
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
225

    
226
    //An example where the days generated makes a difference because of WKST:
227
    $start = "1997-08-05 09:00:00";
228
    $end = "2004-01-01 09:00:00";
229
    $rule = "RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO";
230
    //  ==> (1997 EDT)Aug 5,10,19,24
231
    $dates = date_repeat_calc($rule, $start, $end, array());
232
    $shouldbe = '1997-08-05 09:00:00, 1997-08-10 09:00:00, 1997-08-19 09:00:00, 1997-08-24 09:00:00';
233
    $result = implode(', ', $dates);
234
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
235

    
236
    //changing only WKST from MO to SU, yields different results...
237
    $start = "1997-08-05 09:00:00";
238
    $end = "2004-01-01 09:00:00";
239
    $rule = "RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU";
240
    // Result: 1997 EDT August 5,17,19,31;
241
    $dates = date_repeat_calc($rule, $start, $end, array());
242
    $shouldbe = '1997-08-05 09:00:00, 1997-08-17 09:00:00, 1997-08-19 09:00:00, 1997-08-31 09:00:00';
243
    $result = implode(', ', $dates);
244
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
245

    
246
    //Every 18 months on the 10th thru 15th of the month for 10 occurrences:
247
    $start = "1997-09-10 09:00:00";
248
    $end = "2004-01-01 09:00:00";
249
    $rule = "RRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15";
250
    //  ==> (1997 9:00 AM EDT)September 10,11,12,13,14,15
251
    //      (1999 9:00 AM EST)March 10,11,12,13
252
    $dates = date_repeat_calc($rule, $start, $end, array());
253
    $shouldbe = '1997-09-10 09:00:00, 1997-09-11 09:00:00, 1997-09-12 09:00:00, 1997-09-13 09:00:00, 1997-09-14 09:00:00, 1997-09-15 09:00:00, 1999-03-10 09:00:00, 1999-03-11 09:00:00, 1999-03-12 09:00:00, 1999-03-13 09:00:00';
254
    $result = implode(', ', $dates);
255
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
256

    
257
    //Monthly on the third to the last day of the month, forever:
258
    $start = "1997-09-28 09:00:00";
259
    $end = "1998-03-01 09:00:00";
260
    $rule = "RRULE:FREQ=MONTHLY;BYMONTHDAY=-3";
261
    //  ==> (1997 9:00 AM EDT)September 28
262
    //      (1997 9:00 AM EST)October 29;November 28;December 29
263
    //      (1998 9:00 AM EST)January 29;February 26
264
    $dates = date_repeat_calc($rule, $start, $end, array());
265
    $shouldbe = '1997-09-28 09:00:00, 1997-10-29 09:00:00, 1997-11-28 09:00:00, 1997-12-29 09:00:00, 1998-01-29 09:00:00, 1998-02-26 09:00:00';
266
    $result = implode(', ', $dates);
267
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
268

    
269
    //Every Thursday in March, forever:
270
    //  ==> (1997 9:00 AM EST)March 13,20,27
271
    //      (1998 9:00 AM EST)March 5,12,19,26
272
    //      (1999 9:00 AM EST)March 4,11,18,25
273
    $start = "1997-03-13 09:00:00";
274
    $end = "1999-03-31 09:00:00";
275
    $rule = "RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH";
276
    $dates = date_repeat_calc($rule, $start, $end, array());
277
    $shouldbe = '1997-03-13 09:00:00, 1997-03-20 09:00:00, 1997-03-27 09:00:00, 1998-03-05 09:00:00, 1998-03-12 09:00:00, 1998-03-19 09:00:00, 1998-03-26 09:00:00, 1999-03-04 09:00:00, 1999-03-11 09:00:00, 1999-03-18 09:00:00, 1999-03-25 09:00:00';
278
    $result = implode(', ', $dates);
279
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
280

    
281
    //Every Thursday, but only during June, July, and August, forever:
282
    //  ==> (1997 9:00 AM EDT)June 5,12,19,26;July 3,10,17,24,31;August 7,14,21,28
283
    //      (1998 9:00 AM EDT)June 4,11,18,25;July 2,9,16,23,30;August 6,13,20,27
284
    //      (1999 9:00 AM EDT)June 3,10,17,24;July 1,8,15,22,29;August 5,12,19,26
285
    $start = "1997-06-05 09:00:00";
286
    $end = "1999-08-31 09:00:00";
287
    $rule = "RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8";
288
    $dates = date_repeat_calc($rule, $start, $end, array());
289
    $shouldbe = '1997-06-05 09:00:00, 1997-06-12 09:00:00, 1997-06-19 09:00:00, 1997-06-26 09:00:00, 1997-07-03 09:00:00, 1997-07-10 09:00:00, 1997-07-17 09:00:00, 1997-07-24 09:00:00, 1997-07-31 09:00:00, 1997-08-07 09:00:00, 1997-08-14 09:00:00, 1997-08-21 09:00:00, 1997-08-28 09:00:00, 1998-06-04 09:00:00, 1998-06-11 09:00:00, 1998-06-18 09:00:00, 1998-06-25 09:00:00, 1998-07-02 09:00:00, 1998-07-09 09:00:00, 1998-07-16 09:00:00, 1998-07-23 09:00:00, 1998-07-30 09:00:00, 1998-08-06 09:00:00, 1998-08-13 09:00:00, 1998-08-20 09:00:00, 1998-08-27 09:00:00, 1999-06-03 09:00:00, 1999-06-10 09:00:00, 1999-06-17 09:00:00, 1999-06-24 09:00:00, 1999-07-01 09:00:00, 1999-07-08 09:00:00, 1999-07-15 09:00:00, 1999-07-22 09:00:00, 1999-07-29 09:00:00, 1999-08-05 09:00:00, 1999-08-12 09:00:00, 1999-08-19 09:00:00, 1999-08-26 09:00:00';
290
    $result = implode(', ', $dates);
291
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
292

    
293
    //Monthly on the 2nd and 15th of the month for 10 occurrences:
294
    //  ==> (1997 9:00 AM EDT)September 2,15;October 2,15
295
    //      (1997 9:00 AM EST)November 2,15;December 2,15
296
    //      (1998 9:00 AM EST)January 2,15
297
    $start = "1997-09-02 09:00:00";
298
    $end = "1998-01-31 09:00:00";
299
    $rule = "RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15";
300
    $dates = date_repeat_calc($rule, $start, $end, array());
301
    $shouldbe = '1997-09-02 09:00:00, 1997-09-15 09:00:00, 1997-10-02 09:00:00, 1997-10-15 09:00:00, 1997-11-02 09:00:00, 1997-11-15 09:00:00, 1997-12-02 09:00:00, 1997-12-15 09:00:00, 1998-01-02 09:00:00, 1998-01-15 09:00:00';
302
    $result = implode(', ', $dates);
303
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
304

    
305
    //Monthly on the first and last day of the month for 10 occurrences:
306
    //  ==> (1997 9:00 AM EDT)September 30;October 1
307
    //      (1997 9:00 AM EST)October 31;November 1,30;December 1,31
308
    //      (1998 9:00 AM EST)January 1,31;February 1
309
    $start = "1997-09-30 09:00:00";
310
    $end = "1998-03-31 09:00:00";
311
    $rule = "RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1";
312
    $dates = date_repeat_calc($rule, $start, $end, array());
313
    $shouldbe = '1997-09-30 09:00:00, 1997-10-01 09:00:00, 1997-10-31 09:00:00, 1997-11-01 09:00:00, 1997-11-30 09:00:00, 1997-12-01 09:00:00, 1997-12-31 09:00:00, 1998-01-01 09:00:00, 1998-01-31 09:00:00, 1998-02-01 09:00:00';
314
    $result = implode(', ', $dates);
315
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
316

    
317
    //Every Friday the 13th, forever:
318
    $rule = "EXDATE;TZID=US-Eastern:19970902T090000";
319
    //  ==> (1998 9:00 AM EST)February 13;March 13;November 13
320
    //      (1999 9:00 AM EDT)August 13
321
    //      (2000 9:00 AM EDT)October 13
322
    $start = "1997-09-02 09:00:00";
323
    $end = "2000-12-31 09:00:00";
324
    $rule = "RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13";
325
    $dates = date_repeat_calc($rule, $start, $end, array());
326
    $shouldbe = '1997-09-02 09:00:00, 1998-02-13 09:00:00, 1998-03-13 09:00:00, 1998-11-13 09:00:00, 1999-08-13 09:00:00, 2000-10-13 09:00:00';
327
    $result = implode(', ', $dates);
328
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
329

    
330
    //The first Saturday that follows the first Sunday of the month, forever:
331
    //  ==> (1997 9:00 AM EDT)September 13;October 11
332
    //      (1997 9:00 AM EST)November 8;December 13
333
    //      (1998 9:00 AM EST)January 10;February 7;March 7
334
    //      (1998 9:00 AM EDT)April 11;May 9;June 13...
335
    $start = "1997-09-13 09:00:00";
336
    $end = "1998-06-30 09:00:00";
337
    $rule = "RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13";
338
    $dates = date_repeat_calc($rule, $start, $end, array());
339
    $shouldbe = '1997-09-13 09:00:00, 1997-10-11 09:00:00, 1997-11-08 09:00:00, 1997-12-13 09:00:00, 1998-01-10 09:00:00, 1998-02-07 09:00:00, 1998-03-07 09:00:00, 1998-04-11 09:00:00, 1998-05-09 09:00:00, 1998-06-13 09:00:00';
340
    $result = implode(', ', $dates);
341
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
342

    
343
    //Every four years, the first Tuesday after a Monday in November,
344
    //forever (U.S. Presidential Election day):
345
    //  ==> (1996 9:00 AM EST)November 5
346
    //      (2000 9:00 AM EST)November 7
347
    //      (2004 9:00 AM EST)November 2
348
    $start = "1996-11-05 09:00:00";
349
    $end = "2004-11-30 09:00:00";
350
    $rule = "RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8";
351
    $shouldbe = '1996-11-05 09:00:00, 2000-11-07 09:00:00, 2004-11-02 09:00:00';
352
    $dates = date_repeat_calc($rule, $start, $end, array());
353
    $result = implode(', ', $dates);
354
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
355

    
356
    //Every 20th Monday of the year, forever:
357
    $start = "1997-05-19 09:00:00";
358
    $end = "2000-01-01 09:00:00";
359
    $rule = "RRULE:FREQ=YEARLY;BYDAY=20MO";
360
    //  ==> (1997 9:00 AM EDT)May 19
361
    //      (1998 9:00 AM EDT)May 18
362
    //      (1999 9:00 AM EDT)May 17
363
    $dates = date_repeat_calc($rule, $start, $end, array());
364
    $shouldbe = '1997-05-19 09:00:00, 1998-05-18 09:00:00, 1999-05-17 09:00:00';
365
    $result = implode(', ', $dates);
366
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
367

    
368
    //Every Sunday in January, every other year, forever:
369
    $start = "1997-01-05 09:00:00";
370
    $end = "2001-02-01 09:00:00";
371
    $rule = 'RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU';
372
    //  ==> (1997 9:00 AM EDT)January 5,12,19,26
373
    //      (1999 9:00 AM EDT)January 3,10,17,24,31
374
    //      (2001 9:00 AM EDT)January 7,14,21,28
375
    $dates = date_repeat_calc($rule, $start, $end, array());
376
    $shouldbe = '1997-01-05 09:00:00, 1997-01-12 09:00:00, 1997-01-19 09:00:00, 1997-01-26 09:00:00, 1999-01-03 09:00:00, 1999-01-10 09:00:00, 1999-01-17 09:00:00, 1999-01-24 09:00:00, 1999-01-31 09:00:00, 2001-01-07 09:00:00, 2001-01-14 09:00:00, 2001-01-21 09:00:00, 2001-01-28 09:00:00';
377
    $result = implode(', ', $dates);
378
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
379

    
380
    //Every Last Thursday in November, every year, five times:
381
    $start = "2014-11-27 00:00:00";
382
    $rule = 'FREQ=YEARLY;INTERVAL=1;BYDAY=-1TH;BYMONTH=11;COUNT=5;WKST=SU';
383
    //  ==> (2014 00:00 AM EDT)November 27
384
    //      (2015 00:00 AM EDT)November 26
385
    //      (2016 00:00 AM EDT)November 24
386
    //      (2017 00:00 AM EDT)November 30
387
    //      (2018 00:00 AM EDT)November 29
388
    $dates = date_repeat_calc($rule, $start, NULL, array());
389
    $shouldbe = '2014-11-27 00:00:00, 2015-11-26 00:00:00, 2016-11-24 00:00:00, 2017-11-30 00:00:00, 2018-11-29 00:00:00';
390
    $result = implode(', ', $dates);
391
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
392

    
393
return;
394

    
395
    //Every Thanksgiving, forever:
396
    $start = "1997-01-01 09:00:00";
397
    $end = "2001-02-01 09:00:00";
398
    $rule = 'RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYDAY=4TH';
399
    //  ==> (1997 9:00 AM EDT)Nov
400
    //      (1999 9:00 AM EDT)Nov
401
    //      (2001 9:00 AM EDT)Nov
402
    $dates = date_repeat_calc($rule, $start, $end, array());
403
    $shouldbe = '';
404
    $result = implode(', ', $dates);
405
    $this->assertEqual($result, $shouldbe, $rule . '; Starting ' . $start . ';  results: ' . $result);
406

    
407
// TODO:
408
// BYYEARDAY, BYSETPOS,
409
// BYHOUR, BYMINUTE, HOURLY, MINUTELY, SECONDLY
410
// have not yet been implemented in date_repeat.
411

    
412
//Every 3rd year on the 1st, 100th and 200th day for 10 occurrences:
413
$date = "DTSTART;TZID=US-Eastern:19970101T090000";
414
$rule = "RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200";
415
//  ==> (1997 9:00 AM EST)January 1
416
//      (1997 9:00 AM EDT)April 10;July 19
417
//      (2000 9:00 AM EST)January 1
418
//      (2000 9:00 AM EDT)April 9;July 18
419
//      (2003 9:00 AM EST)January 1
420
//      (2003 9:00 AM EDT)April 10;July 19
421
//      (2006 9:00 AM EST)January 1
422

    
423
//Monday of week number 20 (where the default start of the week is Monday), forever:
424
$date = "DTSTART;TZID=US-Eastern:19970512T090000";
425
$rule = "RRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO";
426
//  ==> (1997 9:00 AM EDT)May 12
427
//      (1998 9:00 AM EDT)May 11
428
//      (1999 9:00 AM EDT)May 17
429

    
430
//The 3rd instance into the month of one of Tuesday, Wednesday or
431
//Thursday, for the next 3 months:
432
$date = "DTSTART;TZID=US-Eastern:19970904T090000";
433
$rule = "RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3";
434
//  ==> (1997 9:00 AM EDT)September 4;October 7
435
//      (1997 9:00 AM EST)November 6
436

    
437
//The 2nd to last weekday of the month:
438
$date = "DTSTART;TZID=US-Eastern:19970929T090000";
439
$rule = "RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2";
440
//  ==> (1997 9:00 AM EDT)September 29
441
//      (1997 9:00 AM EST)October 30;November 27;December 30
442
//      (1998 9:00 AM EST)January 29;February 26;March 30
443

    
444
//Every 3 hours from 9:00 AM to 5:00 PM on a specific day:
445
$date = "DTSTART;TZID=US-Eastern:19970902T090000";
446
$rule = "RRULE:FREQ=HOURLY;INTERVAL=3;UNTIL=19970902T170000Z";
447
//  ==> (September 2, 1997 EDT)09:00,12:00,15:00
448

    
449
//Every 15 minutes for 6 occurrences:
450
$date = "DTSTART;TZID=US-Eastern:19970902T090000";
451
$rule = "RRULE:FREQ=MINUTELY;INTERVAL=15;COUNT=6";
452
//  ==> (September 2, 1997 EDT)09:00,09:15,09:30,09:45,10:00,10:15
453

    
454
//Every hour and a half for 4 occurrences:
455
$date = "DTSTART;TZID=US-Eastern:19970902T090000";
456
$rule = "RRULE:FREQ=MINUTELY;INTERVAL=90;COUNT=4";
457
//  ==> (September 2, 1997 EDT)09:00,10:30;12:00;13:30
458

    
459
//Every 20 minutes from 9:00 AM to 4:40 PM every day:
460
$date = "DTSTART;TZID=US-Eastern:19970902T090000";
461
$rule = "RRULE:FREQ=DAILY;BYHOUR=9,10,11,12,13,14,15,16;BYMINUTE=0,20,40";
462
//  or
463
$rule = "RRULE:FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16";
464
//  ==> (September 2, 1997 EDT)9:00,9:20,9:40,10:00,10:20,16:00,16:20,16:40
465
//      (September 3, 1997 EDT)9:00,9:20,9:40,10:00,10:20,16:00,16:20,16:40
466

    
467
  }
468
}