package com.cloudhopper.commons.util;
/*
* #%L
* ch-commons-util
* %%
* Copyright (C) 2012 Cloudhopper by Twitter
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import org.junit.*;
public class CircularIndexTest {
@Test
public void calculateNextIndex() throws Exception {
CircularIndex index = new CircularIndex(4);
Assert.assertEquals(1, index.calculateNewIndex(0, 1));
Assert.assertEquals(2, index.calculateNewIndex(1, 1));
Assert.assertEquals(3, index.calculateNewIndex(2, 1));
Assert.assertEquals(0, index.calculateNewIndex(3, 1));
// handle wraparound -- one previous from zero is the end
Assert.assertEquals(3, index.calculateNewIndex(0, -1));
Assert.assertEquals(2, index.calculateNewIndex(0, -2));
}
@Test
public void constructor1() throws Exception {
// initialize the index with other parameters
CircularIndex index = new CircularIndex(4, 0, 0);
//
// initial states of everything
//
Assert.assertEquals(3, index.getMaxSize());
Assert.assertEquals(4, index.getCapacity());
Assert.assertEquals(0, index.getSize());
Assert.assertEquals(true, index.isEmpty());
Assert.assertEquals(false, index.isFull());
Assert.assertEquals(-1, index.getFirst());
Assert.assertEquals(-1, index.getLast());
Assert.assertEquals(0, index.getNextFirst());
Assert.assertEquals(0, index.getNextLast());
Assert.assertEquals(false, index.removeFirst());
// check internals
Assert.assertEquals(0, index.getInternalFirst());
Assert.assertEquals(0, index.getInternalNext());
try {
index = new CircularIndex(4, 0, 4);
Assert.fail();
} catch (IllegalArgumentException e) {
// correct behavior
}
// initialize the index with other parameters
index = new CircularIndex(4, 1, 3);
//
// initial states of everything
//
Assert.assertEquals(3, index.getMaxSize());
Assert.assertEquals(4, index.getCapacity());
Assert.assertEquals(3, index.getSize());
Assert.assertEquals(false, index.isEmpty());
Assert.assertEquals(true, index.isFull());
Assert.assertEquals(1, index.getFirst());
Assert.assertEquals(3, index.getLast());
Assert.assertEquals(-1, index.getNextFirst());
Assert.assertEquals(-1, index.getNextLast());
// check internals
Assert.assertEquals(1, index.getInternalFirst());
Assert.assertEquals(0, index.getInternalNext());
index = new CircularIndex(4, 1, 2);
//
// initial states of everything
//
Assert.assertEquals(3, index.getMaxSize());
Assert.assertEquals(4, index.getCapacity());
Assert.assertEquals(2, index.getSize());
Assert.assertEquals(false, index.isEmpty());
Assert.assertEquals(false, index.isFull());
Assert.assertEquals(1, index.getFirst());
Assert.assertEquals(2, index.getLast());
Assert.assertEquals(0, index.getNextFirst());
Assert.assertEquals(3, index.getNextLast());
// check internals
Assert.assertEquals(1, index.getInternalFirst());
Assert.assertEquals(3, index.getInternalNext());
}
@Test
public void addAndRemoveCorrectness() throws Exception {
CircularIndex index = new CircularIndex(4);
//
// initial states of everything
//
Assert.assertEquals(3, index.getMaxSize());
Assert.assertEquals(4, index.getCapacity());
Assert.assertEquals(0, index.getSize());
Assert.assertEquals(true, index.isEmpty());
Assert.assertEquals(false, index.isFull());
Assert.assertEquals(-1, index.getFirst());
Assert.assertEquals(-1, index.getLast());
Assert.assertEquals(0, index.getNextFirst());
Assert.assertEquals(0, index.getNextLast());
Assert.assertEquals(false, index.removeFirst());
// check internals
Assert.assertEquals(0, index.getInternalFirst());
Assert.assertEquals(0, index.getInternalNext());
//
// add a new item
//
Assert.assertEquals(true, index.addLast());
Assert.assertEquals(1, index.getSize());
Assert.assertEquals(false, index.isEmpty());
Assert.assertEquals(false, index.isFull());
Assert.assertEquals(0, index.getFirst());
Assert.assertEquals(0, index.getLast());
Assert.assertEquals(3, index.getNextFirst());
Assert.assertEquals(1, index.getNextLast());
// check internals
Assert.assertEquals(0, index.getInternalFirst());
Assert.assertEquals(1, index.getInternalNext());
//
// remove first item
//
Assert.assertEquals(true, index.removeFirst());
Assert.assertEquals(0, index.getSize());
Assert.assertEquals(true, index.isEmpty());
Assert.assertEquals(false, index.isFull());
Assert.assertEquals(-1, index.getFirst());
Assert.assertEquals(-1, index.getLast());
Assert.assertEquals(1, index.getNextFirst());
Assert.assertEquals(1, index.getNextLast());
Assert.assertEquals(false, index.removeFirst());
// check internals
Assert.assertEquals(1, index.getInternalFirst());
Assert.assertEquals(1, index.getInternalNext());
//
// add a new item
//
Assert.assertEquals(true, index.addLast());
Assert.assertEquals(1, index.getSize());
Assert.assertEquals(false, index.isEmpty());
Assert.assertEquals(false, index.isFull());
Assert.assertEquals(1, index.getFirst());
Assert.assertEquals(1, index.getLast());
Assert.assertEquals(0, index.getNextFirst());
Assert.assertEquals(2, index.getNextLast());
// check internals
Assert.assertEquals(1, index.getInternalFirst());
Assert.assertEquals(2, index.getInternalNext());
//
// add a new item
//
Assert.assertEquals(true, index.addLast());
Assert.assertEquals(2, index.getSize());
Assert.assertEquals(false, index.isEmpty());
Assert.assertEquals(false, index.isFull());
Assert.assertEquals(1, index.getFirst());
Assert.assertEquals(2, index.getLast());
Assert.assertEquals(0, index.getNextFirst());
Assert.assertEquals(3, index.getNextLast());
// check internals (last would have hit capacity and looped back to zero)
Assert.assertEquals(1, index.getInternalFirst());
Assert.assertEquals(3, index.getInternalNext());
//
// add a new item -- this should be the last we can insert
//
Assert.assertEquals(true, index.addLast());
Assert.assertEquals(3, index.getSize());
Assert.assertEquals(false, index.isEmpty());
Assert.assertEquals(true, index.isFull());
Assert.assertEquals(1, index.getFirst());
// since an item was added above, then removed, then only empty space
// open in the index is at position zero -- already looped around!
Assert.assertEquals(3, index.getLast());
// at capacity, so no new elements!
Assert.assertEquals(-1, index.getNextFirst());
Assert.assertEquals(-1, index.getNextLast());
// check internals
Assert.assertEquals(1, index.getInternalFirst());
Assert.assertEquals(0, index.getInternalNext());
// since we're full these should fail
Assert.assertEquals(false, index.addLast());
Assert.assertEquals(false, index.addFirst());
//
// let's remove 2 items
//
Assert.assertEquals(true, index.removeFirst());
Assert.assertEquals(true, index.removeFirst());
Assert.assertEquals(1, index.getSize());
Assert.assertEquals(false, index.isEmpty());
Assert.assertEquals(false, index.isFull());
Assert.assertEquals(3, index.getFirst());
Assert.assertEquals(3, index.getLast());
Assert.assertEquals(2, index.getNextFirst());
Assert.assertEquals(0, index.getNextLast());
// check internals
Assert.assertEquals(3, index.getInternalFirst());
Assert.assertEquals(0, index.getInternalNext());
//
// add 2 items onto front
//
Assert.assertEquals(true, index.addFirst());
Assert.assertEquals(true, index.addFirst());
Assert.assertEquals(3, index.getSize());
Assert.assertEquals(false, index.isEmpty());
Assert.assertEquals(true, index.isFull());
Assert.assertEquals(1, index.getFirst());
Assert.assertEquals(3, index.getLast());
// at capacity, so no new elements!
Assert.assertEquals(-1, index.getNextFirst());
Assert.assertEquals(-1, index.getNextLast());
// check internals
Assert.assertEquals(1, index.getInternalFirst());
Assert.assertEquals(0, index.getInternalNext());
// since we're full these should fail
Assert.assertEquals(false, index.addLast());
Assert.assertEquals(false, index.addFirst());
//
// remove first 2 items
//
Assert.assertEquals(true, index.removeFirst());
Assert.assertEquals(true, index.removeFirst());
//
// add onto back, will loop around
//
Assert.assertEquals(true, index.addLast());
Assert.assertEquals(2, index.getSize());
Assert.assertEquals(false, index.isEmpty());
Assert.assertEquals(false, index.isFull());
Assert.assertEquals(3, index.getFirst());
Assert.assertEquals(0, index.getLast());
Assert.assertEquals(2, index.getNextFirst());
Assert.assertEquals(1, index.getNextLast());
// check internals
Assert.assertEquals(3, index.getInternalFirst());
Assert.assertEquals(1, index.getInternalNext());
//
// remove first
//
Assert.assertEquals(true, index.removeFirst());
Assert.assertEquals(1, index.getSize());
Assert.assertEquals(false, index.isEmpty());
Assert.assertEquals(false, index.isFull());
Assert.assertEquals(0, index.getFirst());
Assert.assertEquals(0, index.getLast());
Assert.assertEquals(3, index.getNextFirst());
Assert.assertEquals(1, index.getNextLast());
// check internals
Assert.assertEquals(0, index.getInternalFirst());
Assert.assertEquals(1, index.getInternalNext());
}
@Test
public void resetOnZero() throws Exception {
// initialize with automatic reset back to zero
CircularIndex index = new CircularIndex(4, true);
//
// initial states of everything
//
Assert.assertEquals(3, index.getMaxSize());
Assert.assertEquals(4, index.getCapacity());
Assert.assertEquals(0, index.getSize());
Assert.assertEquals(true, index.isEmpty());
Assert.assertEquals(false, index.isFull());
Assert.assertEquals(-1, index.getFirst());
Assert.assertEquals(-1, index.getLast());
Assert.assertEquals(0, index.getNextFirst());
Assert.assertEquals(0, index.getNextLast());
Assert.assertEquals(false, index.removeFirst());
// check internals
Assert.assertEquals(0, index.getInternalFirst());
Assert.assertEquals(0, index.getInternalNext());
// add 2 items
Assert.assertEquals(true, index.addLast());
Assert.assertEquals(true, index.addLast());
Assert.assertEquals(2, index.getSize());
Assert.assertEquals(0, index.getInternalFirst());
Assert.assertEquals(2, index.getInternalNext());
// remove them
Assert.assertEquals(true, index.removeFirst());
Assert.assertEquals(true, index.removeFirst());
// with auto reset back to zero, this should have reset the internal first and next
Assert.assertEquals(0, index.getSize());
Assert.assertEquals(0, index.getInternalFirst());
Assert.assertEquals(0, index.getInternalNext());
// add another item, this should now be item zero
Assert.assertEquals(true, index.addLast());
Assert.assertEquals(1, index.getSize());
Assert.assertEquals(0, index.getFirst());
Assert.assertEquals(0, index.getLast());
Assert.assertEquals(0, index.getInternalFirst());
Assert.assertEquals(1, index.getInternalNext());
}
}