/** * Copyright (c) 2002-2010 "Neo Technology," * Network Engine for Objects in Lund AB [http://neotechnology.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.neo4j.commons.iterator; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import org.junit.Test; import org.neo4j.helpers.collection.CachingIterator; import org.neo4j.helpers.collection.FilteringIterator; import org.neo4j.helpers.collection.IteratorUtil; import org.neo4j.helpers.collection.PagingIterator; import org.neo4j.helpers.collection.RangeIterator; public class TestCommonIterators { @Test public void testNoDuplicatesFilteringIterator() { List<Integer> ints = Arrays.asList( 1, 2, 2, 40, 100, 40, 101, 2, 3 ); Iterator<Integer> iterator = FilteringIterator.noDuplicates( ints.iterator() ); assertEquals( (Integer) 1, iterator.next() ); assertEquals( (Integer) 2, iterator.next() ); assertEquals( (Integer) 40, iterator.next() ); assertEquals( (Integer) 100, iterator.next() ); assertEquals( (Integer) 101, iterator.next() ); assertEquals( (Integer) 3, iterator.next() ); } @Test public void testCachingIterator() { Iterator<Integer> source = new RangeIterator( 8 ); CachingIterator<Integer> caching = new CachingIterator<Integer>( source ); try { caching.previous(); fail( "Should throw exception" ); } catch ( NoSuchElementException e ) { /* Good */ } try { caching.current(); fail( "Should throw exception" ); } catch ( NoSuchElementException e ) { /* Good */ } // Next and previous assertEquals( 0, caching.position() ); assertTrue( caching.hasNext() ); assertEquals( 0, caching.position() ); assertFalse( caching.hasPrevious() ); assertEquals( (Integer) 0, caching.next() ); assertTrue( caching.hasNext() ); assertTrue( caching.hasPrevious() ); assertEquals( (Integer) 1, caching.next() ); assertTrue( caching.hasPrevious() ); assertEquals( (Integer) 1, caching.current() ); assertEquals( (Integer) 2, caching.next() ); assertEquals( (Integer) 2, caching.current() ); assertEquals( (Integer) 3, (Integer) caching.position() ); assertEquals( (Integer) 2, caching.current() ); assertTrue( caching.hasPrevious() ); assertEquals( (Integer) 2, caching.previous() ); assertEquals( (Integer) 2, caching.current() ); assertEquals( (Integer) 2, (Integer) caching.position() ); assertEquals( (Integer) 1, caching.previous() ); assertEquals( (Integer) 1, caching.current() ); assertEquals( (Integer) 1, (Integer) caching.position() ); assertEquals( (Integer) 0, caching.previous() ); assertEquals( (Integer) 0, (Integer) caching.position() ); assertFalse( caching.hasPrevious() ); // Positioning try { caching.position( -1 ); fail( "Shouldn't be able to set a lower value than 0" ); } catch ( IllegalArgumentException e ) { /* Good */ } assertEquals( (Integer) 0, caching.current() ); assertEquals( 0, caching.position( 3 ) ); try { caching.current(); fail( "Shouldn't be able to call current() after a call to position(int)" ); } catch ( NoSuchElementException e ) { /* Good */ } assertTrue( caching.hasNext() ); assertEquals( (Integer) 3, caching.next() ); assertEquals( (Integer) 3, caching.current() ); assertTrue( caching.hasPrevious() ); assertEquals( (Integer) 4, caching.next() ); assertEquals( 5, caching.position() ); assertEquals( (Integer) 4, caching.previous() ); assertEquals( (Integer) 4, caching.current() ); assertEquals( (Integer) 4, caching.current() ); assertEquals( 4, caching.position() ); assertEquals( (Integer) 3, caching.previous() ); assertEquals( 3, caching.position() ); try { caching.position( 9 ); fail( "Shouldn't be able to set a position which is too big" ); } catch ( NoSuchElementException e ) { /* Good */ } assertEquals( 3, caching.position( 8 ) ); assertTrue( caching.hasPrevious() ); assertFalse( caching.hasNext() ); try { caching.next(); fail( "Shouldn't be able to go beyond last item" ); } catch ( NoSuchElementException e ) { /* Good */ } assertEquals( 8, caching.position() ); assertEquals( (Integer) 7, caching.previous() ); assertEquals( (Integer) 6, caching.previous() ); assertEquals( 6, caching.position( 0 ) ); assertEquals( (Integer) 0, caching.next() ); } @Test public void testPagingIterator() { Iterator<Integer> source = new RangeIterator( 24 ); PagingIterator<Integer> pager = new PagingIterator<Integer>( source, 10 ); assertEquals( 0, pager.page() ); assertTrue( pager.hasNext() ); assertPage( pager.nextPage(), 10, 0 ); assertTrue( pager.hasNext() ); assertEquals( 1, pager.page() ); assertTrue( pager.hasNext() ); assertPage( pager.nextPage(), 10, 10 ); assertTrue( pager.hasNext() ); assertEquals( 2, pager.page() ); assertTrue( pager.hasNext() ); assertPage( pager.nextPage(), 4, 20 ); assertFalse( pager.hasNext() ); pager.page( 1 ); assertEquals( 1, pager.page() ); assertTrue( pager.hasNext() ); assertPage( pager.nextPage(), 10, 10 ); assertTrue( pager.hasNext() ); } private void assertPage( Iterator<Integer> page, int size, int plus ) { for ( int i = 0; i < size; i++ ) { assertTrue( page.hasNext() ); assertEquals( (Integer) (i+plus), page.next() ); } assertFalse( page.hasNext() ); } @Test public void testFirstElement() { Object object = new Object(); Object object2 = new Object(); // first Iterable assertEquals( object, IteratorUtil.first( Arrays.asList( object, object2 ) ) ); assertEquals( object, IteratorUtil.first( Arrays.asList( object ) ) ); try { IteratorUtil.first( Arrays.asList() ); fail( "Should fail" ); } catch ( NoSuchElementException e ) { /* Good */ } // first Iterator assertEquals( object, IteratorUtil.first( Arrays.asList( object, object2 ).iterator() ) ); assertEquals( object, IteratorUtil.first( Arrays.asList( object ).iterator() ) ); try { IteratorUtil.first( Arrays.asList().iterator() ); fail( "Should fail" ); } catch ( NoSuchElementException e ) { /* Good */ } // firstOrNull Iterable assertEquals( object, IteratorUtil.firstOrNull( Arrays.asList( object, object2 ) ) ); assertEquals( object, IteratorUtil.firstOrNull( Arrays.asList( object ) ) ); assertNull( IteratorUtil.firstOrNull( Arrays.asList() ) ); // firstOrNull Iterator assertEquals( object, IteratorUtil.firstOrNull( Arrays.asList( object, object2 ).iterator() ) ); assertEquals( object, IteratorUtil.firstOrNull( Arrays.asList( object ).iterator() ) ); assertNull( IteratorUtil.firstOrNull( Arrays.asList().iterator() ) ); } @Test public void testLastElement() { Object object = new Object(); Object object2 = new Object(); // last Iterable assertEquals( object2, IteratorUtil.last( Arrays.asList( object, object2 ) ) ); assertEquals( object, IteratorUtil.last( Arrays.asList( object ) ) ); try { IteratorUtil.last( Arrays.asList() ); fail( "Should fail" ); } catch ( NoSuchElementException e ) { /* Good */ } // last Iterator assertEquals( object2, IteratorUtil.last( Arrays.asList( object, object2 ).iterator() ) ); assertEquals( object, IteratorUtil.last( Arrays.asList( object ).iterator() ) ); try { IteratorUtil.last( Arrays.asList().iterator() ); fail( "Should fail" ); } catch ( NoSuchElementException e ) { /* Good */ } // lastOrNull Iterable assertEquals( object2, IteratorUtil.lastOrNull( Arrays.asList( object, object2 ) ) ); assertEquals( object, IteratorUtil.lastOrNull( Arrays.asList( object ) ) ); assertNull( IteratorUtil.lastOrNull( Arrays.asList() ) ); // lastOrNull Iterator assertEquals( object2, IteratorUtil.lastOrNull( Arrays.asList( object, object2 ).iterator() ) ); assertEquals( object, IteratorUtil.lastOrNull( Arrays.asList( object ).iterator() ) ); assertNull( IteratorUtil.lastOrNull( Arrays.asList().iterator() ) ); } @Test public void testSingleElement() { Object object = new Object(); Object object2 = new Object(); // single Iterable assertEquals( object, IteratorUtil.single( Arrays.asList( object ) ) ); try { IteratorUtil.single( Arrays.asList() ); fail( "Should fail" ); } catch ( Exception e ) { /* Good */ } try { IteratorUtil.single( Arrays.asList( object, object2 ) ); fail( "Should fail" ); } catch ( Exception e ) { /* Good */ } // single Iterator assertEquals( object, IteratorUtil.single( Arrays.asList( object ).iterator() ) ); try { IteratorUtil.single( Arrays.asList().iterator() ); fail( "Should fail" ); } catch ( Exception e ) { /* Good */ } try { IteratorUtil.single( Arrays.asList( object, object2 ).iterator() ); fail( "Should fail" ); } catch ( Exception e ) { /* Good */ } // singleOrNull Iterable assertEquals( object, IteratorUtil.singleOrNull( Arrays.asList( object ) ) ); assertNull( IteratorUtil.singleOrNull( Arrays.asList() ) ); try { IteratorUtil.singleOrNull( Arrays.asList( object, object2 ) ); fail( "Should fail" ); } catch ( Exception e ) { /* Good */ } // singleOrNull Iterator assertEquals( object, IteratorUtil.singleOrNull( Arrays.asList( object ).iterator() ) ); assertNull( IteratorUtil.singleOrNull( Arrays.asList().iterator() ) ); try { IteratorUtil.singleOrNull( Arrays.asList( object, object2 ).iterator() ); fail( "Should fail" ); } catch ( Exception e ) { /* Good */ } } }