11 changed files with 657 additions and 0 deletions
@ -0,0 +1,15 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<classpath> |
||||
|
<classpathentry kind="src" path="src"/> |
||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-13"> |
||||
|
<attributes> |
||||
|
<attribute name="module" value="true"/> |
||||
|
</attributes> |
||||
|
</classpathentry> |
||||
|
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/5"> |
||||
|
<attributes> |
||||
|
<attribute name="module" value="true"/> |
||||
|
</attributes> |
||||
|
</classpathentry> |
||||
|
<classpathentry kind="output" path="bin"/> |
||||
|
</classpath> |
@ -0,0 +1,17 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<projectDescription> |
||||
|
<name>SimplePriorityQueue</name> |
||||
|
<comment></comment> |
||||
|
<projects> |
||||
|
</projects> |
||||
|
<buildSpec> |
||||
|
<buildCommand> |
||||
|
<name>org.eclipse.jdt.core.javabuilder</name> |
||||
|
<arguments> |
||||
|
</arguments> |
||||
|
</buildCommand> |
||||
|
</buildSpec> |
||||
|
<natures> |
||||
|
<nature>org.eclipse.jdt.core.javanature</nature> |
||||
|
</natures> |
||||
|
</projectDescription> |
@ -0,0 +1,6 @@ |
|||||
|
module testat { |
||||
|
requires junit; |
||||
|
requires org.junit.jupiter.api; |
||||
|
|
||||
|
opens testat_g11; |
||||
|
} |
@ -0,0 +1,123 @@ |
|||||
|
package solution_g11; |
||||
|
|
||||
|
import java.util.function.Consumer; |
||||
|
|
||||
|
import testat_g11.IPDetermination; |
||||
|
import testat_g11.IPriorityQueue; |
||||
|
import testat_g11.Ticket; |
||||
|
import testat_g11.TicketStatus; |
||||
|
|
||||
|
public class SimplePriorityQueue00000<T extends Ticket> implements IPriorityQueue<T> { |
||||
|
|
||||
|
private IPDetermination<Ticket> prioDet; |
||||
|
private int size; |
||||
|
private T[] tickets; |
||||
|
|
||||
|
public SimplePriorityQueue00000(IPDetermination<Ticket> prioDet) { |
||||
|
super(); |
||||
|
this.prioDet = prioDet; |
||||
|
|
||||
|
tickets = (T[]) java.lang.reflect.Array.newInstance(Ticket.class, 10); |
||||
|
size = 0; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean add(T t) { |
||||
|
if (t == null) { |
||||
|
return false; |
||||
|
} |
||||
|
if (t.getPriority() < 0) { |
||||
|
return false; |
||||
|
} |
||||
|
int priority = setPriority(t, t.getPriority()); |
||||
|
if (priority >= 0) { |
||||
|
return true; // fehler
|
||||
|
} else { |
||||
|
tickets[size] = t; |
||||
|
size++; |
||||
|
} |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public T poll() { |
||||
|
if (size == 0) { |
||||
|
return null; |
||||
|
} |
||||
|
T ticket = tickets[0]; |
||||
|
for (int i = 1; i < size; i++) { |
||||
|
if (prioDet.calculate(tickets[i]) > prioDet.calculate(ticket)) { |
||||
|
ticket.incrementAge(); |
||||
|
ticket = tickets[i]; |
||||
|
} else { |
||||
|
tickets[i].incrementAge(); |
||||
|
} |
||||
|
} |
||||
|
remove(ticket); |
||||
|
return ticket; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean contains(T t) { |
||||
|
int index = getIndexOfTicket(t); |
||||
|
return index >= 0; |
||||
|
} |
||||
|
|
||||
|
private int getIndexOfTicket(T t) { |
||||
|
for (int i = 0; i < size; i++) { |
||||
|
if (tickets[i].equals(t)) { |
||||
|
return i; |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int getTotalPriority(T t) { |
||||
|
int index = getIndexOfTicket(t); |
||||
|
if (index >= 0) { |
||||
|
return prioDet.calculate(tickets[index]); |
||||
|
} |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int setPriority(T t, int newPriority) { |
||||
|
int index = getIndexOfTicket(t); |
||||
|
if (index >= 0) { |
||||
|
tickets[index].setPriority(newPriority); |
||||
|
return prioDet.calculate(tickets[index]); |
||||
|
} |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public int size() { |
||||
|
return size; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void forAll(Consumer<T> action) { |
||||
|
for (int i = 0; i < size; i++) { |
||||
|
action.accept(tickets[i]); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean remove(T t) { |
||||
|
int index = getIndexOfTicket(t); |
||||
|
if (index < 0) { |
||||
|
return false; |
||||
|
} |
||||
|
t.setStatus(TicketStatus.FINISHED); |
||||
|
for (int i = index; i < size - 1; i++) { |
||||
|
tickets[i] = tickets[i + 1]; |
||||
|
} |
||||
|
tickets[size - 1] = null; |
||||
|
size = size - 1; |
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,45 @@ |
|||||
|
package solution_g11; |
||||
|
|
||||
|
import static org.junit.Assert.assertEquals; |
||||
|
|
||||
|
import org.junit.jupiter.api.Test; |
||||
|
|
||||
|
import testat_g11.ASimplePriorityQueueBaseTest; |
||||
|
import testat_g11.IPDetermination; |
||||
|
import testat_g11.IPriorityQueue; |
||||
|
import testat_g11.Ticket; |
||||
|
|
||||
|
public class SimplePriorityQueueTest00000 extends ASimplePriorityQueueBaseTest { |
||||
|
|
||||
|
protected static IPDetermination<Ticket> prioDetermination = new IPDetermination<>() { |
||||
|
|
||||
|
@Override |
||||
|
public int calculate(Ticket t) { |
||||
|
// TODO Auto-generated method stub
|
||||
|
return IPDetermination.super.calculate(t); |
||||
|
} |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
@Override |
||||
|
protected IPriorityQueue<Ticket> getInstance() { |
||||
|
// TODO Auto-generated method stub
|
||||
|
return new SimplePriorityQueue00000<Ticket>(new IPDetermination<Ticket>() { |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testPoll5() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
queue.poll(); |
||||
|
queue.poll(); |
||||
|
queue.add(t8); |
||||
|
Ticket actual = queue.poll(); |
||||
|
assertEquals(t2, actual); |
||||
|
actual = queue.poll(); |
||||
|
assertEquals(t8, actual); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,276 @@ |
|||||
|
package testat_g11; |
||||
|
|
||||
|
import static org.junit.Assert.assertEquals; |
||||
|
import static org.junit.Assert.fail; |
||||
|
|
||||
|
import java.util.function.Consumer; |
||||
|
|
||||
|
import org.junit.jupiter.api.BeforeAll; |
||||
|
import org.junit.jupiter.api.BeforeEach; |
||||
|
import org.junit.jupiter.api.Test; |
||||
|
|
||||
|
public abstract class ASimplePriorityQueueBaseTest { |
||||
|
|
||||
|
private int counter = 0; |
||||
|
private Consumer<Ticket> countLenght = s -> { |
||||
|
counter += ((String) s.getPayload()).length(); |
||||
|
}; |
||||
|
|
||||
|
protected IPriorityQueue<Ticket> queue; |
||||
|
protected Ticket t1 = new Ticket("Auftrag 1", 3); |
||||
|
protected Ticket t2 = new Ticket("Beschwerde 1", 1); |
||||
|
protected Ticket t3 = new Ticket("Beschwerde 2", 2); |
||||
|
protected Ticket t4 = new Ticket("Notfall 1", 8); |
||||
|
protected Ticket t5 = new Ticket("Bagatelle", 1); |
||||
|
protected Ticket t6 = new Ticket("Beschwerde 1", 6); |
||||
|
protected Ticket t7 = new Ticket("Auftrag 1", 4); |
||||
|
protected Ticket t8 = new Ticket("Beschwerde 2", 2); |
||||
|
protected Ticket t9 = new Ticket("Auftrag 2", -1); |
||||
|
protected Ticket t10 = new Ticket("Notfall 2", 9); |
||||
|
|
||||
|
protected abstract IPriorityQueue<Ticket> getInstance(); |
||||
|
|
||||
|
@BeforeAll |
||||
|
static void setUpBeforeClass() throws Exception { |
||||
|
} |
||||
|
|
||||
|
@BeforeEach |
||||
|
void setUp() throws Exception { |
||||
|
queue = getInstance(); |
||||
|
counter = 0; |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testAdd1() { |
||||
|
boolean actual = queue.add(t1); |
||||
|
assertEquals(true, actual); |
||||
|
assertEquals(1, queue.size()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testAdd2() { |
||||
|
queue.add(t1); |
||||
|
boolean actual = queue.add(t7); |
||||
|
assertEquals(true, actual); |
||||
|
assertEquals(1, queue.size()); |
||||
|
assertEquals(t1.getPriority(), 4); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testAdd3() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
queue.add(t4); |
||||
|
boolean actual = queue.add(t5); |
||||
|
assertEquals(true, actual); |
||||
|
assertEquals(5, queue.size()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testAdd4() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
queue.add(t4); |
||||
|
queue.add(t5); |
||||
|
boolean actual = queue.add(t7); |
||||
|
assertEquals(true, actual); |
||||
|
assertEquals(5, queue.size()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testAdd9() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
queue.add(t4); |
||||
|
queue.add(t5); |
||||
|
boolean actual = queue.add(t9); |
||||
|
assertEquals(false, actual); |
||||
|
assertEquals(5, queue.size()); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testPoll1() { |
||||
|
Ticket actual = queue.poll(); |
||||
|
assertEquals(null, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testPoll2() { |
||||
|
queue.add(t1); |
||||
|
Ticket actual = queue.poll(); |
||||
|
assertEquals(t1, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testPoll3() { |
||||
|
queue.add(t1); |
||||
|
queue.poll(); |
||||
|
Ticket actual = queue.poll(); |
||||
|
assertEquals(null, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testPoll4() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
Ticket actual = queue.poll(); |
||||
|
assertEquals(t1, actual); |
||||
|
actual = queue.poll(); |
||||
|
assertEquals(t3, actual); |
||||
|
actual = queue.poll(); |
||||
|
assertEquals(t2, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testPoll6() { |
||||
|
queue.add(t2); |
||||
|
queue.add(t5); |
||||
|
Ticket actual = queue.poll(); |
||||
|
if (actual.equals(t5)) { |
||||
|
if (t2.getBeginOfTicket().before(t5.getBeginOfTicket())) { |
||||
|
fail("t2 ist älter"); |
||||
|
} else { |
||||
|
assertEquals(true, true); |
||||
|
} |
||||
|
} else { |
||||
|
assertEquals(t2, actual); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testGetContains1() { |
||||
|
var actual = queue.contains(t1); |
||||
|
assertEquals(false, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testGetContains2() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
var actual = queue.contains(t2); |
||||
|
assertEquals(true, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testGetContains3() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
queue.poll(); |
||||
|
var actual = queue.contains(t1); |
||||
|
assertEquals(false, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testGetRemove1() { |
||||
|
var actual = queue.remove(t1); |
||||
|
assertEquals(false, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testGetRemove2() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
var actual = queue.remove(t1); |
||||
|
assertEquals(true, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testGetRemove3() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
queue.remove(t1); |
||||
|
var actual = queue.contains(t1); |
||||
|
assertEquals(false, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void testGetRemove4() { |
||||
|
t1.setStatus(TicketStatus.CREATED); |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
queue.remove(t1); |
||||
|
var actual = t1.getStatus(); |
||||
|
assertEquals(TicketStatus.FINISHED, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void getPriority1() { |
||||
|
var actual = queue.getTotalPriority(t1); |
||||
|
assertEquals(-1, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void getPriority2() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
|
||||
|
var actual = queue.getTotalPriority(t3); |
||||
|
assertEquals(2, actual); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void getAge() { |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
public void setPriority1() { |
||||
|
var actual = queue.setPriority(t1, 1); |
||||
|
assertEquals(-1, actual); |
||||
|
}; |
||||
|
|
||||
|
@Test |
||||
|
public void setPriority2() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
var actual = queue.setPriority(t2, 5); |
||||
|
assertEquals(5, actual); |
||||
|
}; |
||||
|
|
||||
|
@Test |
||||
|
public void setPriority3() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
queue.poll(); |
||||
|
queue.setPriority(t2, 0); |
||||
|
var actual = queue.getTotalPriority(t2); |
||||
|
assertEquals(1, actual); |
||||
|
}; |
||||
|
|
||||
|
@Test |
||||
|
public void setPriority4() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
queue.setPriority(t2, 5); |
||||
|
var actual = queue.poll(); |
||||
|
assertEquals(t2, actual); |
||||
|
}; |
||||
|
|
||||
|
@Test |
||||
|
public void testForAll1() { |
||||
|
queue.forAll(null); |
||||
|
assertEquals(true, true); |
||||
|
}; |
||||
|
|
||||
|
@Test |
||||
|
public void testForAll2() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
|
||||
|
queue.forAll(countLenght); |
||||
|
assertEquals(33, counter); |
||||
|
}; |
||||
|
} |
@ -0,0 +1,33 @@ |
|||||
|
package testat_g11; |
||||
|
|
||||
|
import static org.junit.Assert.assertEquals; |
||||
|
|
||||
|
import org.junit.jupiter.api.Test; |
||||
|
|
||||
|
public abstract class ASimplePriorityQueueTest extends ASimplePriorityQueueBaseTest { |
||||
|
|
||||
|
protected static IPDetermination<Ticket> prioDetermination = new IPDetermination<Ticket>() { |
||||
|
@Override |
||||
|
public int calculate(Ticket t) { |
||||
|
// TODO Auto-generated method stub
|
||||
|
return IPDetermination.super.calculate(t); |
||||
|
} |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
// Ageing
|
||||
|
@Test |
||||
|
public void testPoll5() { |
||||
|
queue.add(t1); |
||||
|
queue.add(t2); |
||||
|
queue.add(t3); |
||||
|
queue.poll(); |
||||
|
queue.poll(); |
||||
|
queue.add(t8); |
||||
|
Ticket actual = queue.poll(); |
||||
|
assertEquals(t2, actual); |
||||
|
actual = queue.poll(); |
||||
|
assertEquals(t8, actual); |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,11 @@ |
|||||
|
package testat_g11; |
||||
|
|
||||
|
public interface IPDetermination<T extends Ticket> { |
||||
|
|
||||
|
default int calculate(T t) { |
||||
|
if (t instanceof Ticket) { |
||||
|
return (((Ticket) t).getAge() + ((Ticket) t).getPriority()); |
||||
|
} |
||||
|
return 0; |
||||
|
} |
||||
|
} |
@ -0,0 +1,29 @@ |
|||||
|
package testat_g11; |
||||
|
|
||||
|
import java.util.function.Consumer; |
||||
|
|
||||
|
public interface IPriorityQueue<T extends Ticket> { |
||||
|
|
||||
|
// Nimmt t in die Queue auf, sofern t != null und t noch nicht enthalten und die
|
||||
|
// Priorität >= 0 ist.
|
||||
|
// ist t bereits enthalten, wird es nicht erneut aufgenommen, aber die Priorität
|
||||
|
// des bestehenden Tickets durch die Priorität von t ersetzt.
|
||||
|
// Rückgabe: False, wenn t == null, true sonst
|
||||
|
boolean add(T t); |
||||
|
|
||||
|
// Entfernt das Element mit der größten Priorität aus der Queue
|
||||
|
T poll(); |
||||
|
|
||||
|
boolean contains(T t); |
||||
|
|
||||
|
boolean remove(T t); |
||||
|
|
||||
|
int getTotalPriority(T t); |
||||
|
|
||||
|
int setPriority(T t, int newPriority); |
||||
|
|
||||
|
int size(); |
||||
|
|
||||
|
void forAll(Consumer<T> action); |
||||
|
|
||||
|
} |
@ -0,0 +1,97 @@ |
|||||
|
package testat_g11; |
||||
|
|
||||
|
import java.util.Date; |
||||
|
|
||||
|
public class Ticket { |
||||
|
|
||||
|
private TicketStatus status; |
||||
|
private Date beginOfTicket; |
||||
|
private Date endOfTicket; |
||||
|
private Date beginOfWork; |
||||
|
private Date endOfWork; |
||||
|
private int priority; |
||||
|
private int age; |
||||
|
private Object payload; |
||||
|
|
||||
|
public Ticket(Object payload, int priority) { |
||||
|
super(); |
||||
|
this.payload = payload; |
||||
|
this.priority = priority; |
||||
|
this.age = 0; |
||||
|
this.status = TicketStatus.CREATED; |
||||
|
} |
||||
|
|
||||
|
public TicketStatus getStatus() { |
||||
|
return status; |
||||
|
} |
||||
|
|
||||
|
public int getPriority() { |
||||
|
return priority; |
||||
|
} |
||||
|
|
||||
|
public void setPriority(int priority) { |
||||
|
this.priority = priority; |
||||
|
} |
||||
|
|
||||
|
public int getAge() { |
||||
|
return age; |
||||
|
} |
||||
|
|
||||
|
public void incrementAge() { |
||||
|
this.age += 1; |
||||
|
} |
||||
|
|
||||
|
public void setStatus(TicketStatus status) { |
||||
|
this.status = status; |
||||
|
} |
||||
|
|
||||
|
public Date getBeginOfTicket() { |
||||
|
return beginOfTicket; |
||||
|
} |
||||
|
|
||||
|
public void setBeginOfTicket() { |
||||
|
this.beginOfTicket = new Date(); |
||||
|
} |
||||
|
|
||||
|
public Date getEndOfTicket() { |
||||
|
return endOfTicket; |
||||
|
} |
||||
|
|
||||
|
public void setEndOfTicket() { |
||||
|
this.endOfTicket = new Date(); |
||||
|
} |
||||
|
|
||||
|
public Date getBeginOfWork() { |
||||
|
return beginOfWork; |
||||
|
} |
||||
|
|
||||
|
public void setBeginOfWork() { |
||||
|
this.beginOfWork = new Date(); |
||||
|
} |
||||
|
|
||||
|
public Date getEndOfWork() { |
||||
|
return endOfWork; |
||||
|
} |
||||
|
|
||||
|
public void setEndOfWork() { |
||||
|
this.endOfWork = new Date(); |
||||
|
} |
||||
|
|
||||
|
public Object getPayload() { |
||||
|
return payload; |
||||
|
} |
||||
|
|
||||
|
public void setPayload(Object payload) { |
||||
|
this.payload = payload; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public boolean equals(Object o) { |
||||
|
if (o instanceof Ticket) { |
||||
|
Ticket that = (Ticket) o; |
||||
|
return this.payload.equals(that.payload); |
||||
|
} |
||||
|
return false; |
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,5 @@ |
|||||
|
package testat_g11; |
||||
|
|
||||
|
public enum TicketStatus { |
||||
|
CREATED, WAIT_FOR_PROCESSING, IN_PROGRESS, WAIT_FOR_ACTION, FINISHED, UNKNOWN |
||||
|
} |
Loading…
Reference in new issue