From 702a17301ab03199072d4b3c520a370dc4f0feff Mon Sep 17 00:00:00 2001 From: k1low Date: Sat, 15 Oct 2011 01:35:27 +0900 Subject: [PATCH] Support Simple RRULE:FREQ and RRULE:INTERVAL --- models/vevent.php | 20 +++-- tests/cases/models/vevent.test.php | 126 +++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 8 deletions(-) diff --git a/models/vevent.php b/models/vevent.php index 7c7cf95..c8e53ce 100644 --- a/models/vevent.php +++ b/models/vevent.php @@ -247,6 +247,7 @@ function _expandEvents($start, $end, $event){ function _expandEventsDaily($start, $end, $event){ $eventStart = $event['Vevent']['dtstart']; $eventEnd = $event['Vevent']['dtend']; + $interval = empty($event['Vevent']['rrule_interval']) ? 1 : $event['Vevent']['rrule_interval']; $expandStartPoint; // 登録するイベント群の開始日時 $expandEndPoint; @@ -261,7 +262,7 @@ function _expandEventsDaily($start, $end, $event){ if (!empty($event['Vevent']['rrule_count'])) { $count = $event['Vevent']['rrule_count']; $s = $this->_expandDate($eventStart); - $endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'] + $count, $s['year']); + $endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'] + ($count * $interval), $s['year']); if (strtotime($end) < $endPoint) { $expandEndPoint = $this->_expandDate($end); } else { @@ -290,7 +291,7 @@ function _expandEventsDaily($start, $end, $event){ $event['Vevent']['event_start'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year'])); $event['Vevent']['event_end'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year']) + $eventDiff); $events[] = $event['Vevent']; - $s['day']++; + $s['day'] += 1 * $interval; } return $events; @@ -305,6 +306,7 @@ function _expandEventsDaily($start, $end, $event){ function _expandEventsWeekly($start, $end, $event){ $eventStart = $event['Vevent']['dtstart']; $eventEnd = $event['Vevent']['dtend']; + $interval = empty($event['Vevent']['rrule_interval']) ? 1 : $event['Vevent']['rrule_interval']; $expandStartPoint; // 登録するイベント群の開始日時 $expandEndPoint; @@ -319,7 +321,7 @@ function _expandEventsWeekly($start, $end, $event){ if (!empty($event['Vevent']['rrule_count'])) { $count = $event['Vevent']['rrule_count']; $s = $this->_expandDate($eventStart); - $endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'] + ($count * 7), $s['year']); + $endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'] + ($count * 7 * $interval), $s['year']); if (strtotime($end) < $endPoint) { $expandEndPoint = $this->_expandDate($end); } else { @@ -348,7 +350,7 @@ function _expandEventsWeekly($start, $end, $event){ $event['Vevent']['event_start'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year'])); $event['Vevent']['event_end'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year']) + $eventDiff); $events[] = $event['Vevent']; - $s['day'] += 7; + $s['day'] += 7 * $interval; } return $events; @@ -364,6 +366,7 @@ function _expandEventsWeekly($start, $end, $event){ function _expandEventsMonthly($start, $end, $event){ $eventStart = $event['Vevent']['dtstart']; $eventEnd = $event['Vevent']['dtend']; + $interval = empty($event['Vevent']['rrule_interval']) ? 1 : $event['Vevent']['rrule_interval']; $expandStartPoint; // 登録するイベント群の開始日時 $expandEndPoint; @@ -378,7 +381,7 @@ function _expandEventsMonthly($start, $end, $event){ if (!empty($event['Vevent']['rrule_count'])) { $count = $event['Vevent']['rrule_count']; $s = $this->_expandDate($eventStart); - $endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'] + $count, $s['day'], $s['year']); + $endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'] + ($count * $interval), $s['day'], $s['year']); if (strtotime($end) < $endPoint) { $expandEndPoint = $this->_expandDate($end); } else { @@ -400,7 +403,7 @@ function _expandEventsMonthly($start, $end, $event){ $event['Vevent']['event_start'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year'])); $event['Vevent']['event_end'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year']) + $eventDiff); $events[] = $event['Vevent']; - $s['month']++; + $s['month'] += 1 * $interval; } return $events; @@ -416,6 +419,7 @@ function _expandEventsMonthly($start, $end, $event){ function _expandEventsYearly($start, $end, $event){ $eventStart = $event['Vevent']['dtstart']; $eventEnd = $event['Vevent']['dtend']; + $interval = empty($event['Vevent']['rrule_interval']) ? 1 : $event['Vevent']['rrule_interval']; $expandStartPoint; // 登録するイベント群の開始日時 $expandEndPoint; @@ -430,7 +434,7 @@ function _expandEventsYearly($start, $end, $event){ if (!empty($event['Vevent']['rrule_count'])) { $count = $event['Vevent']['rrule_count']; $s = $this->_expandDate($eventStart); - $endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year'] + $count); + $endPoint = mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year'] + ($count * $interval)); if (strtotime($end) < $endPoint) { $expandEndPoint = $this->_expandDate($end); } else { @@ -459,7 +463,7 @@ function _expandEventsYearly($start, $end, $event){ $event['Vevent']['event_start'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year'])); $event['Vevent']['event_end'] = date('Y-m-d H:i:s', mktime($s['hour'], $s['min'], $s['second'], $s['month'], $s['day'], $s['year']) + $eventDiff); $events[] = $event['Vevent']; - $s['year']++; + $s['year'] += 1 * $interval; } return $events; diff --git a/tests/cases/models/vevent.test.php b/tests/cases/models/vevent.test.php index e834251..8a164d1 100644 --- a/tests/cases/models/vevent.test.php +++ b/tests/cases/models/vevent.test.php @@ -349,6 +349,132 @@ function test_freqYearlyUntil(){ $this->assertIdentical($result['2014-11-15'], array()); } + /** + * test_freqDailyCount5Interval2 + * + * jpn:rrule_freq = 'daily'のときに正しくスケジュールが展開されること + */ + function test_freqDailyCount5Interval2(){ + $data = array( + 'dtstart' => '2011-11-14 10:00:00', + 'dtend' => '2011-11-15 12:00:00', + 'summary' => '毎日5回2回に1回', + 'rrule_freq' => 'daily', + 'rrule_count' => 5, + 'rrule_interval' => 2, + ); + $uid = $this->Vevent->setEvent($data); + $result = $this->Vevent->findByRange('2011-11-01', '2011-11-30'); + + $this->assertIdentical($result['2011-11-13'], array()); + $this->assertIdentical($result['2011-11-14'][0]['uid'], $uid); + $this->assertIdentical(count($result['2011-11-14']), 1); + $this->assertIdentical(count($result['2011-11-15']), 1); + $this->assertIdentical($result['2011-11-24'][0]['uid'], $uid); + $this->assertIdentical($result['2011-11-25'][0]['uid'], $uid); + $this->assertIdentical(count($result['2011-11-24']), 1); + $this->assertIdentical(count($result['2011-11-25']), 1); + $this->assertIdentical($result['2011-11-26'], array()); + } + + /** + * test_freqWeeklyCount2Interval3 + * + */ + function test_freqWeeklyCount2Interval3(){ + $data = array( + 'dtstart' => '2011-11-14 10:00:00', + 'dtend' => '2011-11-15 12:00:00', + 'summary' => '毎週2回3回に1回', + 'rrule_freq' => 'weekly', + 'rrule_count' => 2, + 'rrule_interval' => 3, + ); + $uid = $this->Vevent->setEvent($data); + $result = $this->Vevent->findByRange('2011-11-01', '2011-12-31'); + $this->assertIdentical(count($result), 61); + $this->assertIdentical($result['2011-11-13'], array()); + $this->assertIdentical($result['2011-11-14'][0]['uid'], $uid); + $this->assertIdentical(count($result['2011-11-14']), 1); + $this->assertIdentical(count($result['2011-11-15']), 1); + $this->assertIdentical($result['2011-11-16'], array()); + $this->assertIdentical($result['2011-11-21'], array()); + $this->assertIdentical($result['2011-11-28'], array()); + $this->assertIdentical($result['2011-12-05'][0]['uid'], $uid); + $this->assertIdentical(count($result['2011-12-05']), 1); + $this->assertIdentical(count($result['2011-12-06']), 1); + $this->assertIdentical($result['2011-12-12'], array()); + } + + /** + * test_freqMonthlyCount3Interval2 + * + */ + function test_freqMonthlyCount3Interval2(){ + $data = array( + 'dtstart' => '2011-11-14 10:00:00', + 'dtend' => '2011-11-15 12:00:00', + 'summary' => '毎月3回2回に1回', + 'rrule_freq' => 'monthly', + 'rrule_count' => 3, + 'rrule_interval' => 2, + ); + $uid = $this->Vevent->setEvent($data); + $result = $this->Vevent->findByRange('2011-11-01', '2012-02-28'); + + $this->assertIdentical(count($result), (30 + 31 + 31 + 28)); + $this->assertIdentical($result['2011-11-13'], array()); + $this->assertIdentical($result['2011-11-14'][0]['uid'], $uid); + $this->assertIdentical(count($result['2011-11-14']), 1); + $this->assertIdentical(count($result['2011-11-15']), 1); + $this->assertIdentical($result['2011-11-16'], array()); + $this->assertIdentical($result['2011-12-14'], array()); + $this->assertIdentical($result['2012-01-14'][0]['uid'], $uid); + $this->assertIdentical(count($result['2012-01-14']), 1); + $this->assertIdentical(count($result['2012-01-15']), 1); + $this->assertIdentical($result['2012-01-16'], array()); + $this->assertIdentical($result['2012-02-14'], array()); + } + + /** + * test_freqYearlyCount3Interval2 + * + */ + function test_freqYearlyCount3Interval2(){ + $data = array( + 'dtstart' => '2011-11-14 10:00:00', + 'dtend' => '2011-11-15 12:00:00', + 'summary' => '毎年3回2回に1回', + 'rrule_freq' => 'yearly', + 'rrule_count' => 3, + 'rrule_interval' => 2, + ); + $uid = $this->Vevent->setEvent($data); + $result = $this->Vevent->findByRange('2011-11-01', '2015-11-30'); + $this->assertIdentical($result['2011-11-13'], array()); + $this->assertIdentical($result['2011-11-14'][0]['uid'], $uid); + $this->assertIdentical(count($result['2011-11-14']), 1); + $this->assertIdentical(count($result['2011-11-15']), 1); + $this->assertIdentical($result['2011-11-16'], array()); + + $this->assertIdentical($result['2012-11-14'], array()); + + $this->assertIdentical($result['2013-11-13'], array()); + $this->assertIdentical($result['2013-11-14'][0]['uid'], $uid); + $this->assertIdentical(count($result['2013-11-14']), 1); + $this->assertIdentical(count($result['2013-11-15']), 1); + $this->assertIdentical($result['2013-11-16'], array()); + + $this->assertIdentical($result['2014-11-14'], array()); + + $this->assertIdentical($result['2015-11-13'], array()); + $this->assertIdentical($result['2015-11-14'][0]['uid'], $uid); + $this->assertIdentical(count($result['2015-11-14']), 1); + $this->assertIdentical(count($result['2015-11-15']), 1); + $this->assertIdentical($result['2015-11-16'], array()); + } + + /** * test_findRange *