/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition 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; version 3 of the License.
//
// This community edition 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, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.common;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import org.junit.BeforeClass;
import org.junit.Test;
import org.projectforge.test.TestConfiguration;
public class DateHolderTest
{
@BeforeClass
public static void setUp()
{
// Needed if this tests runs before the ConfigurationTest.
TestConfiguration.initAsTestConfiguration();
}
@Test
public void isSameDay()
{
final Calendar cal = Calendar.getInstance(DateHelper.EUROPE_BERLIN);
cal.set(2008, Calendar.MARCH, 5, 0, 0, 0);
cal.set(Calendar.MILLISECOND, 0);
final DateHolder date = new DateHolder(cal.getTime(), DateHelper.EUROPE_BERLIN);
assertEquals("2008-03-04 23:00:00.000", DateHelper.FOR_TESTCASE_OUTPUT_FORMATTER.get().format(date.getDate()));
final java.sql.Date sqlDate = date.getSQLDate();
assertEquals("2008-03-05 00:00:00.000", DateHelper.FOR_TESTCASE_OUTPUT_FORMATTER.get().format(sqlDate));
assertTrue(date.isSameDay(sqlDate) == true);
}
@Test
public void getSQLDate()
{
final Calendar cal = Calendar.getInstance(DateHelper.EUROPE_BERLIN);
cal.set(2008, Calendar.MARCH, 5, 0, 0, 0);
cal.set(Calendar.MILLISECOND, 0);
final DateHolder date = new DateHolder(cal.getTime(), DateHelper.EUROPE_BERLIN);
assertEquals("2008-03-04 23:00:00.000", DateHelper.FOR_TESTCASE_OUTPUT_FORMATTER.get().format(date.getDate()));
final java.sql.Date sqlDate = date.getSQLDate();
assertEquals("2008-03-05 00:00:00.000", DateHelper.FOR_TESTCASE_OUTPUT_FORMATTER.get().format(sqlDate));
}
@Test
public void daysBetween()
{
final DateHolder date1 = new DateHolder(DatePrecision.DAY, Locale.GERMAN);
date1.setDate(2008, 02, 23, 0, 0, 0);
final DateHolder date2 = new DateHolder(DatePrecision.DAY, Locale.GERMAN);
date2.setDate(2008, 02, 23, 0, 0, 0);
assertEquals(0, date1.daysBetween(date2.getDate()));
date2.setDate(2008, 02, 24, 0, 0, 0);
assertEquals(1, date1.daysBetween(date2.getDate()));
date2.setDate(2008, 02, 22, 0, 0, 0);
assertEquals(-1, date1.daysBetween(date2.getDate()));
date2.setDate(date1.getDate());
date2.add(Calendar.DAY_OF_YEAR, 364);
assertEquals(364, date1.daysBetween(date2.getDate()));
date1.setDate(2010, Calendar.JANUARY, 01);
date2.setDate(2010, Calendar.DECEMBER, 31);
assertEquals(daysBetween(date1, date2), date1.daysBetween(date2));
date2.setDate(2011, Calendar.JANUARY, 1);
assertEquals(daysBetween(date1, date2), date1.daysBetween(date2));
date1.setDate(2010, Calendar.DECEMBER, 31);
date2.setDate(2010, Calendar.JANUARY, 01);
assertEquals(daysBetween(date1, date2), date1.daysBetween(date2));
date2.setDate(2011, Calendar.JANUARY, 01);
assertEquals(1, date1.daysBetween(date2));
date2.setDate(2015, Calendar.JANUARY, 01);
final int expected = daysBetween(date1, date2);
assertEquals(expected, date1.daysBetween(date2));
assertEquals(-expected, date2.daysBetween(date1));
}
@Test
public void isBetween()
{
final DateHolder date1 = new DateHolder(DatePrecision.DAY);
date1.setDate(2010, Calendar.FEBRUARY, 12, 0, 0, 0);
final DateHolder date2 = new DateHolder(DatePrecision.DAY);
date2.setDate(2010, Calendar.FEBRUARY, 14, 0, 0, 0);
final DateHolder date3 = new DateHolder(DatePrecision.DAY);
date3.setDate(2010, Calendar.FEBRUARY, 15, 0, 0, 0);
assertFalse(date1.isBetween((Date) null, (Date) null));
assertFalse(date1.isBetween((DateHolder) null, (DateHolder) null));
assertTrue(date1.isBetween(null, date2));
assertFalse(date2.isBetween(null, date1));
assertTrue(date2.isBetween(date1, null));
assertFalse(date2.isBetween(date3, null));
assertTrue(date2.isBetween(date1, date3));
assertTrue(date1.isBetween(date1, date3));
assertTrue(date3.isBetween(date1, date3));
assertFalse(date3.isBetween(date1, date2));
}
@Test
public void ensurePrecision()
{
final DateHolder dateHolder = new DateHolder(DatePrecision.DAY, DateHelper.UTC, Locale.GERMAN);
assertPrecision("1970-11-21 00:00:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 50, 23);
dateHolder.setPrecision(DatePrecision.HOUR_OF_DAY);
assertPrecision("1970-11-21 04:00:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 50, 23);
dateHolder.setPrecision(DatePrecision.MINUTE);
assertPrecision("1970-11-21 04:50:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 50, 23);
dateHolder.setPrecision(DatePrecision.MINUTE_15);
assertPrecision("1970-11-21 04:00:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 00, 00);
assertPrecision("1970-11-21 04:00:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 7, 59);
assertPrecision("1970-11-21 04:15:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 8, 00);
assertPrecision("1970-11-21 04:15:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 15, 00);
assertPrecision("1970-11-21 04:15:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 22, 59);
assertPrecision("1970-11-21 04:30:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 23, 00);
assertPrecision("1970-11-21 04:30:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 30, 00);
assertPrecision("1970-11-21 04:30:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 37, 59);
assertPrecision("1970-11-21 04:45:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 38, 00);
assertPrecision("1970-11-21 04:45:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 45, 00);
assertPrecision("1970-11-21 04:45:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 52, 59);
assertPrecision("1970-11-21 05:00:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 53, 00);
dateHolder.setPrecision(DatePrecision.MINUTE_5);
assertPrecision("1970-11-21 04:00:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 02, 59);
assertPrecision("1970-11-21 04:05:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 03, 00);
assertPrecision("1970-11-21 04:50:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 48, 00);
assertPrecision("1970-11-21 04:50:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 52, 59);
assertPrecision("1970-11-21 04:55:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 53, 00);
assertPrecision("1970-11-21 04:55:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 57, 59);
assertPrecision("1970-11-21 05:00:00.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 58, 00);
dateHolder.setPrecision(DatePrecision.SECOND);
assertPrecision("1970-11-21 04:50:23.000", dateHolder, 1970, Calendar.NOVEMBER, 21, 4, 50, 23);
}
private void assertPrecision(final String expected, final DateHolder dateHolder, final int year, final int month, final int date, final int hourOfDay, final int minute, final int second)
{
dateHolder.setDate(year, month, date, hourOfDay, minute, second);
dateHolder.ensurePrecision();
assertEquals(expected, DateHelper.getForTestCase(dateHolder.getDate()));
}
@Test
public void getBeginAndEndOfMonth()
{
DateHolder dateHolder = new DateHolder(DatePrecision.DAY, DateHelper.UTC, Locale.GERMAN);
dateHolder.setDate(1970, Calendar.NOVEMBER, 21, 4, 50, 23);
assertEquals("1970-11-21 00:00:00.000", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder.setBeginOfMonth();
assertEquals("1970-11-01 00:00:00.000", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder.setDate(1970, Calendar.NOVEMBER, 21, 4, 50, 23);
assertEquals("1970-11-21 00:00:00.000", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder.setEndOfMonth();
assertEquals("1970-11-30 23:59:59.999", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder = new DateHolder(DatePrecision.DAY, DateHelper.UTC, Locale.GERMAN);
dateHolder.setDate(2007, Calendar.JANUARY, 21, 4, 50, 23);
dateHolder.setEndOfMonth();
assertEquals("2007-01-31 23:59:59.999", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder.setDate(2007, Calendar.FEBRUARY, 1, 4, 50, 23);
dateHolder.setEndOfMonth();
assertEquals("2007-02-28 23:59:59.999", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder.setDate(2004, Calendar.FEBRUARY, 1, 4, 50, 23);
dateHolder.setEndOfMonth();
assertEquals("2004-02-29 23:59:59.999", DateHelper.getForTestCase(dateHolder.getDate()));
}
@Test
public void getBeginAndEndOfWeek()
{
DateHolder dateHolder = new DateHolder(DatePrecision.DAY, DateHelper.UTC, Locale.GERMAN);
dateHolder.setDate(1970, Calendar.NOVEMBER, 21, 4, 50, 23);
assertEquals("1970-11-21 00:00:00.000", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder.setBeginOfWeek();
assertEquals("1970-11-16 00:00:00.000", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder.setEndOfWeek();
assertEquals("1970-11-22 23:59:59.999", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder.setBeginOfWeek();
assertEquals("1970-11-16 00:00:00.000", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder = new DateHolder(DatePrecision.DAY, DateHelper.UTC, Locale.GERMAN);
dateHolder.setDate(1970, Calendar.NOVEMBER, 21, 4, 50, 23);
dateHolder.setEndOfWeek();
assertEquals("1970-11-22 23:59:59.999", DateHelper.getForTestCase(dateHolder.getDate()));
}
@Test
public void addWorkingDays()
{
final DateHolder dateHolder = new DateHolder(DatePrecision.MINUTE, DateHelper.UTC, Locale.GERMAN);
dateHolder.setDate(2010, Calendar.MAY, 21, 4, 50, 23); // Friday
dateHolder.addWorkingDays(0);
assertEquals("2010-05-21 04:50:00.000", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder.addWorkingDays(1); // Skip saturday, sunday and whit monday and weekend.
assertEquals("2010-05-25 04:50:00.000", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder.addWorkingDays(-1); // Skip saturday, sunday and whit monday and weekend.
assertEquals("2010-05-21 04:50:00.000", DateHelper.getForTestCase(dateHolder.getDate()));
dateHolder.addWorkingDays(1); // Skip saturday, sunday and whit monday and weekend.
dateHolder.addWorkingDays(-6); // Skip saturday, sunday and whit monday and weekends.
assertEquals("2010-05-14 04:50:00.000", DateHelper.getForTestCase(dateHolder.getDate()));
}
private int daysBetween(final DateHolder date1, final DateHolder date2)
{
final DateHolder dh = new DateHolder(date2.getDate());
int count = 1;
if (date1.getTimeInMillis() > date2.getTimeInMillis()) {
count = -1;
}
int result = 0;
for (int i = 0; i < 5000; i++) {
if (dh.isSameDay(date1.getDate()) == true) {
break;
}
result += count;
dh.add(Calendar.DAY_OF_YEAR, -count);
}
return result;
}
}