/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package net.rrm.ehour.util;
import net.rrm.ehour.config.EhourConfig;
import net.rrm.ehour.data.DateRange;
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.LocalDate;
import org.junit.Test;
import java.util.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@SuppressWarnings("deprecation")
public class DateUtilTest {
@Test
public void testCalendarToMonthRange() {
Calendar cal = new GregorianCalendar(2006, 11 - 1, 4);
DateRange dr = DateUtil.calendarToMonthRange(cal);
assertEquals(106, dr.getDateStart().getYear());
assertEquals(10, dr.getDateStart().getMonth());
assertEquals(1, dr.getDateStart().getDate());
assertEquals(106, dr.getDateStart().getYear());
assertEquals(10, dr.getDateEnd().getMonth());
assertEquals(30, dr.getDateEnd().getDate());
assertEquals(23, dr.getDateEnd().getHours());
assertEquals(0, dr.getDateStart().getHours());
assertEquals(4, cal.get(Calendar.DATE));
}
@Test
public void testGetDaysInMonth() {
Calendar cal = new GregorianCalendar(2006, 11 - 1, 4);
assertEquals(30, DateUtil.getDaysInMonth(cal));
cal = new GregorianCalendar(2007, 2 - 1, 5);
assertEquals(28, DateUtil.getDaysInMonth(cal));
}
@Test
public void testGetDaysInMonthJoda() {
DateTime date = new DateTime(2006, 11, 4, 0, 0, 0, 0);
assertEquals(30, DateUtil.getDaysInMonth(date));
date = new DateTime(2007, 2, 5, 0, 0, 0, 0);
assertEquals(28, DateUtil.getDaysInMonth(date));
}
@Test
public void testIsDateWithinRange() {
DateRange dr = new DateRange(new GregorianCalendar(2006, 5, 5).getTime(),
new GregorianCalendar(2006, 6, 5).getTime());
Date testCal = new GregorianCalendar(2006, 5, 10).getTime();
assertTrue(DateUtil.isDateWithinRange(testCal, dr));
testCal = new GregorianCalendar(2006, 4, 10).getTime();
assertFalse(DateUtil.isDateWithinRange(testCal, dr));
testCal = new GregorianCalendar(2006, 5, 5).getTime();
assertTrue(DateUtil.isDateWithinRange(testCal, dr));
testCal = new GregorianCalendar(2006, 6, 5).getTime();
assertTrue(DateUtil.isDateWithinRange(testCal, dr));
testCal = new GregorianCalendar(2006, 6, 6).getTime();
assertFalse(DateUtil.isDateWithinRange(testCal, dr));
testCal = new GregorianCalendar(2006, 5, 4).getTime();
assertFalse(DateUtil.isDateWithinRange(testCal, dr));
}
@Test
public void testIsDateRangeOverlaps() {
DateRange rangeA = new DateRange(new GregorianCalendar(2006, 5, 5).getTime(),
new GregorianCalendar(2006, 6, 5).getTime());
DateRange rangeB = new DateRange(new GregorianCalendar(2007, 5, 5).getTime(),
new GregorianCalendar(2007, 6, 5).getTime());
// rangeB after rangeA
assertFalse(DateUtil.isDateRangeOverlaps(rangeA, rangeB));
// rangeB overlaps after rangeA
rangeB = new DateRange(new GregorianCalendar(2006, 5, 20).getTime(),
new GregorianCalendar(2007, 6, 5).getTime());
assertTrue(DateUtil.isDateRangeOverlaps(rangeA, rangeB));
assertTrue(DateUtil.isDateRangeOverlaps(rangeB, rangeA));
// rangeB in between rangeA
rangeB = new DateRange(new GregorianCalendar(2006, 5, 20).getTime(),
new GregorianCalendar(2006, 5, 25).getTime());
assertTrue(DateUtil.isDateRangeOverlaps(rangeA, rangeB));
assertTrue(DateUtil.isDateRangeOverlaps(rangeB, rangeA));
// rangeB overlaps before rangeA
rangeB = new DateRange(new GregorianCalendar(2006, 4, 20).getTime(),
new GregorianCalendar(2006, 5, 25).getTime());
assertTrue(DateUtil.isDateRangeOverlaps(rangeA, rangeB));
assertTrue(DateUtil.isDateRangeOverlaps(rangeB, rangeA));
// rangeB before rangeA
rangeB = new DateRange(new GregorianCalendar(2006, 4, 20).getTime(),
new GregorianCalendar(2006, 4, 30).getTime());
assertFalse(DateUtil.isDateRangeOverlaps(rangeA, rangeB));
assertFalse(DateUtil.isDateRangeOverlaps(rangeB, rangeA));
// rangeB overlaps on date
rangeB = new DateRange(new GregorianCalendar(2006, 4, 20).getTime(),
new GregorianCalendar(2006, 5, 5).getTime());
assertTrue(DateUtil.isDateRangeOverlaps(rangeA, rangeB));
assertTrue(DateUtil.isDateRangeOverlaps(rangeB, rangeA));
}
@Test
public void testIsDateRangeOverlapsNull() {
DateRange rangeA = new DateRange(null,
new GregorianCalendar(2006, 6, 5).getTime());
// rangeB after rangeA
DateRange rangeB = new DateRange(new GregorianCalendar(2007, 5, 5).getTime(),
new GregorianCalendar(2007, 6, 5).getTime());
assertFalse(DateUtil.isDateRangeOverlaps(rangeA, rangeB));
// rangeB overlaps after rangeA
rangeB = new DateRange(new GregorianCalendar(2006, 5, 20).getTime(),
new GregorianCalendar(2007, 6, 5).getTime());
assertTrue(DateUtil.isDateRangeOverlaps(rangeA, rangeB));
// rangeB in between rangeA
rangeB = new DateRange(new GregorianCalendar(2006, 5, 20).getTime(),
new GregorianCalendar(2006, 5, 25).getTime());
assertTrue(DateUtil.isDateRangeOverlaps(rangeA, rangeB));
// rangeB overlaps before rangeA
rangeB = new DateRange(new GregorianCalendar(2006, 4, 20).getTime(),
new GregorianCalendar(2006, 5, 25).getTime());
assertTrue(DateUtil.isDateRangeOverlaps(rangeA, rangeB));
// rangeB before rangeA
rangeB = new DateRange(new GregorianCalendar(2006, 4, 20).getTime(),
new GregorianCalendar(2006, 4, 30).getTime());
assertTrue(DateUtil.isDateRangeOverlaps(rangeA, rangeB));
// rangeB overlaps on date
rangeB = new DateRange(new GregorianCalendar(2006, 4, 20).getTime(),
new GregorianCalendar(2006, 5, 5).getTime());
assertTrue(DateUtil.isDateRangeOverlaps(rangeA, rangeB));
}
@Test
public void testGetDateRangeForWeek() {
Calendar cal = new GregorianCalendar(2007, 1 - 1, 1);
cal.setFirstDayOfWeek(Calendar.SUNDAY);
DateRange range = DateUtil.getDateRangeForWeek(cal);
assertEquals(2006 - 1900, range.getDateStart().getYear());
assertEquals(12 - 1, range.getDateStart().getMonth());
assertEquals(31, range.getDateStart().getDate());
assertEquals(2007 - 1900, range.getDateEnd().getYear());
assertEquals(1 - 1, range.getDateEnd().getMonth());
assertEquals(6, range.getDateEnd().getDate());
}
/**
*
*
*/
@Test
public void testNullifyTime() {
Calendar cal = new GregorianCalendar();
cal.set(Calendar.MINUTE, 10);
DateUtil.nullifyTime(cal);
assertEquals(0, cal.get(Calendar.MINUTE));
assertEquals(0, cal.get(Calendar.HOUR_OF_DAY));
}
@Test
public void testMaximizeTime() {
Calendar cal = new GregorianCalendar();
cal.set(Calendar.MINUTE, 10);
DateUtil.maximizeTime(cal);
assertEquals(59, cal.get(Calendar.MINUTE));
assertEquals(23, cal.get(Calendar.HOUR_OF_DAY));
}
@Test
public void testGetDateRangeForMonth() {
Calendar cal = new GregorianCalendar(2006, 12 - 1, 5);
DateRange range = DateUtil.getDateRangeForMonth(cal);
assertEquals(2006 - 1900, range.getDateStart().getYear());
assertEquals(12 - 1, range.getDateStart().getMonth());
assertEquals(1, range.getDateStart().getDate());
assertEquals(2006 - 1900, range.getDateEnd().getYear());
assertEquals(12 - 1, range.getDateEnd().getMonth());
assertEquals(31, range.getDateEnd().getDate());
}
@Test
public void testCreateCalendarSequence() {
EhourConfig config = mock(EhourConfig.class);
when(config.getFirstDayOfWeek()).thenReturn(1);
when(config.getTzAsTimeZone()).thenReturn(TimeZone.getDefault());
List<Date> res = DateUtil.createDateSequence(new DateRange(new Date(2007 - 1900, 5 - 1, 2), new Date(2007 - 1900, 5 - 1, 8)), config);
assertEquals(7, res.size());
}
@Test
public void testGetDateRangeForQuarter() {
Calendar cal = new GregorianCalendar(2007, 12 - 1, 5);
DateRange range = DateUtil.getDateRangeForQuarter(cal);
assertEquals(2007 - 1900, range.getDateStart().getYear());
assertEquals(10 - 1, range.getDateStart().getMonth());
assertEquals(1, range.getDateStart().getDate());
assertEquals(2007 - 1900, range.getDateEnd().getYear());
assertEquals(12 - 1, range.getDateEnd().getMonth());
assertEquals(31, range.getDateEnd().getDate());
cal = new GregorianCalendar(2007, 5 - 1, 5);
range = DateUtil.getDateRangeForQuarter(cal);
assertEquals(2007 - 1900, range.getDateStart().getYear());
assertEquals(4 - 1, range.getDateStart().getMonth());
assertEquals(1, range.getDateStart().getDate());
assertEquals(2007 - 1900, range.getDateEnd().getYear());
assertEquals(6 - 1, range.getDateEnd().getMonth());
assertEquals(30, range.getDateEnd().getDate());
}
@Test
public void testAddQuarter() {
Calendar cal = new GregorianCalendar(2007, 12 - 1, 5);
Calendar q = DateUtil.addQuarter(cal, 1);
assertEquals(2008, q.get(Calendar.YEAR));
assertEquals(0, q.get(Calendar.MONTH));
assertEquals(1, q.get(Calendar.DATE));
cal = new GregorianCalendar(2007, 12 - 1, 5);
q = DateUtil.addQuarter(cal, -2);
assertEquals(2007, q.get(Calendar.YEAR));
assertEquals(4 - 1, q.get(Calendar.MONTH));
assertEquals(1, q.get(Calendar.DATE));
}
@Test
public void should_get_proper_US_date_formatting_pattern() {
assertEquals("M/d/yy", DateUtil.getPatternForDateLocale(Locale.US));
}
@Test
public void should_get_proper_German_date_formatting_pattern() {
assertEquals("dd.MM.yy", DateUtil.getPatternForDateLocale(Locale.GERMANY));
}
@Test
public void should_get_proper_Chinese_date_formatting_pattern() {
assertEquals("yy-M-d", DateUtil.getPatternForDateLocale(Locale.CHINA));
}
@Test
public void should_get_proper_French_date_formatting_pattern() {
assertEquals("dd/MM/yy", DateUtil.getPatternForDateLocale(Locale.FRANCE));
}
@Test
public void should_get_proper_Japanese_date_formatting_pattern() {
assertEquals("yy/MM/dd", DateUtil.getPatternForDateLocale(Locale.JAPAN));
}
@Test
public void should_get_proper_Dutch_date_formatting_pattern() {
assertEquals("d-M-yy", DateUtil.getPatternForDateLocale(new Locale("nl")));
}
@Test
public void should_return_week_35_for_august_28_with_Sunday_as_first_day_of_week() {
assertEquals(35, DateUtil.getWeekNumberForDate(new GregorianCalendar(2011, 7, 28).getTime(), Calendar.SUNDAY));
}
@Test
public void should_return_week_35_for_august_29_with_Monday_as_first_day_of_week() {
assertEquals(35, DateUtil.getWeekNumberForDate(new GregorianCalendar(2011, 7, 29).getTime(), Calendar.MONDAY));
}
@Test
public void should_return_week_1_for_january_1_2012_with_Sunday_as_first_day_of_week() {
assertEquals(1, DateUtil.getWeekNumberForDate(new GregorianCalendar(2012, Calendar.JANUARY, 1).getTime(), Calendar.SUNDAY));
}
@Test
public void should_return_31_days_as_amount_of_days_in_January() {
assertEquals(31, DateUtil.getDaysInMonth(new GregorianCalendar(2012, 0, 15)));
}
@Test
public void should_return_29_days_as_amount_of_days_in_February_2012() {
assertEquals(29, DateUtil.getDaysInMonth(new GregorianCalendar(2012, 1, 15)));
}
@Test
public void should_convert_calendar_sunday_to_jodatime_sunday() {
assertEquals(DateTimeConstants.SUNDAY, DateUtil.fromCalendarToJodaTimeDayInWeek(Calendar.SUNDAY));
}
@Test
public void should_convert_calendar_thursday_to_jodatime_thursday() {
assertEquals(DateTimeConstants.THURSDAY, DateUtil.fromCalendarToJodaTimeDayInWeek(Calendar.THURSDAY));
}
@Test
public void should_have_date_in_range_with_open_end() {
DateTime now = new DateTime();
DateRange range = new DateRange(now.toDate(), null);
assertTrue(DateUtil.isDateWithinRange(now.plusDays(1).toDate(), range));
}
@Test
public void should_have_date_in_range_with_open_start() {
DateTime now = new DateTime();
DateRange range = new DateRange(null, now.plusDays(15).toDate());
assertTrue(DateUtil.isDateWithinRange(now.plusDays(1).toDate(), range));
}
@Test
public void should_format_date_with_local_pattern() {
LocalDate date = new LocalDate(2013, 1, 2);
String formatted = DateUtil.formatDate(date, Locale.ENGLISH);
assertEquals("1/2/13", formatted);
}
}