/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jbpm.process.core.timer; import static org.junit.Assert.assertEquals; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Properties; import java.util.concurrent.TimeUnit; import org.kie.api.time.SessionPseudoClock; import org.jbpm.test.util.AbstractBaseTest; import org.junit.Test; import org.slf4j.LoggerFactory; public class BusinessCalendarImplTest extends AbstractBaseTest { public void addLogger() { logger = LoggerFactory.getLogger(this.getClass()); } @Test public void testCalculateHours() { Properties config = new Properties(); String expectedDate = "2012-05-04 16:45"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-05-04 13:45").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("3h"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateHoursCustomWorkingHours() { Properties config = new Properties(); config.setProperty(BusinessCalendarImpl.HOURS_PER_DAY, "6"); String expectedDate = "2012-05-04 15:45"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-05-03 13:45").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("8h"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateHoursPassingOverWeekend() { Properties config = new Properties(); String expectedDate = "2012-05-07 12:45"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-05-04 13:45").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("7h"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateHoursPassingOverCustomDefinedWeekend() { Properties config = new Properties(); config.setProperty(BusinessCalendarImpl.WEEKEND_DAYS, Calendar.FRIDAY + ","+Calendar.SATURDAY); String expectedDate = "2012-05-06 12:45"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-05-03 13:45").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("7h"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateMinutesPassingOverWeekend() { Properties config = new Properties(); String expectedDate = "2012-05-07 09:15"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-05-04 16:45").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("30m"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateMinutesPassingOverHoliday() { Properties config = new Properties(); config.setProperty(BusinessCalendarImpl.HOLIDAYS, "2012-05-12:2012-05-19"); String expectedDate = "2012-05-21 09:15"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-05-11 16:45").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("30m"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateDays() { Properties config = new Properties(); String expectedDate = "2012-05-14 09:00"; SessionPseudoClock clock = new StaticPseudoClock(parseToDate("2012-05-04").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("6d"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateDaysStartingInWeekend() { Properties config = new Properties(); String expectedDate = "2012-05-09 09:00"; SessionPseudoClock clock = new StaticPseudoClock(parseToDate("2012-05-05").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("2d"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateDaysCustomWorkingDays() { Properties config = new Properties(); config.setProperty(BusinessCalendarImpl.DAYS_PER_WEEK, "4"); config.setProperty(BusinessCalendarImpl.WEEKEND_DAYS, Calendar.FRIDAY + ","+Calendar.SATURDAY + "," +Calendar.SUNDAY); String expectedDate = "2012-05-15 14:30"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-05-03 14:30").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("6d"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateDaysMiddleDay() { Properties config = new Properties(); String expectedDate = "2012-05-11 12:27"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-05-03 12:27").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("6d"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateDaysHoursMinutes() { Properties config = new Properties(); String expectedDate = "2012-05-14 14:20"; SessionPseudoClock clock = new StaticPseudoClock(parseToDate("2012-05-04").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("6d4h80m"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateTimeDaysHoursMinutesHolidays() { Properties config = new Properties(); config.setProperty(BusinessCalendarImpl.HOLIDAYS, "2012-05-10:2012-05-19"); String expectedDate = "2012-05-21 14:20"; SessionPseudoClock clock = new StaticPseudoClock(parseToDate("2012-05-04").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("6d4h80m"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateTimeDaysHoursMinutesSingleDayHolidays() { Properties config = new Properties(); config.setProperty(BusinessCalendarImpl.HOLIDAYS, "2012-05-07"); String expectedDate = "2012-05-08 13:20"; SessionPseudoClock clock = new StaticPseudoClock(parseToDate("2012-05-04").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("1d4h20m"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateTimeDaysHoursMinutesSingleDayHolidaysInMiddleOfWeek() { Properties config = new Properties(); config.setProperty(BusinessCalendarImpl.HOLIDAYS, "2012-05-09"); String expectedDate = "2012-05-10 15:30"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-05-08 11:10").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("1d4h20m"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateDaysPassingOverHolidayAtYearEnd() { Properties config = new Properties(); config.setProperty(BusinessCalendarImpl.HOLIDAYS, "2012-12-31:2013-01-01"); String expectedDate = "2013-01-04 09:15"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-12-28 16:45").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("2d30m"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateDaysPassingOverHolidayAtYearEndWithWildcards() { Properties config = new Properties(); config.setProperty(BusinessCalendarImpl.HOLIDAYS, "*-12-31:*-01-01"); String expectedDate = "2013-01-02 09:15"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-12-28 16:45").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("2d30m"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateISOHours() { Properties config = new Properties(); String expectedDate = "2012-05-04 16:45"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-05-04 13:45").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("PT3H"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateISODaysAndHours() { Properties config = new Properties(); config.setProperty(BusinessCalendarImpl.HOLIDAYS, "2012-05-09"); String expectedDate = "2012-05-10 15:30"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTime("2012-05-08 11:10").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("P1DT4H20M"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testSingleHolidayWithinGivenTime() { final Properties props = new Properties(); props.put(BusinessCalendarImpl.HOLIDAYS, "2015-01-13"); String expectedDate = "2015-01-15 11:38"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTimeAndMillis("2015-01-08 11:38:30.198").getTime()); BusinessCalendarImpl businessCalendarImpl = new BusinessCalendarImpl(props, clock); Date result = businessCalendarImpl.calculateBusinessTimeAsDate("4d"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm", result)); } @Test public void testCalculateMillisecondsAsDefault() { Properties config = new Properties(); String expectedDate = "2012-05-04 16:45:10.000"; SessionPseudoClock clock = new StaticPseudoClock(parseToDateWithTimeAndMillis("2012-05-04 16:45:00.000").getTime()); BusinessCalendarImpl businessCal = new BusinessCalendarImpl(config, clock); Date result = businessCal.calculateBusinessTimeAsDate("10000"); assertEquals(expectedDate, formatDate("yyyy-MM-dd HH:mm:ss.SSS", result)); } private Date parseToDate(String dateString) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date testTime; try { testTime = sdf.parse(dateString); return testTime; } catch (ParseException e) { return null; } } private Date parseToDateWithTime(String dateString) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); Date testTime; try { testTime = sdf.parse(dateString); return testTime; } catch (ParseException e) { return null; } } private Date parseToDateWithTimeAndMillis(String dateString) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); Date testTime; try { testTime = sdf.parse(dateString); return testTime; } catch (ParseException e) { return null; } } private String formatDate(String pattern, Date date) { SimpleDateFormat sdf = new SimpleDateFormat(pattern); String testTime = sdf.format(date); return testTime; } private class StaticPseudoClock implements SessionPseudoClock { private long currentTime; private StaticPseudoClock(long currenttime) { this.currentTime = currenttime; } public long getCurrentTime() { return this.currentTime; } public long advanceTime(long amount, TimeUnit unit) { throw new UnsupportedOperationException("It is static clock and does not allow advance time operation"); } } }