/* * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. * If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2014, MPL CodeInside http://codeinside.ru */ package ru.codeinside.calendar; import com.google.common.collect.ImmutableSet; import org.junit.Test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Set; import static org.junit.Assert.assertEquals; public class BusinessCalendarDueDateCalculatorTest { final Set<Date> emptyDates = ImmutableSet.of(); final BusinessCalendarDueDateCalculator generalCalendar = new BusinessCalendarDueDateCalculator(emptyDates, emptyDates); final SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); final SimpleDateFormat dayFormat = new SimpleDateFormat("dd/MM/yyyy"); private Date asDate(String str) { try { return dateFormat.parse(str); } catch (ParseException e) { throw new IllegalStateException(e); } } private Date asDay(String str) { try { return dayFormat.parse(str); } catch (ParseException e) { throw new IllegalStateException(e); } } @Test(expected = IllegalArgumentException.class) public void date_must_not_null() { generalCalendar.calculate(null, 0); } @Test(expected = IllegalArgumentException.class) public void duration_must_more_than_zero() { generalCalendar.calculate(new Date(), -1); } @Test public void zero_period() { Date start = asDate("22/07/2014 10:50:31"); assertEquals(start, generalCalendar.calculate(start, 0)); assertEquals(0, generalCalendar.countDays(start, start)); assertEquals(0, generalCalendar.countDays(start, asDate("23/07/2014 10:50:30"))); assertEquals(1, generalCalendar.countDays(start, asDate("23/07/2014 10:50:31"))); assertEquals(-1, generalCalendar.countDays(asDate("23/07/2014 10:50:32"), start)); } @Test public void end_period_over_weekend() { Date start = asDate("22/07/2014 10:50:31"); Date end = asDate("05/08/2014 10:50:31"); assertEquals(end, generalCalendar.calculate(start, 10)); assertEquals(10, generalCalendar.countDays(start, end)); assertEquals(9, generalCalendar.countDays(start, asDate("05/08/2014 10:50:30"))); assertEquals(10, generalCalendar.countDays(start, asDate("05/08/2014 10:50:32"))); assertEquals(10, generalCalendar.countDays(start, asDate("06/08/2014 10:50:30"))); } @Test public void end_period_over_weekend_and_start_in_weekend() { Date start = asDate("04/01/2014 23:30:01"); Date end = asDate("17/01/2014 23:30:01"); assertEquals(end, generalCalendar.calculate(start, 10)); assertEquals(10, generalCalendar.countDays(start, end)); assertEquals(9, generalCalendar.countDays(start, asDate("17/01/2014 23:30:00"))); assertEquals(10, generalCalendar.countDays(start, asDate("17/01/2014 23:30:02"))); } @Test public void end_period_over_weekend_and_period_contain_holiday() { ImmutableSet<Date> holidays = ImmutableSet.of(asDay("06/01/2014")); BusinessCalendarDueDateCalculator calendar = new BusinessCalendarDueDateCalculator(emptyDates, holidays); Date start = asDate("04/01/2014 23:30:01"); Date end = asDate("20/01/2014 23:30:01"); assertEquals(end, calendar.calculate(start, 10)); assertEquals(10, calendar.countDays(start, end)); assertEquals(9, calendar.countDays(start, asDate("20/01/2014 23:30:00"))); assertEquals(10, calendar.countDays(start, asDate("20/01/2014 23:30:02"))); } @Test public void end_period_over_weekend_and_period_contain_holiday_additional_workday() { ImmutableSet<Date> workdays = ImmutableSet.of(asDay("05/01/2014")); ImmutableSet<Date> holidays = ImmutableSet.of(asDay("06/01/2014")); BusinessCalendarDueDateCalculator calendar = new BusinessCalendarDueDateCalculator(workdays, holidays); Date start = asDate("04/01/2014 23:30:01"); Date end = asDate("17/01/2014 23:30:01"); assertEquals(end, calendar.calculate(start, 10)); assertEquals(10, calendar.countDays(start, end)); assertEquals(9, calendar.countDays(start, asDate("17/01/2014 23:30:00"))); assertEquals(10, calendar.countDays(start, asDate("17/01/2014 23:30:02"))); } }