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<>() ;

Reply via email to