/*
* Created on 13/02/2005
*
* $Id: PeriodListTest.java,v 1.5 2005/06/26 12:34:36 fortuna Exp $
*
* Copyright (c) 2005, Ben Fortuna
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* o Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* o Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* o Neither the name of Ben Fortuna nor the names of any other contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.fortuna.ical4j.model;
import java.util.Calendar;
import java.util.GregorianCalendar;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author Ben Fortuna
*/
public class PeriodListTest extends TestCase {
private static Log log = LogFactory.getLog(PeriodListTest.class);
private DateTime begin1994;
private DateTime end1994;
private DateTime jan1994;
private DateTime feb1994;
private DateTime mar1994;
private DateTime apr1994;
private DateTime may1994;
private DateTime jun1994;
private DateTime jul1994;
private DateTime aug1994;
private DateTime sep1994;
private DateTime oct1994;
private DateTime nov1994;
private DateTime dec1994;
private Period year1994;
private Period monthJanuary;
private Period monthFebruary;
private Period monthMarch;
private Period monthApril;
private Period monthMay;
private Period monthJune;
private Period monthJuly;
private Period monthAugust;
private Period monthSeptember;
private Period monthOctober;
private Period monthNovember;
private Period monthDecember;
private Period head1994;
private Period tail1994;
private Period firstHalf; // from year begin to jun
private Period lastHalf; // jul to year end
private Period firstQuarter; // jan feb mar
private Period secondQuarter; // apr may jun
private Period thirdQuarter; // jul aug sep
private Period fourthQuarter; // oct nov dec
private Period fiscal1994; //jan - dec
private Period winter; // head jan feb
private Period spring; // mar apr may jun
private Period summer; // jul aug sep oct
private Period fall; // nov dec tail
private Period marchToMay; // mar apr may
private Period aprilToJune; // apr may jun
private Period marchToApril; // mar apr
private Period februaryToMay; //feb mar apr may
private PeriodList oddMonths;
private PeriodList evenMonths;
private PeriodList headSet;
private PeriodList tailSet;
public void setUp() throws Exception
{
super.setUp();
// create ranges that are intervals
java.util.Calendar cal = new GregorianCalendar(1994,
java.util.Calendar.JANUARY, 1);
begin1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.DECEMBER, 31);
end1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.JANUARY, 22);
jan1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.FEBRUARY, 15);
feb1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.MARCH, 4);
mar1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.APRIL, 12);
apr1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.MAY, 19);
may1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.JUNE, 21);
jun1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.JULY, 28);
jul1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.AUGUST, 20);
aug1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.SEPTEMBER, 17);
sep1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.OCTOBER, 29);
oct1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.NOVEMBER, 11);
nov1994 = new DateTime(cal.getTime().getTime());
cal.set(1994, java.util.Calendar.DECEMBER, 2);
dec1994 = new DateTime(cal.getTime().getTime());
year1994 = new Period(begin1994, end1994);
monthJanuary = new Period(jan1994, feb1994);
monthFebruary = new Period(feb1994, mar1994);
monthMarch = new Period(mar1994, apr1994);
monthApril = new Period(apr1994, may1994);
monthMay = new Period(may1994, jun1994);
monthJune = new Period(jun1994, jul1994);
monthJuly = new Period(jul1994, aug1994);
monthAugust = new Period(aug1994, sep1994);
monthSeptember = new Period(sep1994, oct1994);
monthOctober = new Period(oct1994, nov1994);
monthNovember = new Period(nov1994, dec1994);
monthDecember = new Period(dec1994, end1994);
head1994 = new Period(begin1994, jan1994);
tail1994 = new Period(dec1994, end1994);
firstHalf = new Period(begin1994, jun1994);
lastHalf = new Period(jul1994, end1994);
firstQuarter = new Period(jan1994, apr1994);
secondQuarter = new Period(apr1994, jul1994);
thirdQuarter = new Period(jul1994, oct1994);
fourthQuarter = new Period(oct1994, dec1994);
fiscal1994 = new Period(jan1994, dec1994);
winter = new Period(begin1994, mar1994);
spring = new Period(mar1994, jul1994);
summer = new Period(jul1994, nov1994);
fall = new Period(nov1994, end1994);
marchToMay = new Period(mar1994, jun1994);
marchToApril = new Period(mar1994, may1994);
aprilToJune = new Period(apr1994, jul1994);
februaryToMay = new Period(feb1994, jun1994);
// create sets that contain the ranges
oddMonths = new PeriodList();
oddMonths.add(monthJanuary);
oddMonths.add(monthMarch);
oddMonths.add(monthMay);
oddMonths.add(monthJuly);
oddMonths.add(monthSeptember);
oddMonths.add(monthNovember);
evenMonths = new PeriodList();
evenMonths.add(monthFebruary);
evenMonths.add(monthApril);
evenMonths.add(monthJune);
evenMonths.add(monthAugust);
evenMonths.add(monthOctober);
evenMonths.add(monthDecember);
headSet = new PeriodList();
headSet.add(head1994);
tailSet = new PeriodList();
tailSet.add(tail1994);
}
public final void testPeriodListSort() {
PeriodList periods = new PeriodList();
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 25);
periods.add(new Period(new DateTime(), new DateTime(cal.getTime().getTime())));
periods.add(new Period(new DateTime(cal.getTime().getTime()), new Dur(0, 2, 0, 0)));
periods.add(new Period(new DateTime(), new Dur(0, 2, 0, 0)));
periods.add(new Period(new DateTime(), new Dur(0, 1, 0, 0)));
// log.info("Unsorted list: " + periods);
// Collections.sort(periods);
log.info("Sorted list: " + periods);
}
/**
* test null init and add
* test null init
* test null add
* test empty init and add
* test empty init
* test empty add
*
* @throws Exception
*/
/*
public void testEmptyAddPeriods() throws Exception
{
SortedSet empty1 = new TreeSet();
SortedSet empty2 = new TreeSet();
assertNull("Normalizing null sets should return null",
normalizer.addDateRanges(null, null));
assertEquals(headSet, normalizer.addDateRanges(null, headSet));
assertEquals(evenMonths, normalizer.addDateRanges(evenMonths, null));
assertEquals(empty1, normalizer.addDateRanges(empty1, empty2));
assertEquals(headSet, normalizer.addDateRanges(empty1, headSet));
assertEquals(evenMonths, normalizer.addDateRanges(evenMonths, empty1));
}
*/
/**
* test null curr and remove
* test null curr
* test null remove
* test empty curr and remove
* test empty curr
* test empty remove
*
* @throws Exception
*/
public void testEmptySubtractPeriodList() throws Exception
{
PeriodList empty1 = new PeriodList();
PeriodList empty2 = new PeriodList();
/*
assertNull("Removing null from a null set should return null",
empty1.subtract(null));
assertNull("Removing from a null set should return null",
normalizer.subtractDateRanges(null, headSet));
*/
assertEquals(evenMonths, evenMonths.subtract(null));
assertEquals(empty1, empty1.subtract(empty2));
assertEquals(headSet, headSet.subtract(empty1));
assertEquals(evenMonths, evenMonths.subtract(empty1));
}
/**
*
* Test null dateList
* Test empty dateList
* Test Jan/Feb/Mar dateList
*
* @throws Exception
*/
/*
public void testCreateDateRangeSet() throws Exception {
// Test null dateList
assertNull(normalizer.createDateRangeSet(null, 0));
// Test empty dateList
DateList emptyDateList = new DateList(Value.DATE_TIME);
assertEquals(normalizer.createDateRangeSet(emptyDateList, 0).size(), 0);
// Test Jan/Feb/Mar dateList
DateList dateList1 = new DateList(Value.DATE_TIME);
final long EIGHT_HOURS = 1000 * 60 * 60 * 8;
dateList1.add(jan1994); // Jan 22
dateList1.add(feb1994); // Feb 15
dateList1.add(mar1994); // Mar 4
SortedSet dateRangeSet =
normalizer.createDateRangeSet(dateList1, EIGHT_HOURS);
Object[] objArray = dateRangeSet.toArray();
DateRange[] dateRangeArray = new DateRange[objArray.length];
for (int i = 0; i < objArray.length; i++) {
dateRangeArray[i] = (DateRange) objArray[i];
}
assertEquals(dateRangeArray[0].getStartDate(), jan1994);
assertEquals(dateRangeArray[0].getEndDate(),
new Date(jan1994.getTime() + EIGHT_HOURS));
assertEquals(dateRangeArray[1].getStartDate(), feb1994);
assertEquals(dateRangeArray[1].getEndDate(),
new Date(feb1994.getTime() + EIGHT_HOURS));
assertEquals(dateRangeArray[2].getStartDate(), mar1994);
assertEquals(dateRangeArray[2].getEndDate(),
new Date(mar1994.getTime() + EIGHT_HOURS));
}
*/
/**
* Test null ranges
*
* @throws Exception
*/
/*
public void testAddNullDateRanges() throws Exception {
// Test null ranges.
assertNull(normalizer.addDateRanges(null, null));
}
*/
/**
* add disjoint ranges
*
* @throws Exception
*/
public void testAddDisjointRange() throws Exception {
PeriodList periodList1 = new PeriodList();
PeriodList periodList2 = new PeriodList();
periodList1.add(monthNovember);
periodList1.add(monthDecember);
periodList2.add(monthJuly);
periodList2.add(monthNovember);
/*
SortedSet normalizedSet =
normalizer.addDateRanges(dateRangeSet1, dateRangeSet2);
*/
PeriodList sum = periodList1.add(periodList2);
assertEquals(sum.size(), 2);
Period lonePeriod = (Period) sum.toArray()[0];
assertEquals(lonePeriod.getStart(), jul1994);
assertEquals(lonePeriod.getEnd(), aug1994);
}
/**
* add one range containing another
*
* @throws Exception
*/
public void testAddContainingRange() throws Exception {
PeriodList periodList1 = new PeriodList();
PeriodList periodList2 = new PeriodList();
periodList1.add(monthOctober);
periodList1.add(monthNovember);
periodList1.add(monthDecember);
periodList2.add(monthNovember);
/*
SortedSet normalizedSet =
normalizer.addDateRanges(dateRangeSet1, dateRangeSet2);
*/
PeriodList sum = periodList1.add(periodList2);
assertEquals(sum.size(), 1);
Period lonePeriod = (Period) sum.toArray()[0];
assertEquals(lonePeriod.getStart(), oct1994);
assertEquals(lonePeriod.getEnd(), end1994);
}
/**
* add overlapping ranges
*
* @throws Exception
*/
public void testAddOverlappingDateRanges() throws Exception {
// Test Intersecting Periods
PeriodList periodList1 = new PeriodList();
PeriodList periodList2 = new PeriodList();
periodList1.add(monthNovember);
periodList1.add(monthDecember);
periodList2.add(monthOctober);
periodList2.add(monthNovember);
/*
SortedSet normalizedSet =
normalizer.addDateRanges(dateRangeSet1, dateRangeSet2);
*/
PeriodList sum = periodList1.add(periodList2);
assertEquals(sum.size(), 1);
Period lonePeriod = (Period) sum.toArray()[0];
assertEquals(lonePeriod.getStart(), oct1994);
assertEquals(lonePeriod.getEnd(), end1994);
}
/**
* add adjacent ranges
*
* @throws Exception
*/
public void testAddAdjacentRanges() throws Exception {
// Test adding adjacent periods.
PeriodList periodList1 = new PeriodList();
PeriodList periodList2 = new PeriodList();
periodList1.add(monthNovember);
periodList1.add(monthDecember);
periodList2.add(monthOctober);
/*
SortedSet normalizedSet =
normalizer.addDateRanges(dateRangeSet1, dateRangeSet2);
*/
PeriodList sum = periodList1.add(periodList2);
assertEquals(sum.size(), 1);
Period lonePeriod = (Period) sum.toArray()[0];
assertEquals(lonePeriod.getStart(), oct1994);
assertEquals(lonePeriod.getEnd(), end1994);
}
/**
* add the same range twice
*
* @throws Exception
*/
public void testAddSameRangeTwice() throws Exception {
// Test adding the same range twice
PeriodList periodList1 = new PeriodList();
PeriodList periodList2 = new PeriodList();
periodList1.add(monthNovember);
periodList1.add(monthDecember);
periodList2.add(monthOctober);
periodList2.add(monthNovember);
/*
SortedSet normalizedSet1 =
normalizer.addDateRanges(dateRangeSet1, dateRangeSet2);
SortedSet normalizedSet2 =
normalizer.addDateRanges(dateRangeSet1, dateRangeSet2);
*/
PeriodList sum1 = periodList1.add(periodList2);
PeriodList sum2 = periodList1.add(periodList2);
assertEquals(sum1.size(), 1);
Period lonePeriod1 = (Period) sum1.toArray()[0];
assertEquals(lonePeriod1.getStart(), oct1994);
assertEquals(lonePeriod1.getEnd(), end1994);
assertEquals(sum2.size(), 1);
Period lonePeriod2 = (Period) sum2.toArray()[0];
assertEquals(lonePeriod2.getStart(), oct1994);
assertEquals(lonePeriod2.getEnd(), end1994);
}
/**
* Test subtract null range sets.
*
* @throws Exception
*/
/*
public void testSubtractNullDateRanges() throws Exception {
assertNull(normalizer.subtractDateRanges(null, null));
}
*/
/**
* Test subtract a containing date range set.
*
* @throws Exception
*/
public void testSubtractContainingRange() throws Exception {
PeriodList periodList1 = new PeriodList();
PeriodList periodList2 = new PeriodList();
periodList1.add(monthSeptember);
periodList1.add(monthOctober);
periodList1.add(monthNovember);
periodList1.add(monthDecember);
periodList2.add(monthOctober);
periodList2.add(monthNovember);
/*
SortedSet normalizedSet =
normalizer.subtractDateRanges(dateRangeSet1, dateRangeSet2);
*/
PeriodList sum = periodList1.subtract(periodList2);
assertEquals(sum.size(), 2);
Period lonePeriod1 = (Period) sum.toArray()[0];
assertEquals(lonePeriod1.getStart(), sep1994);
assertEquals(lonePeriod1.getEnd(), oct1994);
Period lonePeriod2 = (Period) sum.toArray()[1];
assertEquals(lonePeriod2.getStart(), dec1994);
assertEquals(lonePeriod2.getEnd(), end1994);
}
/**
* Test removing a Disjoint Set of Date Ranges.
*
* @throws Exception
*/
public void testSubtractDisjointDateRanges() throws Exception {
PeriodList periodList1 = new PeriodList();
PeriodList periodList2 = new PeriodList();
periodList1.add(monthSeptember);
periodList1.add(monthOctober);
periodList1.add(monthNovember);
periodList1.add(monthDecember);
periodList2.add(monthApril);
periodList2.add(monthMay);
/*
SortedSet normalizedSet =
normalizer.subtractDateRanges(dateRangeSet1, dateRangeSet2);
*/
PeriodList sum = periodList1.subtract(periodList2);
assertEquals(sum, periodList1);
}
/**
*
*
* @throws Exception
*/
public void testSubtractSameRangesTwice() throws Exception {
PeriodList periodList1 = new PeriodList();
PeriodList periodList2 = new PeriodList();
PeriodList expectedResult = new PeriodList();
expectedResult.add(monthSeptember);
expectedResult.add(monthDecember);
periodList1.add(monthSeptember);
periodList1.add(monthOctober);
periodList1.add(monthNovember);
periodList1.add(monthDecember);
periodList2.add(monthOctober);
periodList2.add(monthNovember);
/*
SortedSet normalizedSet =
normalizer.subtractDateRanges(dateRangeSet1, dateRangeSet2);
*/
PeriodList sum = periodList1.subtract(periodList2);
assertEquals(sum, expectedResult);
/*
normalizedSet =
normalizer.subtractDateRanges(dateRangeSet1, dateRangeSet2);
*/
sum = periodList1.subtract(periodList2);
assertEquals(sum, expectedResult);
}
}