[ Index ]

PHP Cross Reference of Drupal 6 (yi-drupal)

title

Body

[close]

/sites/all/modules/date/tests/ -> date_repeat.test (source)

   1  <?php
   2  /**
   3   * Test PHP 4 Timezone Conversion
   4   */
   5  class DateRepeatTestCase extends DrupalWebTestCase {
   6    function getInfo() {
   7      return array(
   8        'name' => t('Date repeat calculations'),
   9        'description' => t('Test Date Repeat processes to create arrays of dates from iCal rules.') ,
  10        'group' => t('Date'),
  11      );
  12    }
  13  
  14    /**
  15     * Implementation of setUp().
  16     */
  17    function setUp() {
  18      // Load the date_repeat module.
  19      parent::setUp('date_repeat');
  20    }
  21  
  22    public function testDateRepeat() {
  23      require_once('./'. drupal_get_path('module', 'date_api') .'/date_api_ical.inc');
  24      require_once('./'. drupal_get_path('module', 'date_repeat') .'/date_repeat_calc.inc');
  25      // Examples adapted from http://www.faqs.org/rfcs/rfc2445.html and
  26      // http://www.kanzaki.com/docs/ical/rrule.html.
  27  
  28      //  Daily for 10 occurrences:
  29      $start = "1997-09-02 09:00:00";
  30      $end = "1997-09-30 09:00:00";
  31      $rule = "RRULE:FREQ=DAILY;COUNT=10";
  32      $dates = date_repeat_calc($rule, $start, $end, array());
  33      //  should be (1997 9:00 AM EDT)September 2-11
  34      $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';
  35      $result = implode(', ', $dates);
  36      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
  37  
  38      //Daily until September 24, 1997:
  39      $start = "1997-09-02 09:00:00";
  40      $end = "1997-09-30 09:00:00";
  41      $rule = "RRULE:FREQ=DAILY;UNTIL=19970924T000000Z";
  42      $dates = date_repeat_calc($rule, $start, $end, array());
  43      //  should be (1997 9:00 AM EDT)September 2-23
  44      $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';
  45      $result = implode(', ', $dates);
  46      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
  47  
  48      //Every other day - until September 30:
  49      $start = "1997-09-02 09:00:00";
  50      $end = "1997-09-30 09:00:00";
  51      $rule = "RRULE:FREQ=DAILY;INTERVAL=2";
  52      $dates = date_repeat_calc($rule, $start, $end, array());
  53      // should be (1997 9:00 AM EDT)September2,4,6,8...24,26,28,30;
  54      $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';
  55      $result = implode(', ', $dates);
  56      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
  57  
  58      //Every 10 days, 2 occurrences:
  59      $start = "1997-09-02 09:00:00";
  60      $end = "1997-09-30 09:00:00";
  61      $rule = "RRULE:FREQ=DAILY;INTERVAL=10;COUNT=2";
  62      $dates = date_repeat_calc($rule, $start, $end, array());
  63      //  should be (1997 9:00 AM EDT)September 2,12
  64      $shouldbe = '1997-09-02 09:00:00, 1997-09-12 09:00:00';
  65      $result = implode(', ', $dates);
  66      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
  67  
  68      //Weekly for 3 occurrences
  69      $start = "1997-09-02 09:00:00";
  70      $end = "1997-09-30 09:00:00";
  71      $rule = "RRULE:FREQ=WEEKLY;COUNT=3";
  72      $dates = date_repeat_calc($rule, $start, $end, array());
  73      //  should be (1997 9:00 AM EDT)September 2,9,16
  74      $shouldbe = '1997-09-02 09:00:00, 1997-09-09 09:00:00, 1997-09-16 09:00:00';
  75      $result = implode(', ', $dates);
  76      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
  77  
  78      //Weekly until September 24, 1997
  79      $start = "1997-09-02 09:00:00";
  80      $end = "1997-09-30 09:00:00";
  81      $rule = "RRULE:FREQ=WEEKLY;UNTIL=19970924T000000Z";
  82      //  ==> (1997 9:00 AM EDT)September 2,9,16,23
  83      $dates = date_repeat_calc($rule, $start, $end, array());
  84      $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';
  85      $result = implode(', ', $dates);
  86      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
  87  
  88      //Every other week - forever:
  89      $start = "1997-09-02 09:00:00";
  90      $end = "1997-09-30 09:00:00";
  91      $rule = "RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU";
  92      //  should be (1997 9:00 AM EDT)September 2,16,30
  93      $dates = date_repeat_calc($rule, $start, $end, array());
  94      $shouldbe = '1997-09-02 09:00:00, 1997-09-16 09:00:00, 1997-09-30 09:00:00';
  95      $result = implode(', ', $dates);
  96      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
  97  
  98      //Weekly on Tuesday and Thursday for 4 weeks:
  99      $start = "1997-09-02 09:00:00";
 100      $end = "1997-09-30 09:00:00";
 101      $rule = "RRULE:FREQ=WEEKLY;COUNT=8;WKST=SU;BYDAY=TU,TH";
 102      // should be(1997 9:00 AM EDT)September 2,4,9,11,16,18,23,25
 103      $dates = date_repeat_calc($rule, $start, $end, array());
 104      $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';
 105      $result = implode(', ', $dates);
 106      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 107  
 108      //Every other week on Tuesday and Thursday, for 5 occurrences:
 109      $start = "1997-09-02 09:00:00";
 110      $end = "1997-09-30 09:00:00";
 111      $rule = "RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=5;WKST=SU;BYDAY=TU,TH";
 112      //  should be  (1997 9:00 AM EDT)September 2,4,16,18,30
 113      $dates = date_repeat_calc($rule, $start, $end, array());
 114      $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';
 115      $result = implode(', ', $dates);
 116      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 117  
 118      //Every other week on Monday, Wednesday and Friday until September 24, 1997,
 119      $start = "1997-09-02 09:00:00";
 120      $end = "1997-09-30 09:00:00";
 121      $rule = "RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19970924T000000Z;WKST=SU;BYDAY=MO,WE,FR";
 122      // should be (1997 9:00 AM EDT)September 2,3,5,15,17,19
 123      $dates = date_repeat_calc($rule, $start, $end, array());
 124      $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';
 125      $result = implode(', ', $dates);
 126      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 127  
 128      //Monthly on the 1st Friday for 2 occurrences:
 129      $start = "1997-09-05 09:00:00";
 130      $end = "1997-10-31 09:00:00";
 131      $rule = "RRULE:FREQ=MONTHLY;COUNT=2;BYDAY=1FR";
 132      //  should be (1997 9:00 AM EDT)September 5;October 3
 133      $dates = date_repeat_calc($rule, $start, $end, array());
 134      $shouldbe = '1997-09-05 09:00:00, 1997-10-03 09:00:00';
 135      $result = implode(', ', $dates);
 136      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 137  
 138      //Monthly on the 1st Friday until December 24, 1997:
 139      $start = "1997-09-05 09:00:00";
 140      $end = "1998-10-01 09:00:00";
 141      $rule = "RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR";
 142      $dates = date_repeat_calc($rule, $start, $end, array());
 143      $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';
 144      $result = implode(', ', $dates);
 145      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 146  
 147      //Every other month on the 1st and last Sunday of the month for 10 occurrences:
 148      $start = "1997-09-07 09:00:00";
 149      $end = "1998-10-01 09:00:00";
 150      $rule = "RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU";
 151      //  ==> (1997 9:00 AM EDT)September 7,28
 152      //      (1997 9:00 AM EST)November 2,30
 153      //      (1998 9:00 AM EST)January 4,25;March 1,29
 154      //      (1998 9:00 AM EDT)May 3,31
 155      $dates = date_repeat_calc($rule, $start, $end, array());
 156      $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';
 157      $result = implode(', ', $dates);
 158      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 159  
 160      //Monthly on the second to last Monday of the month for 6 months:
 161      $start = "1997-09-22 09:00:00";
 162      $end = "1998-10-01 09:00:00";
 163      $rule = "RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO";
 164      //==> (1997 9:00 AM EDT)September 22;October 20
 165      //  (1997 9:00 AM EST)November 17;December 22
 166      //  (1998 9:00 AM EST)January 19;February 16
 167      $dates = date_repeat_calc($rule, $start, $end, array());
 168      $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';
 169      $result = implode(', ', $dates);
 170      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 171  
 172      //Every Tuesday, every other month:
 173      $start = "1997-09-02 09:00:00";
 174      $end = "1998-02-01 09:00:00";
 175      $rule = "RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU";
 176      //  ==> (1997 9:00 AM EDT)September 2,9,16,23,30
 177      //      (1997 9:00 AM EST)November 4,11,18,25
 178      //      (1998 9:00 AM EST)January 6,13,20,27;March 3,10,17,24,31
 179      $dates = date_repeat_calc($rule, $start, $end, array());
 180      $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';
 181      $result = implode(', ', $dates);
 182      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 183  
 184      //Yearly in June and July for 10 occurrences:
 185      $start = "1997-06-10 09:00:00";
 186      $end = "2002-01-01 09:00:00";
 187      $rule = "RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7";
 188      //  ==> (1997 9:00 AM EDT)June 10;July 10
 189      //      (1998 9:00 AM EDT)June 10;July 10
 190      //      (1999 9:00 AM EDT)June 10;July 10
 191      //      (2000 9:00 AM EDT)June 10;July 10
 192      //      (2001 9:00 AM EDT)June 10;July 10
 193      //  Note: Since none of the BYDAY, BYMONTHDAY or BYYEARDAY components
 194      //  are specified, the day is gotten from DTSTART
 195      $dates = date_repeat_calc($rule, $start, $end, array());
 196      $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';
 197      $result = implode(', ', $dates);
 198      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 199  
 200      //Every other year on January, February, and March for 10 occurrences:
 201      $start = "1997-03-10 09:00:00";
 202      $end = "2004-01-01 09:00:00";
 203      $rule = "RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3";
 204      //  ==> (1997 9:00 AM EST)March 10
 205      //      (1999 9:00 AM EST)January 10;February 10;March 10
 206      //      (2001 9:00 AM EST)January 10;February 10;March 10
 207      //      (2003 9:00 AM EST)January 10;February 10;March 10
 208      $dates = date_repeat_calc($rule, $start, $end, array());
 209      $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';
 210      $result = implode(', ', $dates);
 211      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 212  
 213      //An example where the days generated makes a difference because of WKST:
 214      $start = "1997-08-05 09:00:00";
 215      $end = "2004-01-01 09:00:00";
 216      $rule = "RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO";
 217      //  ==> (1997 EDT)Aug 5,10,19,24
 218      $dates = date_repeat_calc($rule, $start, $end, array());
 219      $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';
 220      $result = implode(', ', $dates);
 221      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 222  
 223      //changing only WKST from MO to SU, yields different results...
 224      $start = "1997-08-05 09:00:00";
 225      $end = "2004-01-01 09:00:00";
 226      $rule = "RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU";
 227      // Result: 1997 EDT August 5,17,19,31;
 228      $dates = date_repeat_calc($rule, $start, $end, array());
 229      $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';
 230      $result = implode(', ', $dates);
 231      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 232  
 233      //Every 18 months on the 10th thru 15th of the month for 10 occurrences:
 234      $start = "1997-09-10 09:00:00";
 235      $end = "2004-01-01 09:00:00";
 236      $rule = "RRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,15";
 237      //  ==> (1997 9:00 AM EDT)September 10,11,12,13,14,15
 238      //      (1999 9:00 AM EST)March 10,11,12,13
 239      $dates = date_repeat_calc($rule, $start, $end, array());
 240      $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';
 241      $result = implode(', ', $dates);
 242      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 243  
 244      //Monthly on the third to the last day of the month, forever:
 245      $start = "1997-09-28 09:00:00";
 246      $end = "1998-03-01 09:00:00";
 247      $rule = "RRULE:FREQ=MONTHLY;BYMONTHDAY=-3";
 248      //  ==> (1997 9:00 AM EDT)September 28
 249      //      (1997 9:00 AM EST)October 29;November 28;December 29
 250      //      (1998 9:00 AM EST)January 29;February 26
 251      $dates = date_repeat_calc($rule, $start, $end, array());
 252      $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';
 253      $result = implode(', ', $dates);
 254      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 255  
 256      //Every Thursday in March, forever:
 257      //  ==> (1997 9:00 AM EST)March 13,20,27
 258      //      (1998 9:00 AM EST)March 5,12,19,26
 259      //      (1999 9:00 AM EST)March 4,11,18,25
 260      $start = "1997-03-13 09:00:00";
 261      $end = "1999-03-31 09:00:00";
 262      $rule = "RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH";
 263      $dates = date_repeat_calc($rule, $start, $end, array());
 264      $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';
 265      $result = implode(', ', $dates);
 266      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 267  
 268      //Every Thursday, but only during June, July, and August, forever:
 269      //  ==> (1997 9:00 AM EDT)June 5,12,19,26;July 3,10,17,24,31;August 7,14,21,28
 270      //      (1998 9:00 AM EDT)June 4,11,18,25;July 2,9,16,23,30;August 6,13,20,27
 271      //      (1999 9:00 AM EDT)June 3,10,17,24;July 1,8,15,22,29;August 5,12,19,26
 272      $start = "1997-06-05 09:00:00";
 273      $end = "1999-08-31 09:00:00";
 274      $rule = "RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8";
 275      $dates = date_repeat_calc($rule, $start, $end, array());
 276      $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';
 277      $result = implode(', ', $dates);
 278      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 279  
 280      //Monthly on the 2nd and 15th of the month for 10 occurrences:
 281      //  ==> (1997 9:00 AM EDT)September 2,15;October 2,15
 282      //      (1997 9:00 AM EST)November 2,15;December 2,15
 283      //      (1998 9:00 AM EST)January 2,15
 284      $start = "1997-09-02 09:00:00";
 285      $end = "1998-01-31 09:00:00";
 286      $rule = "RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15";
 287      $dates = date_repeat_calc($rule, $start, $end, array());
 288      $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';
 289      $result = implode(', ', $dates);
 290      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 291  
 292      //Monthly on the first and last day of the month for 10 occurrences:
 293      //  ==> (1997 9:00 AM EDT)September 30;October 1
 294      //      (1997 9:00 AM EST)October 31;November 1,30;December 1,31
 295      //      (1998 9:00 AM EST)January 1,31;February 1
 296      $start = "1997-09-30 09:00:00";
 297      $end = "1998-03-31 09:00:00";
 298      $rule = "RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1";
 299      $dates = date_repeat_calc($rule, $start, $end, array());
 300      $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';
 301      $result = implode(', ', $dates);
 302      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 303  
 304      //Every Friday the 13th, forever:
 305      $rule = "EXDATE;TZID=US-Eastern:19970902T090000";
 306      //  ==> (1998 9:00 AM EST)February 13;March 13;November 13
 307      //      (1999 9:00 AM EDT)August 13
 308      //      (2000 9:00 AM EDT)October 13
 309      $start = "1997-09-02 09:00:00";
 310      $end = "2000-12-31 09:00:00";
 311      $rule = "RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13";
 312      $dates = date_repeat_calc($rule, $start, $end, array());
 313      $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';
 314      $result = implode(', ', $dates);
 315      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 316  
 317      //The first Saturday that follows the first Sunday of the month, forever:
 318      //  ==> (1997 9:00 AM EDT)September 13;October 11
 319      //      (1997 9:00 AM EST)November 8;December 13
 320      //      (1998 9:00 AM EST)January 10;February 7;March 7
 321      //      (1998 9:00 AM EDT)April 11;May 9;June 13...
 322      $start = "1997-09-13 09:00:00";
 323      $end = "1998-06-30 09:00:00";
 324      $rule = "RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13";
 325      $dates = date_repeat_calc($rule, $start, $end, array());
 326      $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';
 327      $result = implode(', ', $dates);
 328      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 329  
 330      //Every four years, the first Tuesday after a Monday in November,
 331      //forever (U.S. Presidential Election day):
 332      //  ==> (1996 9:00 AM EST)November 5
 333      //      (2000 9:00 AM EST)November 7
 334      //      (2004 9:00 AM EST)November 2
 335      $start = "1996-11-05 09:00:00";
 336      $end = "2004-11-30 09:00:00";
 337      $rule = "RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,5,6,7,8";
 338      $shouldbe = '1996-11-05 09:00:00, 2000-11-07 09:00:00, 2004-11-02 09:00:00';
 339      $dates = date_repeat_calc($rule, $start, $end, array());
 340      $result = implode(', ', $dates);
 341      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 342  
 343      //Every 20th Monday of the year, forever:
 344      $start = "1997-05-19 09:00:00";
 345      $end = "2000-01-01 09:00:00";
 346      $rule = "RRULE:FREQ=YEARLY;BYDAY=20MO";
 347      //  ==> (1997 9:00 AM EDT)May 19
 348      //      (1998 9:00 AM EDT)May 18
 349      //      (1999 9:00 AM EDT)May 17
 350      $dates = date_repeat_calc($rule, $start, $end, array());
 351      $shouldbe = '1997-05-19 09:00:00, 1998-05-18 09:00:00, 1999-05-17 09:00:00';
 352      $result = implode(', ', $dates);
 353      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 354  
 355      //Every Sunday in January, every other year, forever:
 356      $start = "1997-01-05 09:00:00";
 357      $end = "2001-02-01 09:00:00";
 358      $rule = 'RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU';
 359      //  ==> (1997 9:00 AM EDT)January 5,12,19,26
 360      //      (1999 9:00 AM EDT)January 3,10,17,24,31
 361      //      (2001 9:00 AM EDT)January 7,14,21,28
 362      $dates = date_repeat_calc($rule, $start, $end, array());
 363      $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';
 364      $result = implode(', ', $dates);
 365      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 366  
 367  return;
 368  
 369      //Every Thanksgiving, forever:
 370      $start = "1997-01-01 09:00:00";
 371      $end = "2001-02-01 09:00:00";
 372      $rule = 'RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=11;BYDAY=4TH';
 373      //  ==> (1997 9:00 AM EDT)Nov
 374      //      (1999 9:00 AM EDT)Nov
 375      //      (2001 9:00 AM EDT)Nov
 376      $dates = date_repeat_calc($rule, $start, $end, array());
 377      $shouldbe = '';
 378      $result = implode(', ', $dates);
 379      $this->assertEqual($result, $shouldbe, $rule .'; Starting '.$start .';  results: '. $result);
 380  
 381  // TODO:
 382  // BYYEARDAY, BYSETPOS,
 383  // BYHOUR, BYMINUTE, HOURLY, MINUTELY, SECONDLY
 384  // have not yet been implemented in date_repeat.
 385  
 386  //Every 3rd year on the 1st, 100th and 200th day for 10 occurrences:
 387  $date = "DTSTART;TZID=US-Eastern:19970101T090000";
 388  $rule = "RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200";
 389  //  ==> (1997 9:00 AM EST)January 1
 390  //      (1997 9:00 AM EDT)April 10;July 19
 391  //      (2000 9:00 AM EST)January 1
 392  //      (2000 9:00 AM EDT)April 9;July 18
 393  //      (2003 9:00 AM EST)January 1
 394  //      (2003 9:00 AM EDT)April 10;July 19
 395  //      (2006 9:00 AM EST)January 1
 396  
 397  //Monday of week number 20 (where the default start of the week is Monday), forever:
 398  $date = "DTSTART;TZID=US-Eastern:19970512T090000";
 399  $rule = "RRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO";
 400  //  ==> (1997 9:00 AM EDT)May 12
 401  //      (1998 9:00 AM EDT)May 11
 402  //      (1999 9:00 AM EDT)May 17
 403  
 404  //The 3rd instance into the month of one of Tuesday, Wednesday or
 405  //Thursday, for the next 3 months:
 406  $date = "DTSTART;TZID=US-Eastern:19970904T090000";
 407  $rule = "RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3";
 408  //  ==> (1997 9:00 AM EDT)September 4;October 7
 409  //      (1997 9:00 AM EST)November 6
 410  
 411  //The 2nd to last weekday of the month:
 412  $date = "DTSTART;TZID=US-Eastern:19970929T090000";
 413  $rule = "RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2";
 414  //  ==> (1997 9:00 AM EDT)September 29
 415  //      (1997 9:00 AM EST)October 30;November 27;December 30
 416  //      (1998 9:00 AM EST)January 29;February 26;March 30
 417  
 418  //Every 3 hours from 9:00 AM to 5:00 PM on a specific day:
 419  $date = "DTSTART;TZID=US-Eastern:19970902T090000";
 420  $rule = "RRULE:FREQ=HOURLY;INTERVAL=3;UNTIL=19970902T170000Z";
 421  //  ==> (September 2, 1997 EDT)09:00,12:00,15:00
 422  
 423  //Every 15 minutes for 6 occurrences:
 424  $date = "DTSTART;TZID=US-Eastern:19970902T090000";
 425  $rule = "RRULE:FREQ=MINUTELY;INTERVAL=15;COUNT=6";
 426  //  ==> (September 2, 1997 EDT)09:00,09:15,09:30,09:45,10:00,10:15
 427  
 428  //Every hour and a half for 4 occurrences:
 429  $date = "DTSTART;TZID=US-Eastern:19970902T090000";
 430  $rule = "RRULE:FREQ=MINUTELY;INTERVAL=90;COUNT=4";
 431  //  ==> (September 2, 1997 EDT)09:00,10:30;12:00;13:30
 432  
 433  //Every 20 minutes from 9:00 AM to 4:40 PM every day:
 434  $date = "DTSTART;TZID=US-Eastern:19970902T090000";
 435  $rule = "RRULE:FREQ=DAILY;BYHOUR=9,10,11,12,13,14,15,16;BYMINUTE=0,20,40";
 436  //  or
 437  $rule = "RRULE:FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16";
 438  //  ==> (September 2, 1997 EDT)9:00,9:20,9:40,10:00,10:20,16:00,16:20,16:40
 439  //      (September 3, 1997 EDT)9:00,9:20,9:40,10:00,10:20,16:00,16:20,16:40
 440  
 441    }
 442  }


Generated: Mon Jul 9 18:01:44 2012 Cross-referenced by PHPXref 0.7