/*
Copyright 2013 BarD Software s.r.o
This file is part of GanttProject, an opensource project management tool.
GanttProject 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 3 of the License, or
(at your option) any later version.
GanttProject 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 GanttProject. If not, see <http://www.gnu.org/licenses/>.
*/
package biz.ganttproject.core.calendar;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;
import biz.ganttproject.core.calendar.CalendarEvent.Type;
import biz.ganttproject.core.calendar.GPCalendar.DayMask;
import biz.ganttproject.core.calendar.GPCalendar.DayType;
import biz.ganttproject.core.time.CalendarFactory;
import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import junit.framework.TestCase;
/**
* Tests for {@link WeekendsCalendarImpl} class.
*
* @author dbarashev (Dmitry Barashev)
*/
public class WeekendCalendarImplTest extends TestCase {
static {
new CalendarFactory() {
{
setLocaleApi(new LocaleApi() {
@Override
public Locale getLocale() {
return Locale.US;
}
@Override
public DateFormat getShortDateFormat() {
return DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
}
});
}
};
}
private static List<CalendarEvent> TEST_EVENTS = ImmutableList.of(
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 0, 1).getTime(), true, CalendarEvent.Type.HOLIDAY, "Jan 1", null),
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 1, 14).getTime(), false, CalendarEvent.Type.NEUTRAL, "Feb 14", null),
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 2, 8).getTime(), true, CalendarEvent.Type.HOLIDAY, "Mar 8", null),
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 2, 8).getTime(), false, CalendarEvent.Type.WORKING_DAY, "Mar 8, 2014", null),
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 2, 9).getTime(), false, CalendarEvent.Type.HOLIDAY, "Mar 9, 2014", null),
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 3, 12).getTime(), true, CalendarEvent.Type.WORKING_DAY, "Apr 12", null),
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 3, 12).getTime(), false, CalendarEvent.Type.HOLIDAY, "Apr 12, 2014", null)
);
private static List<CalendarEvent> TEST_EVENTS_RECURRING_FIRST = ImmutableList.of(
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 0, 1).getTime(), true, CalendarEvent.Type.HOLIDAY, "Jan 1", null),
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 2, 8).getTime(), true, CalendarEvent.Type.HOLIDAY, "Mar 8", null),
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 3, 12).getTime(), true, CalendarEvent.Type.WORKING_DAY, "Apr 12", null),
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 1, 14).getTime(), false, CalendarEvent.Type.NEUTRAL, "Feb 14", null),
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 2, 8).getTime(), false, CalendarEvent.Type.WORKING_DAY, "Mar 8, 2014", null),
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 2, 9).getTime(), false, CalendarEvent.Type.HOLIDAY, "Mar 9, 2014", null),
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 3, 12).getTime(), false, CalendarEvent.Type.HOLIDAY, "Apr 12, 2014", null)
);
private static Function<CalendarEvent, String> GET_TITLE = new Function<CalendarEvent, String>() {
@Override
public String apply(CalendarEvent e) {
return e.getTitle();
}
};
public void testSetEvents() {
WeekendCalendarImpl calendar = new WeekendCalendarImpl();
calendar.setPublicHolidays(TEST_EVENTS);
assertEquals(TEST_EVENTS_RECURRING_FIRST, calendar.getPublicHolidays());
assertEquals(ImmutableList.of("Jan 1", "Mar 8", "Apr 12", "Feb 14", "Mar 8, 2014", "Mar 9, 2014", "Apr 12, 2014"),
Lists.newArrayList(Collections2.transform(calendar.getPublicHolidays(), GET_TITLE)));
}
public void testRecurringHoliday() {
WeekendCalendarImpl calendar = new WeekendCalendarImpl();
calendar.setPublicHolidays(TEST_EVENTS);
assertEquals(DayMask.HOLIDAY, calendar.getDayMask(CalendarFactory.createGanttCalendar(2013, 0, 1).getTime()) & DayMask.HOLIDAY);
assertEquals(DayMask.HOLIDAY, calendar.getDayMask(CalendarFactory.createGanttCalendar(2014, 0, 1).getTime()) & DayMask.HOLIDAY);
assertEquals(DayMask.HOLIDAY, calendar.getDayMask(CalendarFactory.createGanttCalendar(2015, 0, 1).getTime()) & DayMask.HOLIDAY);
assertEquals(CalendarEvent.Type.HOLIDAY, calendar.getEvent(CalendarFactory.createGanttCalendar(2015, 0, 1).getTime()).getType());
}
public void testOneOffHoliday() {
WeekendCalendarImpl calendar = new WeekendCalendarImpl();
calendar.setWeekDayType(Calendar.SATURDAY, DayType.WORKING);
calendar.setWeekDayType(Calendar.SUNDAY, DayType.WORKING);
calendar.setPublicHolidays(TEST_EVENTS);
assertEquals(DayMask.WORKING, calendar.getDayMask(CalendarFactory.createGanttCalendar(2013, 3, 12).getTime()) & DayMask.WORKING);
assertEquals(DayMask.HOLIDAY, calendar.getDayMask(CalendarFactory.createGanttCalendar(2014, 3, 12).getTime()) & DayMask.HOLIDAY);
assertEquals(DayMask.WORKING, calendar.getDayMask(CalendarFactory.createGanttCalendar(2015, 3, 12).getTime()) & DayMask.WORKING);
}
public void testOneOffWorking() {
WeekendCalendarImpl calendar = new WeekendCalendarImpl();
calendar.setWeekDayType(Calendar.SATURDAY, DayType.WORKING);
calendar.setWeekDayType(Calendar.SUNDAY, DayType.WORKING);
calendar.setPublicHolidays(TEST_EVENTS);
assertEquals(DayMask.HOLIDAY, calendar.getDayMask(CalendarFactory.createGanttCalendar(2013, 2, 8).getTime()) & DayMask.HOLIDAY);
assertEquals(DayMask.WORKING, calendar.getDayMask(CalendarFactory.createGanttCalendar(2014, 2, 8).getTime()) & DayMask.WORKING);
assertEquals(DayMask.HOLIDAY, calendar.getDayMask(CalendarFactory.createGanttCalendar(2015, 2, 8).getTime()) & DayMask.HOLIDAY);
}
public void testOneOffWorkingWeekend() {
WeekendCalendarImpl calendar = new WeekendCalendarImpl();
calendar.setPublicHolidays(ImmutableList.of(
CalendarEvent.newEvent(CalendarFactory.createGanttCalendar(2014, 0, 4).getTime(), false, CalendarEvent.Type.WORKING_DAY, "Jan 4, Saturday", null)
));
assertEquals(DayMask.WORKING, calendar.getDayMask(CalendarFactory.createGanttCalendar(2014, 0, 4).getTime()) & DayMask.WORKING);
assertEquals(0, calendar.getDayMask(CalendarFactory.createGanttCalendar(2014, 0, 11).getTime()) & DayMask.WORKING);
assertEquals(DayMask.WEEKEND, calendar.getDayMask(CalendarFactory.createGanttCalendar(2014, 0, 11).getTime()) & DayMask.WEEKEND);
}
}