public void testRandomAddOnQueue() {
    CircularQueue<Integer> q = new CircularQueue<>();
    // Create a queue with 5 elements and capacity 8;
    for (int i = 0; i < 5; i++) {
      q.offer(i);
    }

    q.add(0, 100);
    q.add(3, 200);
    q.add(7, 300);

    Iterator<Integer> i = q.iterator();
    assertEquals(8, q.size());
    assertEquals(new Integer(100), i.next());
    assertEquals(new Integer(0), i.next());
    assertEquals(new Integer(1), i.next());
    assertEquals(new Integer(200), i.next());
    assertEquals(new Integer(2), i.next());
    assertEquals(new Integer(3), i.next());
    assertEquals(new Integer(4), i.next());
    assertEquals(new Integer(300), i.next());

    try {
      i.next();
      fail();
    } catch (Exception e) {
      // an exception signifies a successfull test case
      assertTrue(true);
    }
  }
  public void testRandomAddOnRotatedQueue() {
    CircularQueue<Integer> q = getRotatedQueue();

    q.add(0, 100); // addFirst
    q.add(2, 200);
    q.add(4, 300);
    q.add(10, 400);
    q.add(12, 500); // addLast

    Iterator<Integer> i = q.iterator();
    assertEquals(13, q.size());
    assertEquals(new Integer(100), i.next());
    assertEquals(new Integer(0), i.next());
    assertEquals(new Integer(200), i.next());
    assertEquals(new Integer(1), i.next());
    assertEquals(new Integer(300), i.next());
    assertEquals(new Integer(2), i.next());
    assertEquals(new Integer(3), i.next());
    assertEquals(new Integer(4), i.next());
    assertEquals(new Integer(5), i.next());
    assertEquals(new Integer(6), i.next());
    assertEquals(new Integer(400), i.next());
    assertEquals(new Integer(7), i.next());
    assertEquals(new Integer(500), i.next());

    try {
      i.next();
      fail();
    } catch (Exception e) {
      // an exception signifies a successfull test case
      assertTrue(true);
    }
  }
  public void testRandomRemoveOnRotatedQueue() {
    CircularQueue<Integer> q = getRotatedQueue();

    q.remove(0); // removeFirst
    q.remove(2); // removeLast in the first half
    q.remove(2); // removeFirst in the first half
    q.remove(4); // removeLast

    Iterator<Integer> i = q.iterator();
    assertEquals(4, q.size());
    assertEquals(new Integer(1), i.next());
    assertEquals(new Integer(2), i.next());
    assertEquals(new Integer(5), i.next());
    assertEquals(new Integer(6), i.next());

    try {
      i.next();
      fail();
    } catch (Exception e) {
      // an exception signifies a successfull test case
      assertTrue(true);
    }
  }