/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*/
package com.liferay.calendar.internal.recurrence;
import com.liferay.calendar.recurrence.Recurrence;
import com.liferay.calendar.recurrence.RecurrenceSerializer;
import com.liferay.calendar.util.JCalendarUtil;
import com.liferay.portal.kernel.util.CalendarFactoryUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.util.CalendarFactoryImpl;
import java.util.Calendar;
import java.util.TimeZone;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* @author Adam Brandizzi
*/
public class RecurrenceSplitterTest {
@BeforeClass
public static void setUpClass() {
CalendarFactoryUtil calendarFactoryUtil = new CalendarFactoryUtil();
calendarFactoryUtil.setCalendarFactory(new CalendarFactoryImpl());
}
@Before
public void setUp() {
_recurrenceSplitter = new RecurrenceSplitterImpl();
}
@Test
public void testSplitRecurrence() {
Recurrence recurrence = getRecurrence("RRULE:FREQ=DAILY;INTERVAL=1");
Calendar startTimeJCalendar = getJCalendar(1);
Calendar splitTimeJCalendar = getJCalendar(10);
RecurrenceSplit recurrenceSplit = _recurrenceSplitter.split(
recurrence, startTimeJCalendar, splitTimeJCalendar);
assertSplit(recurrenceSplit);
assertFirstRecurrenceEquals(
recurrenceSplit, "RRULE:FREQ=DAILY;UNTIL=20170109;INTERVAL=1");
assertSecondRecurrenceEquals(
recurrenceSplit, "RRULE:FREQ=DAILY;INTERVAL=1");
}
@Test
public void testSplitRecurrenceWithCount() {
Recurrence recurrence = getRecurrence(
"RRULE:FREQ=DAILY;INTERVAL=1;COUNT=20");
Calendar startTimeJCalendar = getJCalendar(1);
Calendar splitTimeJCalendar = getJCalendar(10);
RecurrenceSplit recurrenceSplit = _recurrenceSplitter.split(
recurrence, startTimeJCalendar, splitTimeJCalendar);
assertSplit(recurrenceSplit);
assertFirstRecurrenceEquals(
recurrenceSplit, "RRULE:FREQ=DAILY;COUNT=9;INTERVAL=1");
assertSecondRecurrenceEquals(
recurrenceSplit, "RRULE:FREQ=DAILY;COUNT=11;INTERVAL=1");
}
@Test
public void testSplitRecurrenceWithCountAndSplitDateBeforeStartDate() {
Recurrence recurrence = getRecurrence(
"RRULE:FREQ=DAILY;COUNT=5;INTERVAL=1");
Calendar startTimeJCalendar = getJCalendar(1);
Calendar splitTimeJCalendar = getJCalendar(10);
RecurrenceSplit recurrenceSplit = _recurrenceSplitter.split(
recurrence, startTimeJCalendar, splitTimeJCalendar);
assertNotSplit(recurrenceSplit);
assertFirstRecurrenceEquals(
recurrenceSplit, "RRULE:FREQ=DAILY;COUNT=5;INTERVAL=1");
}
@Test
public void testSplitRecurrenceWithCountBeforeSplitDate() {
Recurrence recurrence = getRecurrence(
"RRULE:FREQ=DAILY;INTERVAL=1;COUNT=5");
Calendar startTimeJCalendar = getJCalendar(1);
Calendar splitTimeJCalendar = getJCalendar(10);
RecurrenceSplit recurrenceSplit = _recurrenceSplitter.split(
recurrence, startTimeJCalendar, splitTimeJCalendar);
assertNotSplit(recurrenceSplit);
assertFirstRecurrenceEquals(
recurrenceSplit, "RRULE:FREQ=DAILY;COUNT=5;INTERVAL=1");
}
@Test
public void testSplitRecurrenceWithExDate() {
Recurrence recurrence = getRecurrence(
"RRULE:FREQ=DAILY;INTERVAL=1\n" +
"EXDATE;TZID=\"UTC\";VALUE=DATE:20170108,20170112");
Calendar startTimeJCalendar = getJCalendar(1);
Calendar splitTimeJCalendar = getJCalendar(10);
RecurrenceSplit recurrenceSplit = _recurrenceSplitter.split(
recurrence, startTimeJCalendar, splitTimeJCalendar);
assertSplit(recurrenceSplit);
Assert.assertEquals(
"RRULE:FREQ=DAILY;UNTIL=20170109;INTERVAL=1\n" +
"EXDATE;TZID=\"UTC\";VALUE=DATE:20170108",
RecurrenceSerializer.serialize(
recurrenceSplit.getFirstRecurrence()));
Assert.assertEquals(
"RRULE:FREQ=DAILY;INTERVAL=1\n" +
"EXDATE;TZID=\"UTC\";VALUE=DATE:20170112",
RecurrenceSerializer.serialize(
recurrenceSplit.getSecondRecurrence()));
}
@Test
public void testSplitRecurrenceWithSplitDateAfterUntilDate() {
Recurrence recurrence = getRecurrence(
"RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20170108");
Calendar startTimeJCalendar = getJCalendar(1);
Calendar splitTimeJCalendar = getJCalendar(10);
RecurrenceSplit recurrenceSplit = _recurrenceSplitter.split(
recurrence, startTimeJCalendar, splitTimeJCalendar);
assertNotSplit(recurrenceSplit);
assertFirstRecurrenceEquals(
recurrenceSplit, "RRULE:FREQ=DAILY;UNTIL=20170108;INTERVAL=1");
}
@Test
public void testSplitRecurrenceWithSplitDateBeforeStartDate() {
Recurrence recurrence = getRecurrence("RRULE:FREQ=DAILY;INTERVAL=1");
Calendar startTimeJCalendar = getJCalendar(4);
Calendar splitTimeJCalendar = getJCalendar(1);
RecurrenceSplit recurrenceSplit = _recurrenceSplitter.split(
recurrence, startTimeJCalendar, splitTimeJCalendar);
assertNotSplit(recurrenceSplit);
assertFirstRecurrenceEquals(
recurrenceSplit, "RRULE:FREQ=DAILY;INTERVAL=1");
}
@Test
public void testSplitRecurrenceWithUntilDate() {
Recurrence recurrence = getRecurrence(
"RRULE:FREQ=DAILY;INTERVAL=1;UNTIL=20170131");
Calendar startTimeJCalendar = getJCalendar(1);
Calendar splitTimeJCalendar = getJCalendar(10);
RecurrenceSplit recurrenceSplit = _recurrenceSplitter.split(
recurrence, startTimeJCalendar, splitTimeJCalendar);
assertSplit(recurrenceSplit);
assertFirstRecurrenceEquals(
recurrenceSplit, "RRULE:FREQ=DAILY;UNTIL=20170109;INTERVAL=1");
assertSecondRecurrenceEquals(
recurrenceSplit, "RRULE:FREQ=DAILY;UNTIL=20170131;INTERVAL=1");
}
protected void assertFirstRecurrenceEquals(
RecurrenceSplit recurrenceSplit, String expectedRecurrence) {
assertRecurrenceEquals(
recurrenceSplit.getFirstRecurrence(), expectedRecurrence);
}
protected void assertNotSplit(RecurrenceSplit recurrenceSplit) {
Assert.assertFalse(recurrenceSplit.isSplit());
}
protected void assertRecurrenceEquals(
Recurrence recurrenceObj, String expectedRecurrence) {
Assert.assertEquals(
expectedRecurrence, RecurrenceSerializer.serialize(recurrenceObj));
}
protected void assertSecondRecurrenceEquals(
RecurrenceSplit recurrenceSplit, String expectedRecurrence) {
assertRecurrenceEquals(
recurrenceSplit.getSecondRecurrence(), expectedRecurrence);
}
protected void assertSplit(RecurrenceSplit recurrenceSplit) {
Assert.assertTrue(recurrenceSplit.isSplit());
}
protected Calendar getJCalendar(int dayOfMonth) {
return JCalendarUtil.getJCalendar(
2017, Calendar.JANUARY, dayOfMonth, 1, 0, 0, 0, _utcTimeZone);
}
protected Recurrence getRecurrence(String recurrence) {
return RecurrenceSerializer.deserialize(recurrence, _utcTimeZone);
}
private static final TimeZone _utcTimeZone = TimeZone.getTimeZone(
StringPool.UTC);
private RecurrenceSplitter _recurrenceSplitter;
}