Commit d92faa87 authored by Archie Shahidullah's avatar Archie Shahidullah :expressionless:
Browse files

timeout tests and other fixes

parent 656caae1
1 merge request!1Review Tests for Project 3
Pipeline #36467 canceled with stage
Showing with 54 additions and 22 deletions
+54 -22
...@@ -15,17 +15,19 @@ import org.junit.jupiter.params.provider.ValueSource; ...@@ -15,17 +15,19 @@ import org.junit.jupiter.params.provider.ValueSource;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Stream; import java.util.stream.Stream;
import static edu.caltech.cs2.project03.Project03TestOrdering.*; import static edu.caltech.cs2.project03.Project03TestOrdering.*;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@Tag("C") @Tag("C")
public class ArrayDequeTests implements DequeTests, StackTests, QueueTests { public class ArrayDequeTests implements DequeTests, StackTests, QueueTests {
private static String ARRAY_DEQUE_SOURCE = "src/edu/caltech/cs2/datastructures/ArrayDeque.java"; private static String ARRAY_DEQUE_SOURCE ="src/edu/caltech/cs2/datastructures/ArrayDeque.java";
private Constructor arrayDequeConstructor = Reflection.getConstructor(ArrayDeque.class); private Constructor arrayDequeConstructor = Reflection.getConstructor(ArrayDeque.class);
...@@ -104,8 +106,22 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -104,8 +106,22 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests {
@DisplayName("The public interface is correct") @DisplayName("The public interface is correct")
@Test @Test
public void testPublicInterface() { public void testPublicInterface() {
Reflection.assertPublicInterface(ArrayDeque.class, List.of("addFront", "addBack", "removeFront", "removeBack", Reflection.assertPublicInterface(ArrayDeque.class, List.of(
"enqueue", "dequeue", "push", "pop", "peek", "peekFront", "peekBack", "iterator", "size", "toString")); "addFront",
"addBack",
"removeFront",
"removeBack",
"enqueue",
"dequeue",
"push",
"pop",
"peek",
"peekFront",
"peekBack",
"iterator",
"size",
"toString"
));
} }
@Order(classSpecificTestLevel) @Order(classSpecificTestLevel)
...@@ -115,6 +131,7 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -115,6 +131,7 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests {
Inspection.assertConstructorHygiene(ARRAY_DEQUE_SOURCE); Inspection.assertConstructorHygiene(ARRAY_DEQUE_SOURCE);
} }
// TOSTRING TESTS --------------------------------------------------- // TOSTRING TESTS ---------------------------------------------------
@Order(toStringTestLevel) @Order(toStringTestLevel)
...@@ -127,7 +144,9 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -127,7 +144,9 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests {
@Order(toStringTestLevel) @Order(toStringTestLevel)
@DisplayName("toString() matches java.util.ArrayDeque") @DisplayName("toString() matches java.util.ArrayDeque")
@ParameterizedTest(name = "Test toString() on [{arguments}]") @ParameterizedTest(name = "Test toString() on [{arguments}]")
@ValueSource(strings = { "0, 1, 2, 3", "5, 4, 3, 2, 1", "8, 3, 5, 7, 4, 3, 12, 12, 1" }) @ValueSource(strings = {
"0, 1, 2, 3", "5, 4, 3, 2, 1", "8, 3, 5, 7, 4, 3, 12, 12, 1"
})
public void testToString(String inputs) { public void testToString(String inputs) {
java.util.ArrayDeque<String> reference = new java.util.ArrayDeque<String>(); java.util.ArrayDeque<String> reference = new java.util.ArrayDeque<String>();
edu.caltech.cs2.datastructures.ArrayDeque<String> me = new edu.caltech.cs2.datastructures.ArrayDeque<>(); edu.caltech.cs2.datastructures.ArrayDeque<String> me = new edu.caltech.cs2.datastructures.ArrayDeque<>();
...@@ -142,6 +161,7 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -142,6 +161,7 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("addFront() and removeFront() take linear time") @DisplayName("addFront() and removeFront() take linear time")
@Timeout(value = 20, unit = SECONDS)
@Test() @Test()
public void testFrontDequeOperationComplexity() { public void testFrontDequeOperationComplexity() {
Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> { Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> {
...@@ -155,12 +175,12 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -155,12 +175,12 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests {
Consumer<IDeque<Integer>> removeFront = (IDeque<Integer> q) -> q.removeFront(); Consumer<IDeque<Integer>> removeFront = (IDeque<Integer> q) -> q.removeFront();
RuntimeInstrumentation.assertAtMost("addFront", RuntimeInstrumentation.ComplexityType.LINEAR, provide, addFront, 8); RuntimeInstrumentation.assertAtMost("addFront", RuntimeInstrumentation.ComplexityType.LINEAR, provide, addFront, 8);
RuntimeInstrumentation.assertAtMost("removeFront", RuntimeInstrumentation.ComplexityType.LINEAR, provide, RuntimeInstrumentation.assertAtMost("removeFront", RuntimeInstrumentation.ComplexityType.LINEAR, provide, removeFront, 8);
removeFront, 8);
} }
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("addBack() and removeBack() take linear time") @DisplayName("addBack() and removeBack() take linear time")
@Timeout(value = 20, unit = SECONDS)
@Test @Test
public void testBackDequeOperationComplexity() { public void testBackDequeOperationComplexity() {
Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> { Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> {
...@@ -174,12 +194,12 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -174,12 +194,12 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests {
Consumer<IDeque<Integer>> removeBack = (IDeque<Integer> q) -> q.removeBack(); Consumer<IDeque<Integer>> removeBack = (IDeque<Integer> q) -> q.removeBack();
RuntimeInstrumentation.assertAtMost("addBack", RuntimeInstrumentation.ComplexityType.LINEAR, provide, addBack, 8); RuntimeInstrumentation.assertAtMost("addBack", RuntimeInstrumentation.ComplexityType.LINEAR, provide, addBack, 8);
RuntimeInstrumentation.assertAtMost("removeBack", RuntimeInstrumentation.ComplexityType.LINEAR, provide, removeBack, RuntimeInstrumentation.assertAtMost("removeBack", RuntimeInstrumentation.ComplexityType.LINEAR, provide, removeBack, 8);
8);
} }
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("enqueue() and dequeue() take linear time") @DisplayName("enqueue() and dequeue() take linear time")
@Timeout(value = 20, unit = SECONDS)
@Test @Test
public void testQueueOperationComplexity() { public void testQueueOperationComplexity() {
Function<Integer, IQueue<Integer>> provide = (Integer numElements) -> { Function<Integer, IQueue<Integer>> provide = (Integer numElements) -> {
...@@ -198,6 +218,7 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -198,6 +218,7 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("push() and pop() take constant time") @DisplayName("push() and pop() take constant time")
@Timeout(value = 10, unit = SECONDS)
@Test @Test
public void testStackOperationComplexity() { public void testStackOperationComplexity() {
Function<Integer, IStack<Integer>> provide = (Integer numElements) -> { Function<Integer, IStack<Integer>> provide = (Integer numElements) -> {
...@@ -216,6 +237,7 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -216,6 +237,7 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("peek() takes constant time") @DisplayName("peek() takes constant time")
@Timeout(value = 10, unit = SECONDS)
@Test @Test
public void testPeekComplexity() { public void testPeekComplexity() {
Function<Integer, IStack<Integer>> provide = (Integer numElements) -> { Function<Integer, IStack<Integer>> provide = (Integer numElements) -> {
...@@ -232,6 +254,7 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -232,6 +254,7 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("peekFront() takes constant time") @DisplayName("peekFront() takes constant time")
@Timeout(value = 10, unit = SECONDS)
@Test() @Test()
public void testPeekFrontComplexity() { public void testPeekFrontComplexity() {
Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> { Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> {
...@@ -243,12 +266,12 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -243,12 +266,12 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests {
}; };
Consumer<IDeque<Integer>> peekFront = (IDeque<Integer> q) -> q.peekFront(); Consumer<IDeque<Integer>> peekFront = (IDeque<Integer> q) -> q.peekFront();
RuntimeInstrumentation.assertAtMost("peekFront", RuntimeInstrumentation.ComplexityType.CONSTANT, provide, peekFront, RuntimeInstrumentation.assertAtMost("peekFront", RuntimeInstrumentation.ComplexityType.CONSTANT, provide, peekFront, 8);
8);
} }
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("peekBack() takes constant time") @DisplayName("peekBack() takes constant time")
@Timeout(value = 10, unit = SECONDS)
@Test @Test
public void testPeekBackComplexity() { public void testPeekBackComplexity() {
Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> { Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> {
...@@ -260,8 +283,7 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -260,8 +283,7 @@ public class ArrayDequeTests implements DequeTests, StackTests, QueueTests {
}; };
Consumer<IDeque<Integer>> peekBack = (IDeque<Integer> q) -> q.peekBack(); Consumer<IDeque<Integer>> peekBack = (IDeque<Integer> q) -> q.peekBack();
RuntimeInstrumentation.assertAtMost("peekBack", RuntimeInstrumentation.ComplexityType.CONSTANT, provide, peekBack, RuntimeInstrumentation.assertAtMost("peekBack", RuntimeInstrumentation.ComplexityType.CONSTANT, provide, peekBack, 8);
8);
} }
} }
\ No newline at end of file
...@@ -5,7 +5,6 @@ import edu.caltech.cs2.helpers.Reflection; ...@@ -5,7 +5,6 @@ import edu.caltech.cs2.helpers.Reflection;
import edu.caltech.cs2.helpers.RuntimeInstrumentation; import edu.caltech.cs2.helpers.RuntimeInstrumentation;
import edu.caltech.cs2.interfaces.IFixedSizeQueue; import edu.caltech.cs2.interfaces.IFixedSizeQueue;
import edu.caltech.cs2.interfaces.IQueue; import edu.caltech.cs2.interfaces.IQueue;
import org.hamcrest.collection.IsIterableContainingInOrder;
import org.junit.jupiter.api.*; import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.CsvSource;
...@@ -17,6 +16,7 @@ import java.util.function.Consumer; ...@@ -17,6 +16,7 @@ import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
import static edu.caltech.cs2.project03.Project03TestOrdering.*; import static edu.caltech.cs2.project03.Project03TestOrdering.*;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
@Tag("B") @Tag("B")
...@@ -129,6 +129,7 @@ public class CircularArrayFixedSizeQueueTests implements FixedSizeQueueTests { ...@@ -129,6 +129,7 @@ public class CircularArrayFixedSizeQueueTests implements FixedSizeQueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("enqueue() and dequeue() take constant time") @DisplayName("enqueue() and dequeue() take constant time")
@Timeout(value = 10, unit = SECONDS)
@Test() @Test()
public void testQueueOperationComplexity() { public void testQueueOperationComplexity() {
Function<Integer, IFixedSizeQueue<Integer>> provide = (Integer numElements) -> { Function<Integer, IFixedSizeQueue<Integer>> provide = (Integer numElements) -> {
...@@ -148,6 +149,7 @@ public class CircularArrayFixedSizeQueueTests implements FixedSizeQueueTests { ...@@ -148,6 +149,7 @@ public class CircularArrayFixedSizeQueueTests implements FixedSizeQueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("peek() takes constant time") @DisplayName("peek() takes constant time")
@Timeout(value = 10, unit = SECONDS)
@Test() @Test()
public void testPeekComplexity() { public void testPeekComplexity() {
Function<Integer, IFixedSizeQueue<Integer>> provide = (Integer numElements) -> { Function<Integer, IFixedSizeQueue<Integer>> provide = (Integer numElements) -> {
...@@ -164,8 +166,8 @@ public class CircularArrayFixedSizeQueueTests implements FixedSizeQueueTests { ...@@ -164,8 +166,8 @@ public class CircularArrayFixedSizeQueueTests implements FixedSizeQueueTests {
} }
@Order(fixedSizeQueueLevel) @Order(fixedSizeQueueLevel)
@DisplayName("Test iterator matches reference") @DisplayName("Test iterator matches reference for wraparound values")
@ParameterizedTest(name = "Test iterator with {1} random values with seed = {0} and fixed array size = {2}") @ParameterizedTest(name = "Test iterator and wraparound behavior with {1} random values with seed = {0} and fixed array size = {2}")
@CsvSource({ "69, 200, 20", "21, 300, 200" }) @CsvSource({ "69, 200, 20", "21, 300, 200" })
public void testWrapAround(int seed, int numVals, int queueSize) { public void testWrapAround(int seed, int numVals, int queueSize) {
Random r = new Random(seed); Random r = new Random(seed);
......
...@@ -21,6 +21,7 @@ import java.util.function.Consumer; ...@@ -21,6 +21,7 @@ import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
import static edu.caltech.cs2.project03.Project03TestOrdering.*; import static edu.caltech.cs2.project03.Project03TestOrdering.*;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
...@@ -152,6 +153,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -152,6 +153,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("addFront() and removeFront() take constant time") @DisplayName("addFront() and removeFront() take constant time")
@Timeout(value = 10, unit = SECONDS)
@Test @Test
public void testFrontDequeOperationComplexity() { public void testFrontDequeOperationComplexity() {
Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> { Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> {
...@@ -172,6 +174,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -172,6 +174,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("addBack() and removeBack() take constant time") @DisplayName("addBack() and removeBack() take constant time")
@Timeout(value = 10, unit = SECONDS)
@Test @Test
public void testBackDequeOperationComplexity() { public void testBackDequeOperationComplexity() {
Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> { Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> {
...@@ -191,6 +194,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -191,6 +194,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("enqueue() and dequeue() take constant time") @DisplayName("enqueue() and dequeue() take constant time")
@Timeout(value = 10, unit = SECONDS)
@Test @Test
public void testQueueOperationComplexity() { public void testQueueOperationComplexity() {
Function<Integer, IQueue<Integer>> provide = (Integer numElements) -> { Function<Integer, IQueue<Integer>> provide = (Integer numElements) -> {
...@@ -209,6 +213,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -209,6 +213,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("push() and pop() take constant time") @DisplayName("push() and pop() take constant time")
@Timeout(value = 10, unit = SECONDS)
@Test @Test
public void testStackOperationComplexity() { public void testStackOperationComplexity() {
Function<Integer, IStack<Integer>> provide = (Integer numElements) -> { Function<Integer, IStack<Integer>> provide = (Integer numElements) -> {
...@@ -227,6 +232,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -227,6 +232,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("peek() takes constant time") @DisplayName("peek() takes constant time")
@Timeout(value = 10, unit = SECONDS)
@Test @Test
public void testPeekComplexity() { public void testPeekComplexity() {
Function<Integer, IStack<Integer>> provide = (Integer numElements) -> { Function<Integer, IStack<Integer>> provide = (Integer numElements) -> {
...@@ -243,6 +249,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -243,6 +249,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("peekFront() takes constant time") @DisplayName("peekFront() takes constant time")
@Timeout(value = 10, unit = SECONDS)
@Test @Test
public void testPeekFrontComplexity() { public void testPeekFrontComplexity() {
Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> { Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> {
...@@ -260,6 +267,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -260,6 +267,7 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests {
@Order(complexityTestLevel) @Order(complexityTestLevel)
@DisplayName("peekBack() takes constant time") @DisplayName("peekBack() takes constant time")
@Timeout(value = 10, unit = SECONDS)
@Test @Test
public void testPeekBackComplexity() { public void testPeekBackComplexity() {
Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> { Function<Integer, IDeque<Integer>> provide = (Integer numElements) -> {
...@@ -276,8 +284,8 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -276,8 +284,8 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests {
} }
@Order(dequeTestLevel) @Order(dequeTestLevel)
@DisplayName("Cycle detection for addFront(...) and addBack(...)") @DisplayName("Cycle detection for addFront(...), addBack(...), removeFront(...), and removeBack(...)")
@ParameterizedTest(name = "Test cycles {1} random numbers with seed = {0}") @ParameterizedTest(name = "Test cycles - {1} random numbers with seed = {0}")
@CsvSource({ "69, 2000", "20, 3000" }) @CsvSource({ "69, 2000", "20, 3000" })
public void checkForCycles(int seed, int size) { public void checkForCycles(int seed, int size) {
Random r = new Random(seed); Random r = new Random(seed);
...@@ -311,8 +319,8 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests { ...@@ -311,8 +319,8 @@ public class LinkedDequeTests implements DequeTests, StackTests, QueueTests {
} }
@Order(dequeTestLevel) @Order(dequeTestLevel)
@DisplayName("Check reverses for addFront(...) and addBack(...)") @DisplayName("Check reverses for addFront(...), addBack(...), removeFront(...), and removeBack(...)")
@ParameterizedTest(name = "Test reverse {1} random numbers with seed = {0}") @ParameterizedTest(name = "Test reverse - {1} random numbers with seed = {0}")
@CsvSource({ "31, 2000", "64, 3000" }) @CsvSource({ "31, 2000", "64, 3000" })
public void checkReverses(int seed, int size) { public void checkReverses(int seed, int size) {
Random r = new Random(seed); Random r = new Random(seed);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment