Skip to content

Commit

Permalink
Fixed FilteringIterator.hasNext advances iterator every time it is ca…
Browse files Browse the repository at this point in the history
…lled, with patch from Gabe Hicks (issue 23)
  • Loading branch information
npgall committed Oct 2, 2013
1 parent 858bc48 commit 022af00
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ public FilteringIterator(Iterator<O> wrappedIterator) {

@Override
public boolean hasNext() {
if(nextObjectIsNull || nextObject != null) {
return true;
}
while (wrappedIterator.hasNext()) {
nextObject = wrappedIterator.next();
if (isValid(nextObject)) {
Expand All @@ -54,14 +57,13 @@ public boolean hasNext() {

@Override
public O next() {
if (nextObjectIsNull) {
nextObjectIsNull = false;
return null;
}
if (nextObject == null) {
if(!hasNext()) {
throw new NoSuchElementException();
}
return nextObject;
O objectToReturn = nextObject;
nextObject = null;
nextObjectIsNull = false;
return objectToReturn;
}

public abstract boolean isValid(O object);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/**
* Copyright 2012 Niall Gallagher
*
* 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.
*/
package com.googlecode.cqengine.resultset.filter;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.NoSuchElementException;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;

public class FilteringIteratorTest {
@Test
public void testHasNextDoesNotAdvanceIterator(){
List<String> testList = Arrays.asList("abc", "bcd", "cde");
FilteringIterator<String> iterator = new FilteringIterator<String>(testList.iterator()) {
@Override
public boolean isValid(String object) {
return true;
}
};
iterator.hasNext();
iterator.hasNext();
iterator.hasNext();
assertThat(iterator.next(), is("abc"));
}

@Test
public void testNextPopulatedWithoutCallingHasNext(){
List<String> testList = Arrays.asList("abc", "bcd", "cde");
FilteringIterator<String> iterator = new FilteringIterator<String>(testList.iterator()) {
@Override
public boolean isValid(String object) {
return true;
}
};
assertThat(iterator.next(), is("abc"));
}

@Test
public void testDelegatedIteratorHasNulls() {
List<String> testList = Arrays.asList("abc", null, "cde");
FilteringIterator<String> iterator = new FilteringIterator<String>(testList.iterator()) {
@Override
public boolean isValid(String object) {
return true;
}
};
assertThat(iterator.next(), is("abc"));
assertThat(iterator.next(), nullValue());
assertThat(iterator.next(), is("cde"));
assertThat(iterator.hasNext(), is(false));
}

@Test
public void testFiltering() {
List<String> testList = Arrays.asList("aaa", "bbb", "aab", "bba");
FilteringIterator<String> iterator = new FilteringIterator<String>(testList.iterator()) {
@Override
public boolean isValid(String object) {
return object.startsWith("aa");
}
};
assertThat(iterator.next(), is("aaa"));
assertThat(iterator.next(), is("aab"));
assertThat(iterator.hasNext(), is(false));
}

@Test(expected = NoSuchElementException.class)
public void testEmptyDelegate() {
List<String> testList = Arrays.asList();
FilteringIterator<String> iterator = new FilteringIterator<String>(testList.iterator()) {
@Override
public boolean isValid(String object) {
return true;
}
};
iterator.next();
}
}

0 comments on commit 022af00

Please sign in to comment.