This is an automated email from the ASF dual-hosted git repository. andy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit ec7f71c6e3108c2d5249c216a9db8e08ac0bd3d0 Author: Andy Seaborne <a...@apache.org> AuthorDate: Wed Aug 21 21:39:18 2024 +0100 Provide validity test in PeekIterator --- .../apache/jena/atlas/iterator/PeekIterator.java | 21 ++- .../apache/jena/atlas/iterator/TS_Iterator.java | 4 +- .../jena/atlas/iterator/TestIteratorPeek.java | 107 --------------- .../jena/atlas/iterator/TestPeekIterator.java | 150 +++++++++++++++++++++ ...atorPushback.java => TestPushbackIterator.java} | 2 +- 5 files changed, 170 insertions(+), 114 deletions(-) diff --git a/jena-base/src/main/java/org/apache/jena/atlas/iterator/PeekIterator.java b/jena-base/src/main/java/org/apache/jena/atlas/iterator/PeekIterator.java index edcf2ba542..41982e3bc1 100644 --- a/jena-base/src/main/java/org/apache/jena/atlas/iterator/PeekIterator.java +++ b/jena-base/src/main/java/org/apache/jena/atlas/iterator/PeekIterator.java @@ -20,9 +20,11 @@ package org.apache.jena.atlas.iterator; import java.util.Iterator ; import java.util.NoSuchElementException ; -import java.util.Queue ; +import java.util.Optional; -/** PeekIterator - it is one slot ahead from the wrapped iterator */ +/** + * PeekIterator - it is one slot ahead reading from the wrapped iterator. + */ public class PeekIterator<T> implements Iterator<T> { private final Iterator<T> iter ; @@ -62,8 +64,9 @@ public class PeekIterator<T> implements Iterator<T> /** * Peek the next element or return null - * - * @see Queue#peek + * This code predates {@link Optional}. + * See "{@link #slotIsValid}" to check if a null is + * end-of-iterator or a valid return element. */ public T peek() { if ( finished ) @@ -71,6 +74,16 @@ public class PeekIterator<T> implements Iterator<T> return slot; } + /** + * Return whether the peek'ed element exists of not. + * When the underlying iterator may yield null as a valid value of "next", + * use this to determine the status of the "peek()". + * This code predates {@link Optional}. + */ + public boolean slotIsValid() { + return ! finished; + } + /** Peek the next element or throw NoSuchElementException */ public T element() { if ( finished ) diff --git a/jena-base/src/test/java/org/apache/jena/atlas/iterator/TS_Iterator.java b/jena-base/src/test/java/org/apache/jena/atlas/iterator/TS_Iterator.java index 2768cc9fc5..e39097562d 100644 --- a/jena-base/src/test/java/org/apache/jena/atlas/iterator/TS_Iterator.java +++ b/jena-base/src/test/java/org/apache/jena/atlas/iterator/TS_Iterator.java @@ -24,8 +24,8 @@ import org.junit.runners.Suite ; @RunWith(Suite.class) @Suite.SuiteClasses( { TestIter.class - , TestIteratorPeek.class - , TestIteratorPushback.class + , TestPeekIterator.class + , TestPushbackIterator.class , TestIteratorWithHistory.class , TestIteratorWithBuffer.class , TestIteratorSlotted.class diff --git a/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIteratorPeek.java b/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIteratorPeek.java deleted file mode 100644 index bacbf6200f..0000000000 --- a/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIteratorPeek.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * 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.jena.atlas.iterator; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList ; -import java.util.List ; - -import org.junit.Test ; - -public class TestIteratorPeek -{ - List<String> data0 = new ArrayList<>() ; - List<String> data1 = new ArrayList<>() ; - { - data1.add("a") ; - } - - List<String> data2 = new ArrayList<>() ; - { - data2.add("x") ; - data2.add("y") ; - data2.add("z") ; - } - - @Test public void iter_01() - { - Iter<String> iter = Iter.iter(data2) ; - iter = iter.append(data2.iterator()) ; - test(iter, "x", "y", "z", "x", "y", "z") ; - } - - private static void test(Iter<?> iter, Object... items) - { - for ( Object x : items ) - { - assertTrue(iter.hasNext()) ; - assertEquals(x, iter.next()) ; - } - assertFalse(iter.hasNext()) ; - } - - private static PeekIterator<String> create(String...a) { - List<String> x = List.of(a); - return new PeekIterator<>(x.iterator()); - } - - @Test public void peek_1() - { - PeekIterator<String> peek = create("a", "b", "c") ; - assertEquals("a", peek.peek()) ; - test(Iter.iter(peek), "a", "b", "c") ; - } - - @Test public void peek_2() - { - PeekIterator<String> peek = create() ; - assertFalse(peek.hasNext()) ; - } - - @Test public void peek_3() - { - PeekIterator<String> peek = create("a") ; - assertEquals("a", peek.peek()) ; - } - - @Test public void peek_4() - { - PeekIterator<String> peek = create("a") ; - assertEquals("a", peek.peek()) ; - assertEquals("a", peek.peek()) ; - assertEquals("a", peek.next()) ; - assertFalse(peek.hasNext()) ; - } - - @Test public void peek_5() - { - PeekIterator<String> peek = create("a", "b") ; - assertEquals("a", peek.peek()) ; - assertEquals("a", peek.peek()) ; - assertEquals("a", peek.next()) ; - assertTrue(peek.hasNext()) ; - assertEquals("b", peek.peek()) ; - assertEquals("b", peek.peek()) ; - assertEquals("b", peek.next()) ; - assertFalse(peek.hasNext()) ; - } -} diff --git a/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestPeekIterator.java b/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestPeekIterator.java new file mode 100644 index 0000000000..a33d4f58ee --- /dev/null +++ b/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestPeekIterator.java @@ -0,0 +1,150 @@ +/* + * 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.jena.atlas.iterator; + +import static org.junit.Assert.*; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +public class TestPeekIterator { + + + @Test + public void iter_01() { + List<String> data = List.of("x", "y", "z"); + Iter<String> iter = Iter.iter(data); + iter = iter.append(data.iterator()); + test(iter, "x", "y", "z", "x", "y", "z"); + } + + private static void test(Iter<? > iter, Object...items) { + for ( Object x : items ) { + assertTrue(iter.hasNext()); + assertEquals(x, iter.next()); + } + assertFalse(iter.hasNext()); + } + + private static PeekIterator<String> create(String...a) { + // Use ArrayList to allow nulls. + List<String> x = new ArrayList<>(); + for ( String str : a ) + x.add(str); + return new PeekIterator<>(x.iterator()); + } + + @Test + public void peek_1() { + PeekIterator<String> peek = create("a", "b", "c"); + assertEquals("a", peek.peek()); + test(Iter.iter(peek), "a", "b", "c"); + } + + @Test + public void peek_2() { + PeekIterator<String> peek = create(); + assertFalse(peek.hasNext()); + } + + @Test + public void peek_3() { + PeekIterator<String> peek = create("a"); + assertEquals("a", peek.peek()); + } + + @Test + public void peek_4() { + PeekIterator<String> peek = create("a"); + assertEquals("a", peek.peek()); + assertEquals("a", peek.peek()); + assertEquals("a", peek.next()); + assertFalse(peek.hasNext()); + } + + @Test + public void peek_5() { + PeekIterator<String> peek = create("a", "b"); + assertEquals("a", peek.peek()); + assertEquals("a", peek.peek()); + assertEquals("a", peek.next()); + assertTrue(peek.hasNext()); + assertEquals("b", peek.peek()); + assertEquals("b", peek.peek()); + assertEquals("b", peek.next()); + assertFalse(peek.hasNext()); + } + + @Test + public void peek_6() { + PeekIterator<String> peek = create("a", null, "b"); + assertEquals("a", peek.peek()); + assertEquals("a", peek.next()); + + assertNull(peek.peek()); + assertTrue(peek.slotIsValid()); + assertTrue(peek.hasNext()); + assertNull(peek.next()); + + assertEquals("b", peek.peek()); + assertEquals("b", peek.next()); + assertFalse(peek.hasNext()); + + assertNull(peek.peek()); + assertFalse(peek.slotIsValid()); + } + + @Test + public void peek_7() { + PeekIterator<String> peek = create("a", "b", null); + assertEquals("a", peek.peek()); + assertEquals("a", peek.next()); + assertEquals("b", peek.peek()); + assertEquals("b", peek.next()); + + assertNull(peek.peek()); + assertTrue(peek.slotIsValid()); + assertTrue(peek.hasNext()); + + assertNull(peek.next()); + assertFalse(peek.hasNext()); + } + + @Test + public void peek_8() { + PeekIterator<String> peek = create(null, "a", "b"); + assertNull(peek.peek()); + assertTrue(peek.slotIsValid()); + assertTrue(peek.hasNext()); + assertEquals(null, peek.next()); + + assertEquals("a", peek.peek()); + assertEquals("a", peek.next()); + assertEquals("b", peek.peek()); + assertEquals("b", peek.next()); + + assertNull(peek.peek()); + assertFalse(peek.slotIsValid()); + assertFalse(peek.hasNext()); + } +} diff --git a/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIteratorPushback.java b/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestPushbackIterator.java similarity index 98% rename from jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIteratorPushback.java rename to jena-base/src/test/java/org/apache/jena/atlas/iterator/TestPushbackIterator.java index 541460af04..c57aef54c1 100644 --- a/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestIteratorPushback.java +++ b/jena-base/src/test/java/org/apache/jena/atlas/iterator/TestPushbackIterator.java @@ -26,7 +26,7 @@ import java.util.List ; import org.junit.Test ; -public class TestIteratorPushback +public class TestPushbackIterator { static List<String> data = new ArrayList<>() ;