Changeset View
Changeset View
Standalone View
Standalone View
plugins/libkolab/tests/kolab_date_recurrence.php
- This file was added.
<?php | |||||
/** | |||||
* kolab_date_recurrence tests | |||||
* | |||||
* @author Aleksander Machniak <machniak@kolabsys.com> | |||||
* | |||||
* Copyright (C) 2017, Kolab Systems AG <contact@kolabsys.com> | |||||
* | |||||
* This program is free software: you can redistribute it and/or modify | |||||
* it under the terms of the GNU Affero General Public License as | |||||
* published by the Free Software Foundation, either version 3 of the | |||||
* License, or (at your option) any later version. | |||||
* | |||||
* This program is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||||
* GNU Affero General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Affero General Public License | |||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||||
*/ | |||||
class kolab_date_recurrence_test extends PHPUnit_Framework_TestCase | |||||
{ | |||||
function setUp() | |||||
{ | |||||
$rcube = rcmail::get_instance(); | |||||
$rcube->plugins->load_plugin('libkolab', true, true); | |||||
} | |||||
/** | |||||
* kolab_date_recurrence::first_occurrence() | |||||
* | |||||
* @dataProvider data_first_occurrence | |||||
*/ | |||||
function test_first_occurrence($recurrence_data, $start, $expected) | |||||
{ | |||||
$start = new DateTime($start); | |||||
if (!empty($recurrence_data['UNTIL'])) { | |||||
$recurrence_data['UNTIL'] = new DateTime($recurrence_data['UNTIL']); | |||||
} | |||||
$event = array('start' => $start, 'recurrence' => $recurrence_data); | |||||
$object = kolab_format::factory('event', 3.0); | |||||
$object->set($event); | |||||
$recurrence = new kolab_date_recurrence($object); | |||||
$first = $recurrence->first_occurrence(); | |||||
$this->assertEquals($expected, $first ? $first->format('Y-m-d H:i:s') : ''); | |||||
} | |||||
/** | |||||
* Data for test_first_occurrence() | |||||
*/ | |||||
function data_first_occurrence() | |||||
{ | |||||
// TODO: BYYEARDAY, BYWEEKNO, BYSETPOS, WKST | |||||
return array( | |||||
// non-recurring | |||||
array( | |||||
array(), // recurrence data | |||||
'2017-08-31 11:00:00', // start date | |||||
'2017-08-31 11:00:00', // expected result | |||||
), | |||||
// daily | |||||
array( | |||||
array('FREQ' => 'DAILY', 'INTERVAL' => '1'), // recurrence data | |||||
'2017-08-31 11:00:00', // start date | |||||
'2017-08-31 11:00:00', // expected result | |||||
), | |||||
// TODO: this one is not supported by the Calendar UI | |||||
array( | |||||
array('FREQ' => 'DAILY', 'INTERVAL' => '1', 'BYMONTH' => 1), | |||||
'2017-08-31 11:00:00', | |||||
'2018-01-01 11:00:00', | |||||
), | |||||
// weekly | |||||
array( | |||||
array('FREQ' => 'WEEKLY', 'INTERVAL' => '1'), | |||||
'2017-08-31 11:00:00', // Thursday | |||||
'2017-08-31 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'WEEKLY', 'INTERVAL' => '1', 'BYDAY' => 'WE'), | |||||
'2017-08-31 11:00:00', // Thursday | |||||
'2017-09-06 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'WEEKLY', 'INTERVAL' => '1', 'BYDAY' => 'TH'), | |||||
'2017-08-31 11:00:00', // Thursday | |||||
'2017-08-31 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'WEEKLY', 'INTERVAL' => '1', 'BYDAY' => 'FR'), | |||||
'2017-08-31 11:00:00', // Thursday | |||||
'2017-09-01 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'WEEKLY', 'INTERVAL' => '2'), | |||||
'2017-08-31 11:00:00', // Thursday | |||||
'2017-08-31 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'WEEKLY', 'INTERVAL' => '3', 'BYDAY' => 'WE'), | |||||
'2017-08-31 11:00:00', // Thursday | |||||
'2017-09-20 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'WEEKLY', 'INTERVAL' => '1', 'BYDAY' => 'WE', 'COUNT' => 1), | |||||
'2017-08-31 11:00:00', // Thursday | |||||
'2017-09-06 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'WEEKLY', 'INTERVAL' => '1', 'BYDAY' => 'WE', 'UNTIL' => '2017-09-01'), | |||||
'2017-08-31 11:00:00', // Thursday | |||||
'', | |||||
), | |||||
// monthly | |||||
array( | |||||
array('FREQ' => 'MONTHLY', 'INTERVAL' => '1'), | |||||
'2017-09-08 11:00:00', | |||||
'2017-09-08 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'MONTHLY', 'INTERVAL' => '1', 'BYMONTHDAY' => '8,9'), | |||||
'2017-08-31 11:00:00', | |||||
'2017-09-08 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'MONTHLY', 'INTERVAL' => '1', 'BYMONTHDAY' => '8,9'), | |||||
'2017-09-08 11:00:00', | |||||
'2017-09-08 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'MONTHLY', 'INTERVAL' => '1', 'BYDAY' => '1WE'), | |||||
'2017-08-16 11:00:00', | |||||
'2017-09-06 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'MONTHLY', 'INTERVAL' => '1', 'BYDAY' => '-1WE'), | |||||
'2017-08-16 11:00:00', | |||||
'2017-08-30 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'MONTHLY', 'INTERVAL' => '2'), | |||||
'2017-09-08 11:00:00', | |||||
'2017-09-08 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'MONTHLY', 'INTERVAL' => '2', 'BYMONTHDAY' => '8'), | |||||
'2017-08-31 11:00:00', | |||||
'2017-09-08 11:00:00', // ?????? | |||||
), | |||||
// yearly | |||||
array( | |||||
array('FREQ' => 'YEARLY', 'INTERVAL' => '1'), | |||||
'2017-08-16 11:00:00', | |||||
'2017-08-16 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'YEARLY', 'INTERVAL' => '1', 'BYMONTH' => '8'), | |||||
'2017-08-16 11:00:00', | |||||
'2017-08-16 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'YEARLY', 'INTERVAL' => '1', 'BYDAY' => '-1MO'), | |||||
'2017-08-16 11:00:00', | |||||
'2017-12-25 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'YEARLY', 'INTERVAL' => '1', 'BYMONTH' => '8', 'BYDAY' => '-1MO'), | |||||
'2017-08-16 11:00:00', | |||||
'2017-08-28 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'YEARLY', 'INTERVAL' => '1', 'BYMONTH' => '1', 'BYDAY' => '1MO'), | |||||
'2017-08-16 11:00:00', | |||||
'2018-01-01 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'YEARLY', 'INTERVAL' => '1', 'BYMONTH' => '1,9', 'BYDAY' => '1MO'), | |||||
'2017-08-16 11:00:00', | |||||
'2017-09-04 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'YEARLY', 'INTERVAL' => '2'), | |||||
'2017-08-16 11:00:00', | |||||
'2017-08-16 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'YEARLY', 'INTERVAL' => '2', 'BYMONTH' => '8'), | |||||
'2017-08-16 11:00:00', | |||||
'2017-08-16 11:00:00', | |||||
), | |||||
array( | |||||
array('FREQ' => 'YEARLY', 'INTERVAL' => '2', 'BYDAY' => '-1MO'), | |||||
'2017-08-16 11:00:00', | |||||
'2017-12-25 11:00:00', | |||||
), | |||||
// on dates (FIXME: do we really expect the first occurrence to be on the start date?) | |||||
array( | |||||
array('RDATE' => array (new DateTime('2017-08-10 11:00:00 Europe/Warsaw'))), | |||||
'2017-08-01 11:00:00', | |||||
'2017-08-01 11:00:00', | |||||
), | |||||
); | |||||
} | |||||
} | |||||