/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jbpm.jbpm1776;
import java.util.Calendar;
import java.util.Date;
import org.jbpm.AbstractJbpmTestCase;
import org.jbpm.calendar.BusinessCalendar;
import org.jbpm.calendar.Duration;
/**
* Business time subtraction delivers unexpected results.
*
* @see <a href="https://jira.jboss.org/browse/JBPM-1776">JBPM-1776</a>
* @author Alejandro Guizar
*/
public class BusinessTimeSubstractionTest extends AbstractJbpmTestCase {
static BusinessCalendar businessCalendar = new BusinessCalendar();
public void testNonBusinessSecondSubtraction() {
Calendar calendar = Calendar.getInstance();
calendar.set(2005, Calendar.APRIL, 7, 10, 30, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.add(Calendar.SECOND, -20);
Date expected = calendar.getTime();
Date actual = businessCalendar.add(start, new Duration("-20 seconds"));
assertEquals(expected, actual);
}
public void testNonBusinessMinuteSubtraction() {
Calendar calendar = Calendar.getInstance();
calendar.set(2005, Calendar.APRIL, 7, 11, 55, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.add(Calendar.MINUTE, -10);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-10 minutes")));
}
public void testNonBusinessFractionalDurationSubtraction() {
Calendar calendar = Calendar.getInstance();
calendar.set(2008, Calendar.FEBRUARY, 5, 6, 30, 45);
calendar.set(Calendar.MILLISECOND, 125);
Date start = calendar.getTime();
calendar.add(Calendar.HOUR, -7);
calendar.add(Calendar.MINUTE, -45);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-7.75 hours")));
}
public void testNonBusinessDaySubtraction() {
Calendar calendar = Calendar.getInstance();
calendar.set(2005, Calendar.FEBRUARY, 5, 6, 30, 45);
calendar.set(Calendar.MILLISECOND, 125);
Date start = calendar.getTime();
calendar.add(Calendar.DAY_OF_MONTH, -10);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-10 days")));
}
public void testNonBusinessWeekSubtraction() {
Calendar calendar = Calendar.getInstance();
calendar.set(2008, Calendar.FEBRUARY, 5, 6, 30, 45);
calendar.set(Calendar.MILLISECOND, 125);
Date start = calendar.getTime();
calendar.add(Calendar.WEEK_OF_YEAR, -5);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-5 weeks")));
}
public void testNonBusinessMonthSubtraction() {
Calendar calendar = Calendar.getInstance();
calendar.set(2008, Calendar.FEBRUARY, 5, 6, 30, 45);
calendar.set(Calendar.MILLISECOND, 125);
Date start = calendar.getTime();
calendar.add(Calendar.MONTH, -3);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-3 months")));
}
public void testNonBusinessYearSubtraction() {
Calendar calendar = Calendar.getInstance();
calendar.set(2008, Calendar.FEBRUARY, 5, 6, 30, 45);
calendar.set(Calendar.MILLISECOND, 125);
Date start = calendar.getTime();
calendar.add(Calendar.YEAR, -1);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-1 year")));
}
public void testBusinessDurationSubtractionOverBusinessTime() {
Calendar calendar = Calendar.getInstance();
calendar.set(2005, Calendar.APRIL, 7, 11, 55, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.add(Calendar.MINUTE, -1);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-1 business minute")));
}
public void testBusinessDurationSubtractionOverLunchBreak() {
Calendar calendar = Calendar.getInstance();
calendar.set(2005, Calendar.APRIL, 7, 12, 35, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.add(Calendar.MINUTE, -10);
// lunch break spans 30 minutes
calendar.add(Calendar.MINUTE, -30);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-10 business minutes")));
}
public void testBusinessDurationSubtractionOverDayBreak() {
Calendar calendar = Calendar.getInstance();
calendar.set(2005, Calendar.APRIL, 8, 9, 5, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.add(Calendar.MINUTE, -10);
// there are 16 hours between 17:00 and 9:00
calendar.add(Calendar.HOUR, -16);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-10 business minutes")));
}
public void testBusinessDurationSubtractionOverHoliday() {
Calendar calendar = Calendar.getInstance();
calendar.set(2010, Calendar.NOVEMBER, 12, 9, 5, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.add(Calendar.MINUTE, -10);
// there are 16 hours between 17:00 and 9:00
calendar.add(Calendar.HOUR, -16);
// holiday
calendar.add(Calendar.DAY_OF_MONTH, -1);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-10 business minutes")));
}
public void testBusinessDurationSubtractionOverWeekend() {
Calendar calendar = Calendar.getInstance();
calendar.set(2005, Calendar.APRIL, 11, 9, 5, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.add(Calendar.MINUTE, -10);
// there are 16 hours between 17:00 and 9:00
calendar.add(Calendar.HOUR, -16);
// weekend
calendar.add(Calendar.DAY_OF_MONTH, -2);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-10 business minutes")));
}
public void testTwoBusinessHoursOverLunch() {
Calendar calendar = Calendar.getInstance();
calendar.set(2005, Calendar.APRIL, 7, 13, 45, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.add(Calendar.HOUR, -2);
// lunch break spans 30 minutes
calendar.add(Calendar.MINUTE, -30);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-2 business hours")));
}
public void testBusinessDurationSubtractionOutsideBusinessHours() {
Calendar calendar = Calendar.getInstance();
calendar.set(2005, Calendar.APRIL, 8, 12, 15, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.add(Calendar.MINUTE, -30);
// lunch break ends at 12:30
calendar.add(Calendar.MINUTE, -15);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-30 business minutes")));
}
public void testBusinessDurationSubtractionOutsideBusinessHoursOverWeekend() {
Calendar calendar = Calendar.getInstance();
calendar.set(2005, Calendar.APRIL, 11, 12, 15, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.add(Calendar.HOUR, -5);
// lunch break ends at 12:30
calendar.add(Calendar.MINUTE, -15);
// there are 16 hours between 17:00 and 9:00
calendar.add(Calendar.HOUR, -16);
// weekend
calendar.add(Calendar.DAY_OF_MONTH, -2);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-5 business hours")));
}
public void testBusinessDaySubtraction() {
Calendar calendar = Calendar.getInstance();
calendar.set(2005, Calendar.FEBRUARY, 21, 9, 30, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.set(Calendar.DAY_OF_MONTH, 7);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-10 business days")));
}
public void testBusinessWeekSubtraction() {
Calendar calendar = Calendar.getInstance();
calendar.set(2005, Calendar.MARCH, 14, 9, 30, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.set(Calendar.MONTH, Calendar.FEBRUARY);
calendar.set(Calendar.DAY_OF_MONTH, 7);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-5 business weeks")));
}
public void testBusinessMonthSubtraction() {
Calendar calendar = Calendar.getInstance();
calendar.set(2010, Calendar.MAY, 4, 9, 30, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.set(Calendar.MONTH, Calendar.FEBRUARY);
calendar.set(Calendar.DAY_OF_MONTH, 3);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-3 business months")));
}
public void testBusinessYearSubtraction() {
Calendar calendar = Calendar.getInstance();
calendar.set(2010, Calendar.DECEMBER, 28, 9, 30, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date start = calendar.getTime();
calendar.set(Calendar.YEAR, 2009);
Date expected = calendar.getTime();
assertEquals(expected, businessCalendar.add(start, new Duration("-1 business year")));
}
}