Author: tn
Date: Thu May 28 09:42:01 2015
New Revision: 1682188
URL: http://svn.apache.org/r1682188
Log:
Add unit test for SkippingIterator, fix bug.
Added:
commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/SkippingIteratorTest.java
(with props)
Modified:
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/SkippingIterator.java
(contents, props changed)
Modified:
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/SkippingIterator.java
URL:
http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/SkippingIterator.java?rev=1682188&r1=1682187&r2=1682188&view=diff
==============================================================================
---
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/SkippingIterator.java
(original)
+++
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/SkippingIterator.java
Thu May 28 09:42:01 2015
@@ -23,7 +23,7 @@ import java.util.Iterator;
* before that position.
*
* @since 4.1
- * @version $Id: $
+ * @version $Id$
*/
public class SkippingIterator<E> extends AbstractIteratorDecorator<E> {
@@ -64,7 +64,6 @@ public class SkippingIterator<E> extends
private void init() {
while (pos < offset && hasNext()) {
next();
- pos++;
}
}
Propchange:
commons/proper/collections/trunk/src/main/java/org/apache/commons/collections4/iterators/SkippingIterator.java
------------------------------------------------------------------------------
svn:keywords = Id Revision HeadURL
Added:
commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/SkippingIteratorTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/SkippingIteratorTest.java?rev=1682188&view=auto
==============================================================================
---
commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/SkippingIteratorTest.java
(added)
+++
commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/SkippingIteratorTest.java
Thu May 28 09:42:01 2015
@@ -0,0 +1,300 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You 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.
+ */
+package org.apache.commons.collections4.iterators;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.junit.Test;
+
+/**
+ * A unit test to test the basic functions of {@link SkippingIterator}.
+ *
+ * @version $Id$
+ */
+public class SkippingIteratorTest<E> extends AbstractIteratorTest<E> {
+
+ /** Test array of size 7 */
+ private String[] testArray = {
+ "a", "b", "c", "d", "e", "f", "g"
+ };
+
+ private List<E> testList;
+
+ public SkippingIteratorTest(final String testName) {
+ super(testName);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void setUp()
+ throws Exception {
+ super.setUp();
+ testList = Arrays.asList((E[]) testArray);
+ }
+
+ @Override
+ public Iterator<E> makeEmptyIterator() {
+ return new SkippingIterator<E>(Collections.<E>emptyList().iterator(),
0);
+ }
+
+ @Override
+ public Iterator<E> makeObject() {
+ return new SkippingIterator<E>(new ArrayList<E>(testList).iterator(),
1);
+ }
+
+ // ---------------- Tests ---------------------
+
+ /**
+ * Test a decorated iterator bounded such that the first element returned
is
+ * at an index greater its first element, and the last element returned is
+ * at an index less than its last element.
+ */
+ @Test
+ public void testSkipping() {
+ Iterator<E> iter = new SkippingIterator<E>(testList.iterator(), 2);
+
+ assertTrue(iter.hasNext());
+ assertEquals("c", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("d", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("e", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("f", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("g", iter.next());
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test a decorated iterator bounded such that the <code>offset</code> is
+ * zero, in that the SkippingIterator should return all the same elements
+ * as its decorated iterator.
+ */
+ @Test
+ public void testSameAsDecorated() {
+ Iterator<E> iter = new SkippingIterator<E>(testList.iterator(), 0);
+
+ assertTrue(iter.hasNext());
+ assertEquals("a", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("b", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("c", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("d", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("e", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("f", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("g", iter.next());
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test the case if the <code>offset</code> passed to the constructor is
+ * greater than the decorated iterator's size. The SkippingIterator should
+ * behave as if there are no more elements to return.
+ */
+ @Test
+ public void testOffsetGreaterThanSize() {
+ Iterator<E> iter = new SkippingIterator<E>(testList.iterator(), 10);
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test the case if a negative <code>offset</code> is passed to the
+ * constructor. {@link IllegalArgumentException} is expected.
+ */
+ @Test
+ public void testNegativeOffset() {
+ try {
+ new SkippingIterator<E>(testList.iterator(), -1);
+ fail("Expected IllegalArgumentException.");
+ } catch (IllegalArgumentException iae) { /* Success case */
+ }
+ }
+
+ /**
+ * Test the <code>remove()</code> method being called without
+ * <code>next()</code> being called first.
+ */
+ @Test
+ public void testRemoveWithoutCallingNext() {
+ List<E> testListCopy = new ArrayList<E>(testList);
+ Iterator<E> iter = new SkippingIterator<E>(testListCopy.iterator(), 1);
+
+ try {
+ iter.remove();
+ fail("Expected IllegalStateException.");
+ } catch (IllegalStateException ise) { /* Success case */
+ }
+ }
+
+ /**
+ * Test the <code>remove()</code> method being called twice without calling
+ * <code>next()</code> in between.
+ */
+ @Test
+ public void testRemoveCalledTwice() {
+ List<E> testListCopy = new ArrayList<E>(testList);
+ Iterator<E> iter = new SkippingIterator<E>(testListCopy.iterator(), 1);
+
+ assertTrue(iter.hasNext());
+ assertEquals("b", iter.next());
+ iter.remove();
+
+ try {
+ iter.remove();
+ fail("Expected IllegalStateException.");
+ } catch (IllegalStateException ise) { /* Success case */
+ }
+ }
+
+ /**
+ * Test removing the first element. Verify that the element is removed from
+ * the underlying collection.
+ */
+ @Test
+ public void testRemoveFirst() {
+ List<E> testListCopy = new ArrayList<E>(testList);
+ Iterator<E> iter = new SkippingIterator<E>(testListCopy.iterator(), 4);
+
+ assertTrue(iter.hasNext());
+ assertEquals("e", iter.next());
+
+ iter.remove();
+ assertFalse(testListCopy.contains("e"));
+
+ assertTrue(iter.hasNext());
+ assertEquals("f", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("g", iter.next());
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test removing an element in the middle of the iterator. Verify that the
+ * element is removed from the underlying collection.
+ */
+ @Test
+ public void testRemoveMiddle() {
+ List<E> testListCopy = new ArrayList<E>(testList);
+ Iterator<E> iter = new SkippingIterator<E>(testListCopy.iterator(), 3);
+
+ assertTrue(iter.hasNext());
+ assertEquals("d", iter.next());
+
+ iter.remove();
+ assertFalse(testListCopy.contains("d"));
+
+ assertTrue(iter.hasNext());
+ assertEquals("e", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("f", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("g", iter.next());
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test removing the last element. Verify that the element is removed from
+ * the underlying collection.
+ */
+ @Test
+ public void testRemoveLast() {
+ List<E> testListCopy = new ArrayList<E>(testList);
+ Iterator<E> iter = new SkippingIterator<E>(testListCopy.iterator(), 5);
+
+ assertTrue(iter.hasNext());
+ assertEquals("f", iter.next());
+ assertTrue(iter.hasNext());
+ assertEquals("g", iter.next());
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+
+ iter.remove();
+ assertFalse(testListCopy.contains("g"));
+
+ assertFalse(iter.hasNext());
+ try {
+ iter.next();
+ fail("Expected NoSuchElementException.");
+ } catch (NoSuchElementException nsee) { /* Success case */
+ }
+ }
+
+ /**
+ * Test the case if the decorated iterator does not support the
+ * <code>remove()</code> method and throws an {@link
UnsupportedOperationException}.
+ */
+ @Test
+ public void testRemoveUnsupported() {
+ Iterator<E> mockIterator = new
AbstractIteratorDecorator<E>(testList.iterator()) {
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+
+ Iterator<E> iter = new SkippingIterator<E>(mockIterator, 1);
+ assertTrue(iter.hasNext());
+ assertEquals("b", iter.next());
+ try {
+ iter.remove();
+ fail("Expected UnsupportedOperationException.");
+ } catch (UnsupportedOperationException usoe) { /* Success case */
+ }
+ }
+}
Propchange:
commons/proper/collections/trunk/src/test/java/org/apache/commons/collections4/iterators/SkippingIteratorTest.java
------------------------------------------------------------------------------
svn:keywords = Id Revision HeadURL