/*
* Copyright 2009-2012 by KNURT Systeme (http://www.knurt.de)
*
* Licensed under the Creative Commons License Attribution-NonCommercial-ShareAlike 3.0 Unported;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://creativecommons.org/licenses/by-nc-sa/3.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 de.knurt.fam.test.unit.db.ibatis;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import de.knurt.fam.core.model.persist.FacilityAvailability;
import de.knurt.fam.core.util.time.FacilityAvailabilityMerger;
import de.knurt.fam.test.utils.FamIBatisTezt;
import de.knurt.fam.test.utils.TeztBeanSimpleFactory;
import de.knurt.heinzelmann.util.time.SimpleTimeFrame;
import de.knurt.heinzelmann.util.time.TimeFrame;
/**
*
* @author Daniel Oltmanns <info@knurt.de>
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/test-dependencies.xml" })
public class FacilityAvailabilityMergerTest extends FamIBatisTezt {
/**
*
*/
@Test
public void facilitiesMergeTest() {
ArrayList<FacilityAvailability> tfs = new ArrayList<FacilityAvailability>();
TimeFrame fromTo = new SimpleTimeFrame(new GregorianCalendar(2008, 0, 1), new GregorianCalendar(2009, 0, 1));
Calendar c1 = new GregorianCalendar(2008, 0, 1);
Calendar c2 = new GregorianCalendar(2008, 2, 1);
FacilityAvailability da1 = new FacilityAvailability("a", c1, c2);
da1.setTimeStampSet(1);
tfs.add(da1);
c1 = new GregorianCalendar(2008, 1, 1);
c2 = new GregorianCalendar(2008, 3, 1);
FacilityAvailability da2 = new FacilityAvailability("b", c1, c2);
da2.setTimeStampSet(2);
tfs.add(da2);
ArrayList<String> priority = new ArrayList<String>();
priority.add("a");
priority.add("b");
List<FacilityAvailability> is = FacilityAvailabilityMerger.getMergedByFacilities(tfs, fromTo, priority);
assertEquals(2, is.size());
assertEquals(0, is.get(0).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(1, is.get(0).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
assertEquals(1, is.get(1).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(3, is.get(1).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
priority = new ArrayList<String>();
priority.add("b");
priority.add("a");
is = FacilityAvailabilityMerger.getMergedByFacilities(tfs, fromTo, priority);
assertEquals(2, is.size());
assertEquals(0, is.get(1).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(2, is.get(1).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
assertEquals(2, is.get(0).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(3, is.get(0).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
}
/**
*
*/
@Test
public void timeIteratorMergeTest() {
ArrayList<FacilityAvailability> tfs = new ArrayList<FacilityAvailability>();
TimeFrame fromTo = new SimpleTimeFrame(new GregorianCalendar(2008, 0, 1), new GregorianCalendar(2009, 0, 1));
List<FacilityAvailability> is = FacilityAvailabilityMerger.getMergedByTimeStampSet(tfs, fromTo);
assertEquals(0, tfs.size());
String facilityKey = "doesnotmatter";
Calendar c1 = new GregorianCalendar(2008, 0, 2);
Calendar c2 = new GregorianCalendar(2008, 0, 3);
FacilityAvailability da1 = new FacilityAvailability(facilityKey, c1, c2);
da1.setMonthly();
da1.setTimeStampSet(1);
tfs.add(da1);
is = FacilityAvailabilityMerger.getMergedByTimeStampSet(tfs, fromTo);
assertEquals(12, is.size());
c1 = new GregorianCalendar(2008, 1, 1);
c2 = new GregorianCalendar(2008, 6, 5);
FacilityAvailability da2 = new FacilityAvailability(facilityKey, c1, c2);
da2.setTimeStampSet(2);
tfs.add(da2);
is = FacilityAvailabilityMerger.getMergedByTimeStampSet(tfs, fromTo);
assertEquals(7, is.size());
da2.setTimeStampSet(1); // 1.2.2008 - 5.7.2008 - one time
da1.setTimeStampSet(2); // 2.1.2008 - 3.1.2008 - monthly
tfs = new ArrayList<FacilityAvailability>();
tfs.add(da1);
tfs.add(da2);
is = FacilityAvailabilityMerger.getMergedByTimeStampSet(tfs, fromTo);
assertEquals(19, is.size());
}
private final static int MAYBE_AVAILABLE = 2;
/**
*
*/
@Test
public void timeSimpleMergeTest() {
ArrayList<FacilityAvailability> tfs = new ArrayList<FacilityAvailability>();
TimeFrame fromTo = new SimpleTimeFrame(new GregorianCalendar(2008, 0, 1), new GregorianCalendar(2009, 0, 1));
List<FacilityAvailability> is = FacilityAvailabilityMerger.getMergedByTimeStampSet(tfs, fromTo);
assertEquals(0, tfs.size());
String facilityKey = "doesnotmatter";
Calendar c1 = new GregorianCalendar(2008, 0, 1);
Calendar c2 = new GregorianCalendar(2008, 6, 1);
FacilityAvailability da1 = new FacilityAvailability(facilityKey, c1, c2);
da1.setAvailable(FacilityAvailability.COMPLETE_AVAILABLE);
da1.setTimeStampSet(1);
tfs.add(da1);
is = FacilityAvailabilityMerger.getMergedByTimeStampSet(tfs, fromTo);
assertEquals(1, is.size());
c1 = new GregorianCalendar(2008, 3, 1);
c2 = new GregorianCalendar(2008, 9, 1);
FacilityAvailability da2 = new FacilityAvailability(facilityKey, c1, c2);
da2.setMaybeAvailable();
da2.setTimeStampSet(2);
tfs.add(da2);
is = FacilityAvailabilityMerger.getMergedByTimeStampSet(tfs, fromTo);
assertEquals(2, is.size());
assertEquals(0, is.get(0).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(3, is.get(0).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
assertEquals(FacilityAvailability.COMPLETE_AVAILABLE, (is.get(0)).getAvailable().intValue());
assertEquals(3, is.get(1).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(9, is.get(1).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
assertEquals(MAYBE_AVAILABLE, (is.get(1)).getAvailable().intValue());
c1 = new GregorianCalendar(2008, 10, 1);
c2 = new GregorianCalendar(2008, 11, 1);
FacilityAvailability da3 = new FacilityAvailability(facilityKey, c1, c2);
da3.setAvailable(FacilityAvailability.COMPLETE_AVAILABLE);
da3.setTimeStampSet(3);
tfs.add(da3);
is = FacilityAvailabilityMerger.getMergedByTimeStampSet(tfs, fromTo);
assertEquals(3, is.size());
c1 = new GregorianCalendar(2008, 2, 1);
c2 = new GregorianCalendar(2008, 4, 1);
FacilityAvailability da4 = new FacilityAvailability(facilityKey, c1, c2);
da4.setAvailable(FacilityAvailability.GENERAL_NOT_AVAILABLE);
da4.setTimeStampSet(4);
tfs.add(da4);
is = FacilityAvailabilityMerger.getMergedByTimeStampSet(tfs, fromTo);
assertEquals(4, is.size());
assertEquals(4, is.get(0).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(9, is.get(0).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
assertTrue(is.get(0).isMaybeAvailable());
assertEquals(10, is.get(1).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(11, is.get(1).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
assertTrue(is.get(1).isCompletelyAvailable());
assertEquals(2, is.get(2).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(4, is.get(2).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
assertTrue(is.get(2).isNotAvailableInGeneral());
assertEquals(0, is.get(3).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(2, is.get(3).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
assertTrue(is.get(3).isCompletelyAvailable());
}
/**
* test reengeneering driwen architektscho
*/
@Test
public void debug_1() {
this.clearDatabase();
ArrayList<FacilityAvailability> mergeThis = new ArrayList<FacilityAvailability>();
FacilityAvailability da1 = TeztBeanSimpleFactory.getValidFacilityAvailability(1);
da1.getBasePeriodOfTime().setStart(new GregorianCalendar(2009, 4, 7, 8, 0, 0));
da1.getBasePeriodOfTime().setEnd(new GregorianCalendar(2009, 4, 7, 11, 0, 0));
da1.setDaily();
da1.setFacilityKey(TeztBeanSimpleFactory.KEY_FACILITY_BOOKABLE);
mergeThis.add(da1);
FacilityAvailability da2 = TeztBeanSimpleFactory.getValidFacilityAvailability(2);
da2.getBasePeriodOfTime().setStart(new GregorianCalendar(2009, 4, 12, 0, 0, 0));
da2.getBasePeriodOfTime().setEnd(new GregorianCalendar(2009, 4, 12, 5, 0, 0));
da2.setDaily();
da2.setFacilityKey(TeztBeanSimpleFactory.KEY_FACILITY_BOOKABLE);
mergeThis.add(da2);
FacilityAvailability da3 = TeztBeanSimpleFactory.getValidFacilityAvailability(3);
da3.getBasePeriodOfTime().setStart(new GregorianCalendar(2009, 4, 6, 22, 0, 0));
da3.getBasePeriodOfTime().setEnd(new GregorianCalendar(2009, 4, 7, 0, 0, 0));
da3.setDaily();
da3.setFacilityKey(TeztBeanSimpleFactory.KEY_FACILITY_BOOKABLE);
mergeThis.add(da3);
TimeFrame fromTo = new SimpleTimeFrame(new GregorianCalendar(2009, 4, 11, 0, 0, 0), new GregorianCalendar(2009, 4, 12, 0, 0, 0));
ArrayList<String> orderedFacilityPriority = new ArrayList<String>();
orderedFacilityPriority.add(TeztBeanSimpleFactory.KEY_FACILITY_BOOKABLE_PARENT);
orderedFacilityPriority.add(TeztBeanSimpleFactory.KEY_FACILITY_BOOKABLE);
assertEquals(1, da1.getIntervalTimeFramesWithNoIteration(fromTo).size());
assertEquals(1, da2.getSingleSimpleTimeFrames(fromTo).size());
assertEquals(1, da2.getIntervalTimeFramesWithNoIteration(fromTo).size());
assertEquals(1, da3.getIntervalTimeFramesWithNoIteration(fromTo).size());
List<FacilityAvailability> is = FacilityAvailabilityMerger.getMergedByTimeStampSet(mergeThis, fromTo);
assertEquals(3, is.size());
is = FacilityAvailabilityMerger.getMergedByFacilities(mergeThis, fromTo, orderedFacilityPriority);
assertEquals(3, is.size());
}
/**
*
*/
@Test
public void timeInBetweenTest() {
ArrayList<FacilityAvailability> tfs = new ArrayList<FacilityAvailability>();
TimeFrame fromTo = new SimpleTimeFrame(new GregorianCalendar(2008, 0, 1), new GregorianCalendar(2009, 0, 1));
List<FacilityAvailability> is = FacilityAvailabilityMerger.getMergedByTimeStampSet(tfs, fromTo);
assertEquals(0, tfs.size());
String facilityKey = "doesnotmatter";
Calendar c1 = new GregorianCalendar(2008, 0, 1);
Calendar c2 = new GregorianCalendar(2008, 6, 1);
FacilityAvailability da1 = new FacilityAvailability(facilityKey, c1, c2);
da1.setAvailable(FacilityAvailability.MAINTENANCE_NOT_AVAILABLE);
da1.setTimeStampSet(1);
tfs.add(da1);
// in between another
c1 = new GregorianCalendar(2008, 2, 1);
c2 = new GregorianCalendar(2008, 3, 1);
FacilityAvailability da5 = new FacilityAvailability(facilityKey, c1, c2);
da5.setAvailable(FacilityAvailability.GENERAL_NOT_AVAILABLE);
da5.setTimeStampSet(2);
tfs.add(da5);
is = FacilityAvailabilityMerger.getMergedByTimeStampSet(tfs, fromTo);
assertEquals(3, is.size());
assertEquals(2, is.get(0).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(3, is.get(0).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
assertEquals(0, is.get(1).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(2, is.get(1).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
assertEquals(3, is.get(2).getBasePeriodOfTime().getCalendarStart().get(Calendar.MONTH));
assertEquals(6, is.get(2).getBasePeriodOfTime().getCalendarEnd().get(Calendar.MONTH));
}
}