/*
* This file is part of LibrePlan
*
* Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e
* Desenvolvemento Tecnolóxico de Galicia
* Copyright (C) 2010-2011 Igalia, S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.libreplan.business.test.orders.entities;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
import static org.libreplan.business.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_FILE;
import static org.libreplan.business.test.BusinessGlobalNames.BUSINESS_SPRING_CONFIG_TEST_FILE;
import java.math.BigDecimal;
import javax.annotation.Resource;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.libreplan.business.IDataBootstrap;
import org.libreplan.business.orders.entities.HoursGroup;
import org.libreplan.business.orders.entities.OrderLine;
import org.libreplan.business.orders.entities.OrderLineGroup;
import org.libreplan.business.test.planner.entities.TaskTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
/**
* Tests for {@link OrderLine}.
* <br />
* @author Manuel Rego Casasnovas <mrego@igalia.com>
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, BUSINESS_SPRING_CONFIG_TEST_FILE })
public class OrderLineTest {
@Resource
private IDataBootstrap defaultAdvanceTypesBootstrapListener;
@Before
public void loadRequiredData() {
defaultAdvanceTypesBootstrapListener.loadRequiredData();
}
@Test
@Transactional
public void parentPropertyMustBeSetWhenAddingOrderLineToContainer() {
OrderLineGroup orderLineGroup = OrderLineGroup.create();
orderLineGroup.useSchedulingDataFor(TaskTest.mockOrderVersion());
OrderLine orderLine = OrderLine.create();
orderLineGroup.add(orderLine);
assertThat(orderLine.getParent(), equalTo(orderLineGroup));
}
/**
* An empty {@link OrderLine} without any {@link HoursGroup}.
* Trying to set work hours of {@link OrderLine} to 100h.
* Expected: {@link OrderLine} with 100h, with one {@link HoursGroup} with 100h NO_FIXED.
*/
@Test
@Transactional
public void testSetWorkHoursHoursEmptyOrderLine() {
OrderLine orderLine = OrderLine.create();
assertThat(orderLine.getWorkHours(), equalTo(0));
try {
orderLine.setWorkHours(100);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(100));
assertThat(orderLine.getHoursGroups().size(), equalTo(1));
HoursGroup hoursGroup = orderLine.getHoursGroups().get(0);
assertThat(hoursGroup.getWorkingHours(), equalTo(100));
assertThat(hoursGroup.getPercentage(), equalTo(new BigDecimal(1).setScale(2)));
assertFalse(hoursGroup.isFixedPercentage());
}
/**
* An empty {@link OrderLine} without any {@link HoursGroup}.
* Trying to set work hours of {@link OrderLine} to -100h.
* Expected: Exception.
*/
@Test
@Transactional
public void testSetWorkHoursHoursEmptyOrderLineIllegal() {
OrderLine orderLine = OrderLine.create();
assertThat(orderLine.getWorkHours(), equalTo(0));
try {
orderLine.setWorkHours(-100);
fail("It should throw an exception");
} catch (IllegalArgumentException ignored) {
// Ok
}
assertThat(orderLine.getWorkHours(), equalTo(0));
assertThat(orderLine.getHoursGroups().size(), equalTo(0));
}
/**
* An {@link OrderLine} with just one {@link HoursGroup} of 100h NO_FIXED.
* Trying to set work hours of {@link OrderLine} to 120h.
* Expected: {@link OrderLine} with 120h, {@link HoursGroup} with 120h.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupNoFixedIncreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(100);
orderLine.addHoursGroup(hoursGroup);
assertThat(orderLine.getWorkHours(), equalTo(100));
try {
orderLine.setWorkHours(120);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(120));
assertThat(orderLine.getHoursGroups().size(), equalTo(1));
assertThat(hoursGroup.getWorkingHours(), equalTo(120));
}
/**
* An {@link OrderLine} with just one {@link HoursGroup} of 100h NO_FIXED.
* Trying to set work hours of {@link OrderLine} to 75h.
* Expected: {@link OrderLine} with 75h, {@link HoursGroup} with 75h.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupNoFixedDecreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(100);
orderLine.addHoursGroup(hoursGroup);
assertThat(orderLine.getWorkHours(), equalTo(100));
try {
orderLine.setWorkHours(75);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(75));
assertThat(orderLine.getHoursGroups().size(), equalTo(1));
assertThat(hoursGroup.getWorkingHours(), equalTo(75));
}
/**
* An {@link OrderLine} with just one {@link HoursGroup} of 100h 100% FIXED_PERCENTAGE.
* Trying to set work hours of {@link OrderLine} to 120h.
* Expected: {@link OrderLine} with 120h, {@link HoursGroup} with 120h 100%.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupFixedPercentageIncreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(100);
orderLine.addHoursGroup(hoursGroup);
hoursGroup.setFixedPercentage(true);
hoursGroup.setPercentage(new BigDecimal(1).setScale(2));
assertThat(orderLine.getWorkHours(), equalTo(100));
try {
orderLine.setWorkHours(120);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(120));
assertThat(orderLine.getHoursGroups().size(), equalTo(1));
assertThat(hoursGroup.getWorkingHours(), equalTo(120));
assertThat(hoursGroup.getPercentage(), equalTo(new BigDecimal(1).setScale(2)));
}
/**
* An {@link OrderLine} with just one {@link HoursGroup} of 100h 100% FIXED_PERCENTAGE.
* Trying to set work hours of {@link OrderLine} to 75h.
* Expected: {@link OrderLine} with 100h, {@link HoursGroup} with 75h 100%.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupFixedPercentageDecreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(100);
orderLine.addHoursGroup(hoursGroup);
hoursGroup.setFixedPercentage(true);
hoursGroup.setPercentage(new BigDecimal(1).setScale(2));
assertThat(orderLine.getWorkHours(), equalTo(100));
try {
orderLine.setWorkHours(75);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(75));
assertThat(orderLine.getHoursGroups().size(), equalTo(1));
assertThat(hoursGroup.getWorkingHours(), equalTo(75));
assertThat(hoursGroup.getPercentage(), equalTo(new BigDecimal(1).setScale(2)));
}
/**
* An {@link OrderLine} with two {@link HoursGroup} of 100h and 50h NO_FIXED.
* Trying to set work hours of {@link OrderLine} to 200h.
* Expected: {@link OrderLine} with 200h, {@link HoursGroup} with 133h and HoursGroup with 66h.
*/
@Test
@Transactional
public void testSetWorkHoursTwoHoursGroupNoFixedIncreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(100);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(50);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
assertThat(orderLine.getWorkHours(), equalTo(150));
try {
orderLine.setWorkHours(200);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(200));
assertThat(orderLine.getHoursGroups().size(), equalTo(3));
assertThat(hoursGroup.getWorkingHours(), equalTo(133));
assertThat(hoursGroup2.getWorkingHours(), equalTo(66));
}
/**
* An {@link OrderLine} with two {@link HoursGroup} of 100h and 50h NO_FIXED.
* Trying to set work hours of {@link OrderLine} to 50h.
* Expected: {@link OrderLine} with 50h, {@link HoursGroup} with 33h and {@link HoursGroup} with 16h.
*/
@Test
@Transactional
public void testSetWorkHoursTwoHoursGroupNoFixedDecreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(100);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(50);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
assertThat(orderLine.getWorkHours(), equalTo(150));
try {
orderLine.setWorkHours(50);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(50));
assertThat(orderLine.getHoursGroups().size(), equalTo(3));
assertThat(hoursGroup.getWorkingHours(), equalTo(33));
assertThat(hoursGroup2.getWorkingHours(), equalTo(16));
}
/**
* An {@link OrderLine} with two {@link HoursGroup} of 75h 75% FIXED_PERCENTAGE and 25h NO_FIXED.
* Trying to set work hours of {@link OrderLine} to 200h.
* Expected: {@link OrderLine} with 200h, {@link HoursGroup} with 150h 75% and {@link HoursGroup} with 50h.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupFixedPercentageAndHoursGroupNoFixedIncreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(75);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(25);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
hoursGroup.setFixedPercentage(true);
hoursGroup.setPercentage(new BigDecimal(0.75).setScale(2));
assertThat(orderLine.getWorkHours(), equalTo(100));
try {
orderLine.setWorkHours(200);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(200));
assertThat(orderLine.getHoursGroups().size(), equalTo(2));
assertThat(hoursGroup.getWorkingHours(), equalTo(150));
assertThat(hoursGroup.getPercentage(), equalTo(new BigDecimal(0.75).setScale(2)));
assertThat(hoursGroup2.getWorkingHours(), equalTo(50));
}
/**
* An {@link OrderLine} with two {@link HoursGroup} of 75h 75% FIXED_PERCENTAGE and 25h NO_FIXED.
* Trying to set work hours of {@link OrderLine} to 50h.
* Expected: {@link OrderLine} with 50h, {@link HoursGroup} with 37h 75% and HoursGroup with 13h.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupFixedPercentageAndHoursGroupNoFixedDecreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(75);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(25);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
hoursGroup.setFixedPercentage(true);
hoursGroup.setPercentage(new BigDecimal(0.75).setScale(2));
assertThat(orderLine.getWorkHours(), equalTo(100));
try {
orderLine.setWorkHours(50);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(50));
assertThat(orderLine.getHoursGroups().size(), equalTo(2));
assertThat(hoursGroup.getWorkingHours(), equalTo(37));
assertThat(hoursGroup.getPercentage(), equalTo(new BigDecimal(0.75).setScale(2)));
assertThat(hoursGroup2.getWorkingHours(), equalTo(13));
}
/**
* An {@link OrderLine} with two {@link HoursGroup} of 75h 75% and 25h 25% FIXED_PERCENTAGE.
* Trying to set work hours of {@link OrderLine} to 200h.
* Expected: {@link OrderLine} with 200h, {@link HoursGroup} with 150h 75% and {@link HoursGroup} with 50h 25%.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupFixedPercentageAndHoursGroupFixedPercentageIncreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(75);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(25);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
hoursGroup.setFixedPercentage(true);
hoursGroup2.setFixedPercentage(true);
hoursGroup.setPercentage(new BigDecimal(0.75).setScale(2));
hoursGroup2.setPercentage(new BigDecimal(0.25).setScale(2));
assertThat(orderLine.getWorkHours(), equalTo(100));
try {
orderLine.setWorkHours(200);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(200));
assertThat(orderLine.getHoursGroups().size(), equalTo(2));
assertThat(hoursGroup.getWorkingHours(), equalTo(150));
assertThat(hoursGroup.getPercentage(), equalTo(new BigDecimal(0.75).setScale(2)));
assertThat(hoursGroup2.getWorkingHours(), equalTo(50));
assertThat(hoursGroup2.getPercentage(), equalTo(new BigDecimal(0.25).setScale(2)));
}
/**
* An {@link OrderLine} with two {@link HoursGroup} of 75h 75% and 25h 25% FIXED_PERCENTAGE.
* Trying to set work hours of {@link OrderLine} to 80h.
* Expected: {@link OrderLine} with 80h, {@link HoursGroup} with 60h 75% and {@link HoursGroup} with 20h 25%.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupFixedPercentageAndHoursGroupFixedPercentageDecreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(75);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(25);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
hoursGroup.setFixedPercentage(true);
hoursGroup.setPercentage(new BigDecimal(0.75).setScale(2));
hoursGroup2.setFixedPercentage(true);
hoursGroup2.setPercentage(new BigDecimal(0.25).setScale(2));
assertThat(orderLine.getWorkHours(), equalTo(100));
try {
orderLine.setWorkHours(80);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(80));
assertThat(orderLine.getHoursGroups().size(), equalTo(2));
assertThat(hoursGroup.getWorkingHours(), equalTo(60));
assertThat(hoursGroup.getPercentage(), equalTo(new BigDecimal(0.75).setScale(2)));
assertThat(hoursGroup2.getWorkingHours(), equalTo(20));
assertThat(hoursGroup2.getPercentage(), equalTo(new BigDecimal(0.25).setScale(2)));
}
/**
* An {@link OrderLine} with three {@link HoursGroup} of 50h, 50h NO_FIXED and 100h 50% FIXED_PERCENTAGE.
* Trying to set work hours of {@link OrderLine} to 300h.
* Expected: {@link OrderLine} with 300h, {@link HoursGroup} with 75h, {@link HoursGroup} with 75h and {@link HoursGroup} with 150h 50%.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupNoFixedAndHoursGroupNoFixedAndHoursGroupFixedPercentageIncreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(50);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(50);
HoursGroup hoursGroup3 = HoursGroup.create(orderLine);
hoursGroup3.setWorkingHours(100);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
orderLine.addHoursGroup(hoursGroup3);
hoursGroup3.setFixedPercentage(true);
hoursGroup3.setPercentage(new BigDecimal(0.50).setScale(2));
assertThat(orderLine.getWorkHours(), equalTo(200));
try {
orderLine.setWorkHours(300);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(300));
assertThat(orderLine.getHoursGroups().size(), equalTo(3));
assertThat(hoursGroup.getWorkingHours(), equalTo(75));
assertThat(hoursGroup2.getWorkingHours(), equalTo(75));
assertThat(hoursGroup3.getWorkingHours(), equalTo(150));
assertThat(hoursGroup3.getPercentage(), equalTo(new BigDecimal(0.50).setScale(2)));
}
/**
* An {@link OrderLine} with three {@link HoursGroup} of 40h, 60h NO_FIXED and 100h 50% FIXED_PERCENTAGE.
* Trying to set work hours of {@link OrderLine} to 100h.
* Expected: {@link OrderLine} with 100h. {@link HoursGroup} with 20h, {@link HoursGroup} with 30h and {@link HoursGroup} with 50h 50%.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupNoFixedAndHoursGroupNoFixedAndHoursGroupFixedPercentageDecreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(40);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(60);
HoursGroup hoursGroup3 = HoursGroup.create(orderLine);
hoursGroup3.setWorkingHours(100);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
orderLine.addHoursGroup(hoursGroup3);
hoursGroup3.setFixedPercentage(true);
hoursGroup3.setPercentage(new BigDecimal(0.50).setScale(2));
assertThat(orderLine.getWorkHours(), equalTo(200));
try {
orderLine.setWorkHours(100);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(100));
assertThat(orderLine.getHoursGroups().size(), equalTo(3));
assertThat(hoursGroup.getWorkingHours(), equalTo(20));
assertThat(hoursGroup2.getWorkingHours(), equalTo(30));
assertThat(hoursGroup3.getWorkingHours(), equalTo(50));
assertThat(hoursGroup3.getPercentage(), equalTo(new BigDecimal(0.50).setScale(2)));
}
/**
* An {@link OrderLine} with three {@link HoursGroup} of 50h NO_FIXED, 50h 25% and 100h 50% FIXED_PERCENTAGE.
* Trying to set work hours of {@link OrderLine} to 400h.
* Expected: {@link OrderLine} with 400h,
* {@link HoursGroup} with 100h, {@link HoursGroup} with 100h 25% and {@link HoursGroup} with 200h 50%.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupNoFixedAndHoursGroupFixedPercentageAndHoursGroupFixedPercentageIncreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(50);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(50);
HoursGroup hoursGroup3 = HoursGroup.create(orderLine);
hoursGroup3.setWorkingHours(100);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
orderLine.addHoursGroup(hoursGroup3);
hoursGroup2.setFixedPercentage(true);
hoursGroup2.setPercentage(new BigDecimal(0.25).setScale(2));
hoursGroup3.setFixedPercentage(true);
hoursGroup3.setPercentage(new BigDecimal(0.50).setScale(2));
assertThat(orderLine.getWorkHours(), equalTo(200));
try {
orderLine.setWorkHours(400);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(400));
assertThat(orderLine.getHoursGroups().size(), equalTo(3));
assertThat(hoursGroup.getWorkingHours(), equalTo(100));
assertThat(hoursGroup2.getWorkingHours(), equalTo(100));
assertThat(hoursGroup2.getPercentage(), equalTo(new BigDecimal(0.25).setScale(2)));
assertThat(hoursGroup3.getWorkingHours(), equalTo(200));
assertThat(hoursGroup3.getPercentage(), equalTo(new BigDecimal(0.50).setScale(2)));
}
/**
* An {@link OrderLine} with three {@link HoursGroup} of 50h NO_FIXED, 50h 25% and 100h 50% FIXED_PERCENTAGE.
* Trying to set work hours of {@link OrderLine} to 100h.
* Expected: {@link OrderLine} with 400h,
* {@link HoursGroup} with 25h, {@link HoursGroup} with 25h 25% and {@link HoursGroup} with 50h 50%.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupNoFixedAndHoursGroupFixedPercentageAndHoursGroupFixedPercentageDecreaseValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(50);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(50);
HoursGroup hoursGroup3 = HoursGroup.create(orderLine);
hoursGroup3.setWorkingHours(100);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
orderLine.addHoursGroup(hoursGroup3);
hoursGroup2.setFixedPercentage(true);
hoursGroup2.setPercentage(new BigDecimal(0.25).setScale(2));
hoursGroup3.setFixedPercentage(true);
hoursGroup3.setPercentage(new BigDecimal(0.50).setScale(2));
assertThat(orderLine.getWorkHours(), equalTo(200));
try {
orderLine.setWorkHours(100);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(100));
assertThat(orderLine.getHoursGroups().size(), equalTo(3));
assertThat(hoursGroup.getWorkingHours(), equalTo(25));
assertThat(hoursGroup2.getWorkingHours(), equalTo(25));
assertThat(hoursGroup2.getPercentage(), equalTo(new BigDecimal(0.25).setScale(2)));
assertThat(hoursGroup3.getWorkingHours(), equalTo(50));
assertThat(hoursGroup3.getPercentage(), equalTo(new BigDecimal(0.50).setScale(2)));
}
/**
* An {@link OrderLine} with two {@link HoursGroup} of 0h NO_FIXED.
* Trying to set work hours of {@link OrderLine} to 200h.
* Expected: {@link OrderLine} with 200h, {@link HoursGroup} with 100h and {@link HoursGroup} with 100h.
*/
@Test
@Transactional
public void testSetWorkHoursHoursGroupNoFixedZeroValue() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(0);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(0);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
assertThat(orderLine.getWorkHours(), equalTo(0));
try {
orderLine.setWorkHours(200);
} catch (IllegalArgumentException e) {
fail("It should not throw an exception");
}
assertThat(orderLine.getWorkHours(), equalTo(200));
assertThat(orderLine.getHoursGroups().size(), equalTo(2));
assertThat(hoursGroup.getWorkingHours(), equalTo(100));
assertThat(hoursGroup2.getWorkingHours(), equalTo(100));
}
@Test
@Transactional
public void testAddNewEmptyHoursGroup() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
orderLine.addHoursGroup(hoursGroup);
assertThat(orderLine.getWorkHours(), equalTo(0));
assertThat(orderLine.getHoursGroups().size(), equalTo(1));
}
@Test
@Transactional
public void testSetWorkingHoursIllegal() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
try {
hoursGroup.setWorkingHours(-50);
fail("It should throw an exception");
} catch (IllegalArgumentException ignored) {
// Ok
}
}
@Test
@Transactional
public void testSetPercentageIllegal() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(50);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(150);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
assertThat(orderLine.getWorkHours(), equalTo(200));
hoursGroup.setFixedPercentage(true);
hoursGroup.setPercentage(new BigDecimal(0.5).setScale(2));
orderLine.recalculateHoursGroups();
hoursGroup2.setFixedPercentage(true);
try {
hoursGroup2.setPercentage(new BigDecimal(0.75).setScale(2));
fail("It should throw an exception");
} catch (IllegalArgumentException ignored) {
// Ok
}
}
@Test
@Transactional
public void testSetPercentageTwoHoursGroupIncrease() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(50);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(150);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
assertThat(orderLine.getWorkHours(), equalTo(200));
hoursGroup.setFixedPercentage(true);
hoursGroup.setPercentage(new BigDecimal(0.5).setScale(2));
orderLine.recalculateHoursGroups();
assertThat(orderLine.getWorkHours(), equalTo(200));
assertThat(orderLine.getHoursGroups().size(), equalTo(2));
assertThat(hoursGroup.getWorkingHours(), equalTo(100));
assertThat(hoursGroup2.getWorkingHours(), equalTo(100));
}
@Test
@Transactional
public void testSetPercentageTwoHoursGroupDecrease() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(50);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(100);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
assertThat(orderLine.getWorkHours(), equalTo(150));
hoursGroup.setFixedPercentage(true);
hoursGroup.setPercentage(new BigDecimal(0.25).setScale(2));
orderLine.recalculateHoursGroups();
assertThat(orderLine.getWorkHours(), equalTo(150));
assertThat(orderLine.getHoursGroups().size(), equalTo(2));
assertThat(hoursGroup.getWorkingHours(), equalTo(37));
assertThat(hoursGroup2.getWorkingHours(), equalTo(113));
}
@Test
@Transactional
public void testSetPercentageThreeHoursGroupIncrease() {
OrderLine orderLine = OrderLine.create();
HoursGroup hoursGroup = HoursGroup.create(orderLine);
hoursGroup.setWorkingHours(50);
HoursGroup hoursGroup2 = HoursGroup.create(orderLine);
hoursGroup2.setWorkingHours(150);
HoursGroup hoursGroup3 = HoursGroup.create(orderLine);
hoursGroup3.setWorkingHours(200);
orderLine.addHoursGroup(hoursGroup);
orderLine.addHoursGroup(hoursGroup2);
orderLine.addHoursGroup(hoursGroup3);
assertThat(orderLine.getWorkHours(), equalTo(400));
hoursGroup.setFixedPercentage(true);
hoursGroup.setPercentage(new BigDecimal(0.5).setScale(2));
orderLine.recalculateHoursGroups();
assertThat(orderLine.getWorkHours(), equalTo(400));
assertThat(orderLine.getHoursGroups().size(), equalTo(4));
assertThat(hoursGroup.getWorkingHours(), equalTo(200));
assertThat(hoursGroup2.getWorkingHours(), equalTo(85));
assertThat(hoursGroup3.getWorkingHours(), equalTo(114));
}
@Test
@Transactional
public void createOrderLineWithAnHoursGroupTakingAll() {
int[] hoursValues = { 0, 100, 10, 30 };
for (int hours : hoursValues) {
OrderLine orderLine = OrderLine.createOrderLineWithUnfixedPercentage(hours);
assertThat(orderLine.getWorkHours(), equalTo(hours));
assertThat(orderLine.getHoursGroups().size(), equalTo(1));
orderLine.setWorkHours(20);
assertThat(orderLine.getWorkHours(), equalTo(20));
assertThat(orderLine.getHoursGroups().size(), equalTo(1));
}
}
}