package nl.hsac.fitnesse.fixture.util;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
* Calendar util test.
*/
public class CalendarUtilTest {
public static final String DATATYPE_FACTORY_PROPERTY = "javax.xml.datatype.DatatypeFactory";
/**
* CalendarUtil.
*/
private CalendarUtil calendarUtil;
/**
* Setup.
*/
@Before
public void setup() {
calendarUtil = new CalendarUtil();
}
/**
* Reset DataTypeFactory after every test.
*/
@After
public void tearDown() {
System.getProperties().remove(DATATYPE_FACTORY_PROPERTY);
}
/**
* Test BuildXMLGregorianCalendar.
*/
@Test
public void testBuildXMLGregorianCalendar() {
Calendar today = Calendar.getInstance();
XMLGregorianCalendar cal = calendarUtil.buildXMLGregorianCalendar();
assertTrue(cal.getYear() == today.get(Calendar.YEAR));
assertTrue(cal.getMonth() == today.get(Calendar.MONTH) + 1);
assertTrue(cal.getDay() == today.get(Calendar.DAY_OF_MONTH));
String dateString = cal.toXMLFormat();
XMLGregorianCalendar calFromString = calendarUtil.buildXMLGregorianCalendar(dateString);
assertEquals(cal, calFromString);
}
/**
* Test BuildXMLGregorianCalendar.
*/
@Test
public void testBuildXMLGregorianCalendarWithDate() {
Calendar today = Calendar.getInstance();
XMLGregorianCalendar cal = calendarUtil.buildXMLGregorianCalendarDate(today.getTime());
assertTrue(cal.getYear() == today.get(Calendar.YEAR));
assertTrue(cal.getMonth() == today.get(Calendar.MONTH) + 1);
assertTrue(cal.getDay() == today.get(Calendar.DAY_OF_MONTH));
}
/**
* Tests handling of null inputs.
*/
@Test
public void testBuildXMLGregorianCalendarDateForNull() {
assertNull(calendarUtil.buildXMLGregorianCalendarDate((XMLGregorianCalendar) null));
assertNull(calendarUtil.buildXMLGregorianCalendarDate((Calendar) null));
assertNull(calendarUtil.buildXMLGregorianCalendarDate((Date) null));
}
/**
* Test BuildXMLGregorianCalendar.
*/
@Test
public void testBuildXMLGregorianCalendarDateTime() {
GregorianCalendar today = new GregorianCalendar();
XMLGregorianCalendar cal = calendarUtil.buildXMLGregorianCalendarDateTime(today);
assertTrue(cal.getYear() == today.get(Calendar.YEAR));
assertTrue(cal.getMonth() == today.get(Calendar.MONTH) + 1);
assertTrue(cal.getDay() == today.get(Calendar.DAY_OF_MONTH));
}
/**
* Test AddMonths.
* Result should be months +2 and no TimeZoneShift
*/
@Test
public void testAddMonths() {
XMLGregorianCalendar cal = calendarUtil.buildXMLGregorianCalendar();
int tz = cal.getTimezone();
XMLGregorianCalendar result = addMonths(2, cal);
assertEquals(8, result.getMonth());
assertEquals(0, result.getTimezone() - tz);
}
/**
* Test AddMonths.
* Result should be months +2 and no TimeZoneShift
*/
@Test
public void testSubstractMonths() {
XMLGregorianCalendar cal = calendarUtil.buildXMLGregorianCalendar();
int tz = cal.getTimezone();
XMLGregorianCalendar result = addMonths(-2, cal);
assertEquals(4, result.getMonth());
assertEquals(0, result.getTimezone() - tz);
}
private XMLGregorianCalendar addMonths(int amount, XMLGregorianCalendar cal) {
cal.setMonth(6);
cal.setDay(1);
cal.setHour(0);
cal.setMinute(0);
cal.setSecond(0);
cal.setMillisecond(0);
return calendarUtil.addMonths(cal, amount);
}
private XMLGregorianCalendar addYears(int amount, XMLGregorianCalendar cal) {
cal.setYear(2000);
cal.setMonth(6);
cal.setDay(1);
cal.setHour(0);
cal.setMinute(0);
cal.setSecond(0);
cal.setMillisecond(0);
return calendarUtil.addYears(cal, amount);
}
/**
* Test addYears.
*/
@Test
public void testAddYears() {
XMLGregorianCalendar cal = calendarUtil.buildXMLGregorianCalendar();
int tz = cal.getTimezone();
XMLGregorianCalendar result = addYears(2, cal);
assertEquals(2002, result.getYear());
assertEquals(0, result.getTimezone() - tz);
}
/**
* Test addYears.
*/
@Test
public void testSubstractYears() {
XMLGregorianCalendar cal = calendarUtil.buildXMLGregorianCalendar();
int tz = cal.getTimezone();
XMLGregorianCalendar result = addYears(-2, cal);
assertEquals(1998, result.getYear());
assertEquals(0, result.getTimezone() - tz);
}
/**
* Test AddMonths into winterTime.
* Result should be moths +2 and a one hour shift to the left.
*
*/
@Test
public void testAddMonthsIntoWinterTime() {
XMLGregorianCalendar cal = calendarUtil.buildXMLGregorianCalendar();
cal.setMonth(10);
cal.setDay(1);
cal.setHour(0);
cal.setMinute(0);
cal.setSecond(0);
cal.setMillisecond(0);
XMLGregorianCalendar result = calendarUtil.addMonths(cal, 2);
assertEquals(12, result.getMonth());
}
/**
* Test AddMonths into winterTime.
* Result should be moths +2 and a one hour shift to the right.
*
*/
@Test
public void testAddMonthsIntoSummerTime() {
XMLGregorianCalendar cal = calendarUtil.buildXMLGregorianCalendar();
cal.setMonth(2);
cal.setDay(1);
cal.setHour(0);
cal.setMinute(0);
cal.setSecond(0);
cal.setMillisecond(0);
XMLGregorianCalendar result = calendarUtil.addMonths(cal, 2);
assertEquals(4, result.getMonth());
}
}