From 5756558f7e533b95d8b472cc63ebbd1c1dbfd74b Mon Sep 17 00:00:00 2001 From: hertero Date: Thu, 25 Aug 2022 10:53:13 +0200 Subject: [PATCH] initial project commit --- SimplePriorityQueue/.classpath | 15 + SimplePriorityQueue/.project | 17 ++ SimplePriorityQueue/src/module-info.java | 6 + .../SimplePriorityQueue00000.java | 123 ++++++++ .../SimplePriorityQueueTest00000.java | 45 +++ .../ASimplePriorityQueueBaseTest.java | 276 ++++++++++++++++++ .../testat_g11/ASimplePriorityQueueTest.java | 33 +++ .../src/testat_g11/IPDetermination.java | 11 + .../src/testat_g11/IPriorityQueue.java | 29 ++ .../src/testat_g11/Ticket.java | 97 ++++++ .../src/testat_g11/TicketStatus.java | 5 + 11 files changed, 657 insertions(+) create mode 100644 SimplePriorityQueue/.classpath create mode 100644 SimplePriorityQueue/.project create mode 100644 SimplePriorityQueue/src/module-info.java create mode 100644 SimplePriorityQueue/src/solution_g11/SimplePriorityQueue00000.java create mode 100644 SimplePriorityQueue/src/solution_g11/SimplePriorityQueueTest00000.java create mode 100644 SimplePriorityQueue/src/testat_g11/ASimplePriorityQueueBaseTest.java create mode 100644 SimplePriorityQueue/src/testat_g11/ASimplePriorityQueueTest.java create mode 100644 SimplePriorityQueue/src/testat_g11/IPDetermination.java create mode 100644 SimplePriorityQueue/src/testat_g11/IPriorityQueue.java create mode 100644 SimplePriorityQueue/src/testat_g11/Ticket.java create mode 100644 SimplePriorityQueue/src/testat_g11/TicketStatus.java diff --git a/SimplePriorityQueue/.classpath b/SimplePriorityQueue/.classpath new file mode 100644 index 0000000..dfab6d7 --- /dev/null +++ b/SimplePriorityQueue/.classpath @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/SimplePriorityQueue/.project b/SimplePriorityQueue/.project new file mode 100644 index 0000000..0c469ba --- /dev/null +++ b/SimplePriorityQueue/.project @@ -0,0 +1,17 @@ + + + SimplePriorityQueue + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/SimplePriorityQueue/src/module-info.java b/SimplePriorityQueue/src/module-info.java new file mode 100644 index 0000000..c305e83 --- /dev/null +++ b/SimplePriorityQueue/src/module-info.java @@ -0,0 +1,6 @@ +module testat { + requires junit; + requires org.junit.jupiter.api; + + opens testat_g11; +} \ No newline at end of file diff --git a/SimplePriorityQueue/src/solution_g11/SimplePriorityQueue00000.java b/SimplePriorityQueue/src/solution_g11/SimplePriorityQueue00000.java new file mode 100644 index 0000000..0fe5903 --- /dev/null +++ b/SimplePriorityQueue/src/solution_g11/SimplePriorityQueue00000.java @@ -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 implements IPriorityQueue { + + private IPDetermination prioDet; + private int size; + private T[] tickets; + + public SimplePriorityQueue00000(IPDetermination 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 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; + } + +} diff --git a/SimplePriorityQueue/src/solution_g11/SimplePriorityQueueTest00000.java b/SimplePriorityQueue/src/solution_g11/SimplePriorityQueueTest00000.java new file mode 100644 index 0000000..ff88606 --- /dev/null +++ b/SimplePriorityQueue/src/solution_g11/SimplePriorityQueueTest00000.java @@ -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 prioDetermination = new IPDetermination<>() { + + @Override + public int calculate(Ticket t) { + // TODO Auto-generated method stub + return IPDetermination.super.calculate(t); + } + + }; + + @Override + protected IPriorityQueue getInstance() { + // TODO Auto-generated method stub + return new SimplePriorityQueue00000(new IPDetermination() { + }); + } + + @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); + } + +} diff --git a/SimplePriorityQueue/src/testat_g11/ASimplePriorityQueueBaseTest.java b/SimplePriorityQueue/src/testat_g11/ASimplePriorityQueueBaseTest.java new file mode 100644 index 0000000..b32042e --- /dev/null +++ b/SimplePriorityQueue/src/testat_g11/ASimplePriorityQueueBaseTest.java @@ -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 countLenght = s -> { + counter += ((String) s.getPayload()).length(); + }; + + protected IPriorityQueue 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 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); + }; +} diff --git a/SimplePriorityQueue/src/testat_g11/ASimplePriorityQueueTest.java b/SimplePriorityQueue/src/testat_g11/ASimplePriorityQueueTest.java new file mode 100644 index 0000000..881b3f9 --- /dev/null +++ b/SimplePriorityQueue/src/testat_g11/ASimplePriorityQueueTest.java @@ -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 prioDetermination = new IPDetermination() { + @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); + } + +} diff --git a/SimplePriorityQueue/src/testat_g11/IPDetermination.java b/SimplePriorityQueue/src/testat_g11/IPDetermination.java new file mode 100644 index 0000000..6907bf9 --- /dev/null +++ b/SimplePriorityQueue/src/testat_g11/IPDetermination.java @@ -0,0 +1,11 @@ +package testat_g11; + +public interface IPDetermination { + + default int calculate(T t) { + if (t instanceof Ticket) { + return (((Ticket) t).getAge() + ((Ticket) t).getPriority()); + } + return 0; + } +} diff --git a/SimplePriorityQueue/src/testat_g11/IPriorityQueue.java b/SimplePriorityQueue/src/testat_g11/IPriorityQueue.java new file mode 100644 index 0000000..8fcf800 --- /dev/null +++ b/SimplePriorityQueue/src/testat_g11/IPriorityQueue.java @@ -0,0 +1,29 @@ +package testat_g11; + +import java.util.function.Consumer; + +public interface IPriorityQueue { + + // 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 action); + +} diff --git a/SimplePriorityQueue/src/testat_g11/Ticket.java b/SimplePriorityQueue/src/testat_g11/Ticket.java new file mode 100644 index 0000000..d47864c --- /dev/null +++ b/SimplePriorityQueue/src/testat_g11/Ticket.java @@ -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; + + } +} diff --git a/SimplePriorityQueue/src/testat_g11/TicketStatus.java b/SimplePriorityQueue/src/testat_g11/TicketStatus.java new file mode 100644 index 0000000..a8227fe --- /dev/null +++ b/SimplePriorityQueue/src/testat_g11/TicketStatus.java @@ -0,0 +1,5 @@ +package testat_g11; + +public enum TicketStatus { + CREATED, WAIT_FOR_PROCESSING, IN_PROGRESS, WAIT_FOR_ACTION, FINISHED, UNKNOWN +}