From f8d205c88434a8aba5d96802b7ad08fef9355382 Mon Sep 17 00:00:00 2001
From: Archie Shahidullah <archie@caltech.edu>
Date: Mon, 27 Jul 2020 13:50:39 -0700
Subject: [PATCH] Update CircularArrayFixedSizeQueueTests.java

---
 .../CircularArrayFixedSizeQueueTests.java     | 50 ++++++++++++++++++-
 1 file changed, 49 insertions(+), 1 deletion(-)

diff --git a/tests/edu/caltech/cs2/datastructures/CircularArrayFixedSizeQueueTests.java b/tests/edu/caltech/cs2/datastructures/CircularArrayFixedSizeQueueTests.java
index 6123c3f..9ec19ce 100644
--- a/tests/edu/caltech/cs2/datastructures/CircularArrayFixedSizeQueueTests.java
+++ b/tests/edu/caltech/cs2/datastructures/CircularArrayFixedSizeQueueTests.java
@@ -17,6 +17,7 @@ import java.util.function.Function;
 
 import static edu.caltech.cs2.project03.Project03TestOrdering.*;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
 
 @Tag("B")
 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@@ -70,6 +71,13 @@ public class CircularArrayFixedSizeQueueTests implements FixedSizeQueueTests {
     Reflection.assertNoPublicFields(CircularArrayFixedSizeQueue.class);
   }
 
+  @Order(classSpecificTestLevel)
+  @DisplayName("There are no protected fields")
+  @Test
+  public void testNoProtectedFields() {
+    Reflection.assertNoProtectedFields(LinkedDeque.class);
+  }
+
   @Order(classSpecificTestLevel)
   @DisplayName("The public interface is correct")
   @Test
@@ -158,4 +166,44 @@ public class CircularArrayFixedSizeQueueTests implements FixedSizeQueueTests {
 
     RuntimeInstrumentation.assertAtMost("peek", RuntimeInstrumentation.ComplexityType.CONSTANT, provide, peek, 8);
   }
-}
\ No newline at end of file
+
+  @Order(fixedSizeQueueLevel)
+  @DisplayName("Test iterator matches reference")
+  @ParameterizedTest(name = "Test iterator with {1} random values with seed = {0} and fixed array size = {2}")
+  @CsvSource({
+          "69, 200, 20", "21, 300, 200"
+  })
+  public void testWrapAround(int seed, int numVals, int queueSize) {
+    Random r = new Random(seed);
+    Constructor c = Reflection.getConstructor(CircularArrayFixedSizeQueue.class, int.class);
+    IFixedSizeQueue<Object> me = newFixedSizeQueue(queueSize);
+    Queue<Object> reference = new java.util.ArrayDeque<>();
+    assertEquals(queueSize, me.capacity(), "capacity does not match expected value");
+    for (int i = 0; i < queueSize; i++) {
+        int num = r.nextInt();
+        assertEquals(false, me.isFull(), "queue should not be full");
+        assertEquals(true, me.enqueue(num), "enqueue should be successful");
+        reference.add(num);
+
+    }
+    for (int i = 0; i < numVals; i++) {
+      me.enqueue(me.dequeue());
+      reference.add(reference.remove());
+      assertEquals(reference.peek(), me.peek(),"return values of peek()s are not equal");
+      assertEquals(reference.size(), me.size(), "size()s are not equal");
+      assertEquals(queueSize, me.capacity(), "capacity does not match expected value");
+      Iterator<Object> meItr = me.iterator();
+      Iterator<Object> refItr = reference.iterator();
+      while (meItr.hasNext()) {
+        if (!refItr.hasNext()) {
+          fail("Implemented queue has more values than reference queue");
+        }
+        assertEquals(refItr.next(), meItr.next(), "next()s are not equal");
+      }
+      if (refItr.hasNext()) {
+        fail("Reference queue has more values than implemented queue");
+      }
+    }
+  }
+}
+
-- 
GitLab