You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2024/08/28 21:55:20 UTC
(jena) 08/12: Provide validity test in PeekIterator
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 <an...@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<>() ;