/*
* Copyright 2009 Peter Karich.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* 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.
* under the License.
*/
package de.timefinder.data.set;
import de.timefinder.data.TimeFinderTester;
import de.timefinder.data.algo.Assignment;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* @author Peter Karich
*/
abstract public class EventRasterTester extends TimeFinderTester {
protected EventRaster eventRaster;
protected int LENGTH = 20;
public EventRasterTester() {
}
@Override
@Before
public void setUp() {
super.setUp();
}
@Test
public void testNextFree() {
assertEquals(0, eventRaster.getNextFree(0, 1));
assertEquals(LENGTH, eventRaster.getLastFreePlus1(0));
assertEquals(LENGTH, eventRaster.getLastFreePlus1(LENGTH - 1));
assertEquals(-1, eventRaster.getLastFreePlus1(LENGTH));
Assignment ass = newAssignment(0, 5);
assertTrue(eventRaster.add(ass));
assertEquals(5, eventRaster.getNextFree(0, 1));
eventRaster.remove(ass);
try {
// should NOT add an event which stays in conflicts to root event
eventRaster.setRoot(ass);
Assignment tmpEvent = newAssignment(3, 1);
eventRaster.add(tmpEvent);
assertTrue(false);
} catch (Throwable ex) {
assertTrue(true);
}
}
@Test
public void testNextFree2() {
Assignment event1 = newAssignment(0, 5);
assertTrue(eventRaster.add(event1));
assertEquals(5, eventRaster.getNextFree(0, 1));
// allow conflicting between the other events -> important
Assignment event2 = newAssignment(4, 3);
assertTrue(eventRaster.add(event2));
assertEquals(7, eventRaster.getNextFree(0, 1));
assertTrue(eventRaster.remove(event2));
// external duration change is supported only by some implementations
// event1.setDuration(10);
// assertEquals(5, eventRaster.getNextFree(0, 1));
// event1.setDuration(5);
// changing duration works like follows
assertTrue(eventRaster.remove(event1));
event1.getEvent().setDuration(20);
assertTrue(eventRaster.add(event1));
assertEquals(-1, eventRaster.getNextFree(0, 1));
assertTrue(eventRaster.remove(event1));
event1.getEvent().setDuration(10);
assertTrue(eventRaster.add(event1));
assertEquals(10, eventRaster.getNextFree(5, 1));
assertEquals(15, eventRaster.getNextFree(15, 1));
}
@Test
public void testNextFree3() {
Assignment event2 = newAssignment(5, 1);
eventRaster.add(event2);
Assignment event1 = newAssignment(0, 5);
eventRaster.add(event1);
Assignment event3 = newAssignment(9, 1);
eventRaster.add(event3);
assertEquals(6, eventRaster.getNextFree(0, 1));
assertEquals(7, eventRaster.getNextFree(7, 1));
assertEquals(8, eventRaster.getNextFree(8, 1));
assertEquals(10, eventRaster.getNextFree(9, 1));
assertEquals(10, eventRaster.getNextFree(0, 4));
assertEquals(11, eventRaster.getNextFree(11, 4));
assertEquals(12, eventRaster.getNextFree(12, 4));
}
@Test
public void testNextFree4() {
Assignment ev1 = newAssignment(0, 4);
Assignment ev2 = newAssignment(1, 4);
Assignment ev3 = newAssignment(5, 1);
assertTrue(eventRaster.add(ev1));
assertTrue(eventRaster.add(ev2));
assertTrue(eventRaster.add(ev3));
assertEquals(6, eventRaster.getNextFree(0, 1));
}
@Test
public void testNextFree5() {
Assignment ev1 = newAssignment(0, 3);
Assignment ev2 = newAssignment(2, 3);
Assignment ev3 = newAssignment(1, 5);
Assignment ev4 = newAssignment(6, 1);
assertTrue(eventRaster.add(ev1));
assertTrue(eventRaster.add(ev2));
assertTrue(eventRaster.add(ev3));
assertTrue(eventRaster.add(ev4));
assertEquals(7, eventRaster.getNextFree(0, 1));
}
@Test
public void testNextFree6() {
Assignment ev1 = newAssignment(0, 10);
Assignment ev2 = newAssignment(2, 1);
Assignment ev3 = newAssignment(8, 1);
assertTrue(eventRaster.add(ev1));
assertTrue(eventRaster.add(ev2));
assertTrue(eventRaster.add(ev3));
assertEquals(10, eventRaster.getNextFree(3, 1));
}
@Test
public void testFirstFree() {
Assignment event1 = newAssignment(1, 5);
assertTrue(eventRaster.add(event1));
assertEquals(0, eventRaster.getNextFree(0, 1));
}
@Test
public void testRemoveAndAdd() {
Assignment event1 = newAssignment(0, 5);
assertTrue(eventRaster.add(event1));
assertEquals(5, eventRaster.getNextFree(0, 1));
assertTrue(eventRaster.remove(event1));
event1.setStart(1);
assertTrue(eventRaster.add(event1));
assertEquals(0, eventRaster.getNextFree(0, 1));
}
@Test
public void testRemove() {
Assignment event1 = newAssignment("1", 0, 5);
Assignment event2 = newAssignment("2", 0, 5);
assertTrue(eventRaster.add(event1));
assertTrue(eventRaster.add(event2));
assertEquals(2, eventRaster.getConflictingAssignments(0, 1).size());
assertTrue(eventRaster.remove(event1));
assertTrue(eventRaster.remove(event2));
assertEquals(0, eventRaster.getConflictingAssignments(0, 1).size());
}
@Test
public void testGetConflictingEvents() {
Assignment rootEvent = newAssignment(10, 1);
eventRaster.setRoot(rootEvent);
Assignment event1 = newAssignment(0, 5);
assertTrue(eventRaster.add(event1));
Assignment event2 = newAssignment(4, 3);
assertTrue(eventRaster.add(event2));
assertEquals(2, eventRaster.getConflictingAssignments(4, 1).size());
assertEquals(2, eventRaster.getConflictingAssignments(4, 2).size());
assertEquals(2, eventRaster.getConflictingAssignments(3, 2).size());
assertEquals(1, eventRaster.getConflictingAssignments(3, 1).size());
assertEquals(1, eventRaster.getConflictingAssignments(5, 1).size());
}
@Test
public void testGetConflictingEvents2() {
assertTrue(eventRaster.add(newAssignment(0, 3)));
assertTrue(eventRaster.add(newAssignment(0, 2)));
assertEquals(2, eventRaster.getConflictingAssignments(1, 1).size());
assertEquals(1, eventRaster.getConflictingAssignments(2, 1).size());
assertEquals(0, eventRaster.getConflictingAssignments(3, 1).size());
assertEquals(2, eventRaster.getConflictingAssignments(1, 2).size());
assertEquals(1, eventRaster.getConflictingAssignments(2, 2).size());
assertEquals(0, eventRaster.getConflictingAssignments(3, 2).size());
}
@Test
public void testGetConflictingEvents3() {
assertTrue(eventRaster.add(newAssignment(10, 1)));
assertTrue(eventRaster.add(newAssignment(5, 10)));
assertEquals(1, eventRaster.getConflictingAssignments(9, 1).size());
assertTrue(eventRaster.add(newAssignment(8, 1)));
assertEquals(1, eventRaster.getConflictingAssignments(9, 1).size());
assertEquals(3, eventRaster.getConflictingAssignments(8, 3).size());
}
@Test
public void testGetConflictingEvents4() {
assertTrue(eventRaster.add(newAssignment(10, 10)));
assertTrue(eventRaster.add(newAssignment(5, 10)));
assertEquals(1, eventRaster.getConflictingAssignments(9, 1).size());
assertEquals(2, eventRaster.getConflictingAssignments(10, 1).size());
assertEquals(2, eventRaster.getConflictingAssignments(9, 2).size());
}
@Test
public void testGetConflictingEventsIndices2() {
Assignment ev1 = newAssignment(1, 2);
assertTrue(eventRaster.add(ev1));
Assignment ev2 = newAssignment(0, 3);
assertTrue(eventRaster.add(ev2));
Collection<Assignment> events = eventRaster.getConflictingAssignments(0, 1);
assertEquals(1, events.size());
events = eventRaster.getConflictingAssignments(1, 1);
assertEquals(2, events.size());
events = eventRaster.getConflictingAssignments(2, 1);
assertEquals(2, events.size());
}
@Test
public void testGetLastFreePlus1() {
assertEquals(LENGTH, eventRaster.getLastFreePlus1(0));
Assignment ev1 = newAssignment(1, 1);
assertTrue(eventRaster.add(ev1));
assertEquals(1, eventRaster.getLastFreePlus1(0));
assertEquals(LENGTH, eventRaster.getLastFreePlus1(2));
// undefined if the starting slot is already assigned
assertEquals(-1, eventRaster.getLastFreePlus1(1));
}
}