package de.invesdwin.util.time.fdate;
import java.util.TimeZone;
import javax.annotation.concurrent.NotThreadSafe;
import org.joda.time.DateTimeZone;
import org.junit.BeforeClass;
import org.junit.Test;
import de.invesdwin.util.assertions.Assertions;
import de.invesdwin.util.collections.iterable.ICloseableIterator;
import de.invesdwin.util.time.TimeZones;
import de.jollyday.HolidayCalendar;
@NotThreadSafe
public class FDateTest {
@BeforeClass
public static void beforeClass() {
final TimeZone newTimeZone = TimeZones.getTimeZone("UTC");
FDates.setDefaultTimeZone(newTimeZone);
final FDate curDate = new FDate();
final String dateStr = curDate.toString();
TimeZone.setDefault(newTimeZone);
//joda needs another call explicitly since it might have cached the value too early...
DateTimeZone.setDefault(DateTimeZone.forTimeZone(newTimeZone));
Assertions.assertThat(curDate.toString()).isEqualTo(dateStr);
}
@Test
public void testConversionDate() {
final FDate today = FDate.today();
Assertions.assertThat(new FDate(today.dateValue())).isEqualTo(today);
final String dateStr = org.apache.commons.lang3.time.FastDateFormat.getInstance(FDate.FORMAT_ISO_DATE_TIME)
.format(today.dateValue());
final String fdateStr = today.toString(FDate.FORMAT_ISO_DATE_TIME);
Assertions.assertThat(dateStr).isEqualTo(fdateStr);
Assertions.assertThat(dateStr).endsWith("T00:00:00");
System.out.println(new FDate().dateValue()); //SUPPRESS CHECKSTYLE single line
}
@Test
public void testConversionCalendar() {
final FDate today = FDate.today();
Assertions.assertThat(new FDate(today.calendarValue())).isEqualTo(today);
final String dateStr = org.apache.commons.lang3.time.FastDateFormat.getInstance(FDate.FORMAT_ISO_DATE_TIME)
.format(today.calendarValue());
final String fdateStr = today.toString(FDate.FORMAT_ISO_DATE_TIME);
Assertions.assertThat(dateStr).isEqualTo(fdateStr);
Assertions.assertThat(dateStr).endsWith("T00:00:00");
}
@Test
public void testIsSameWeek() {
final FDate wednesday = FDateBuilder.newDate(2015, 8, 12);
Assertions.assertThat(wednesday.getFWeekday()).isEqualTo(FWeekday.Wednesday);
final FDate monday = FDateBuilder.newDate(2015, 8, 10);
Assertions.assertThat(monday.getFWeekday()).isEqualTo(FWeekday.Monday);
Assertions.assertThat(FDates.isSameWeek(wednesday, monday)).isTrue();
Assertions.assertThat(FDates.isSameWeek(wednesday, monday.addMilliseconds(-1))).isFalse();
final FDate sunday = FDateBuilder.newDate(2015, 8, 16).addDays(1).addMilliseconds(-1);
Assertions.assertThat(sunday.getFWeekday()).isEqualTo(FWeekday.Sunday);
Assertions.assertThat(FDates.isSameWeek(wednesday, sunday)).isTrue();
Assertions.assertThat(FDates.isSameWeek(wednesday, sunday.addMilliseconds(1))).isFalse();
}
@Test
public void testIterable() {
int iterations = 0;
for (final FDate date : FDates.iterable(new FDate(), new FDate(), FTimeUnit.DAYS, 1)) {
System.out.println(String.format("%s", date)); //SUPPRESS CHECKSTYLE single line
iterations++;
}
Assertions.assertThat(iterations).isEqualTo(1);
}
@Test
public void testIterableReverse() {
int iterations = 0;
for (final FDate date : FDates.iterable(new FDate(), new FDate(), FTimeUnit.DAYS, -1)) {
System.out.println(String.format("%s", date)); //SUPPRESS CHECKSTYLE single line
iterations++;
}
Assertions.assertThat(iterations).isEqualTo(1);
}
@Test
public void testIterableYearly() {
int iterations = 0;
final FDate endDate = FDateBuilder.newDate(2012, 1, 27);
final FDate startDate = FDateBuilder.newDate(1990, 1, 1);
FDate lastDate = null;
for (final FDate date : FDates.iterable(startDate, endDate, FTimeUnit.YEARS, 1)) {
if (lastDate == null) {
Assertions.assertThat(FDates.isSameMillisecond(startDate, date)).isTrue();
}
lastDate = date;
System.out.println(String.format("%s", date)); //SUPPRESS CHECKSTYLE single line
iterations++;
}
Assertions.assertThat(iterations).isEqualTo(24);
Assertions.assertThat(FDates.isSameMillisecond(endDate, lastDate)).isTrue();
}
@Test
public void testIterableYearlyReverse() {
int iterations = 0;
final FDate endDate = FDateBuilder.newDate(2012, 1, 27);
final FDate startDate = FDateBuilder.newDate(1990, 1, 1);
FDate lastDate = null;
for (final FDate date : FDates.iterable(endDate, startDate, FTimeUnit.YEARS, -1)) {
if (lastDate == null) {
Assertions.assertThat(FDates.isSameMillisecond(endDate, date)).isTrue();
}
lastDate = date;
System.out.println(String.format("%s", date)); //SUPPRESS CHECKSTYLE single line
iterations++;
}
Assertions.assertThat(iterations).isEqualTo(24);
Assertions.assertThat(FDates.isSameMillisecond(startDate, lastDate)).isTrue();
}
@Test
public void testFirstWeekdayOfMonthFromSundayFirst() {
final FDate saturdayLast = FDateBuilder.newDate(2016, 5, 1);
Assertions.assertThat(saturdayLast.getFWeekday()).isEqualTo(FWeekday.Sunday);
final FDate mondayInMay = saturdayLast.getFirstWeekdayOfMonth(FWeekday.Monday);
Assertions.assertThat(mondayInMay).isEqualTo(FDateBuilder.newDate(2016, 5, 2));
}
@Test
public void testFirstWeekdayOfMonthFromSaturdayLast() {
final FDate sundayFirst = FDateBuilder.newDate(2016, 4, 30);
Assertions.assertThat(sundayFirst.getFWeekday()).isEqualTo(FWeekday.Saturday);
final FDate mondayInMay = sundayFirst.getFirstWeekdayOfMonth(FWeekday.Monday);
Assertions.assertThat(mondayInMay).isEqualTo(FDateBuilder.newDate(2016, 4, 4));
}
@Test
public void testAddWorkdays() {
final FDate saturday = FDateBuilder.newDate(2016, 4, 30);
Assertions.assertThat(saturday.addWorkdays(2, null)).isEqualTo(FDateBuilder.newDate(2016, 5, 3));
Assertions.assertThat(saturday.addWorkdays(2, HolidayCalendar.GERMANY))
.isEqualTo(FDateBuilder.newDate(2016, 5, 3));
Assertions.assertThat(saturday.addWorkdays(-2, null)).isEqualTo(FDateBuilder.newDate(2016, 4, 28));
Assertions.assertThat(saturday.addWorkdays(-2, HolidayCalendar.GERMANY))
.isEqualTo(FDateBuilder.newDate(2016, 4, 28));
final FDate wednesday = FDateBuilder.newDate(2016, 5, 4);
Assertions.assertThat(wednesday.addWorkdays(5, null)).isEqualTo(FDateBuilder.newDate(2016, 5, 11));
Assertions.assertThat(wednesday.addWorkdays(5, HolidayCalendar.GERMANY))
.isEqualTo(FDateBuilder.newDate(2016, 5, 12));
}
@Test
public void testIterateDays() {
final FDate fromDate = FDateBuilder.newDate(2000, 1, 1);
final FDate toDate = fromDate.addDays(1).addMilliseconds(-1);
final ICloseableIterator<FDate> iterator = FDates.iterable(fromDate, toDate, FTimeUnit.DAYS, 1).iterator();
final FDate next = iterator.next();
Assertions.assertThat(next).isEqualTo(fromDate);
final FDate nextNext = iterator.next();
Assertions.assertThat(nextNext).isEqualTo(toDate);
Assertions.assertThat(iterator.hasNext()).isFalse();
}
@Test
public void testSetWeekday() {
final FDate date = FDateBuilder.newDate(2017, 1, 1);
final FDate monday = date.setFWeekday(FWeekday.Monday);
Assertions.assertThat(monday).isEqualTo(FDateBuilder.newDate(2016, 12, 26));
}
}