From 932f28c69b8573ad85fde2e0fa00cb3a46d93c2e Mon Sep 17 00:00:00 2001 From: Oli Gillespie Date: Fri, 20 Feb 2026 16:50:00 +0000 Subject: [PATCH] 8376698: Add Spliterator tests for TreeMap sub-maps Reviewed-by: liach, rriggs --- .../share/classes/java/util/TreeMap.java | 6 +++- ...SpliteratorTraversingAndSplittingTest.java | 28 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/java.base/share/classes/java/util/TreeMap.java b/src/java.base/share/classes/java/util/TreeMap.java index f8eea8c8d8f..8b6e9dc0bd6 100644 --- a/src/java.base/share/classes/java/util/TreeMap.java +++ b/src/java.base/share/classes/java/util/TreeMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2138,10 +2138,12 @@ public class TreeMap return null; } public void forEachRemaining(Consumer action) { + Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } public boolean tryAdvance(Consumer action) { + Objects.requireNonNull(action); if (hasNext()) { action.accept(next()); return true; @@ -2176,10 +2178,12 @@ public class TreeMap return null; } public void forEachRemaining(Consumer action) { + Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } public boolean tryAdvance(Consumer action) { + Objects.requireNonNull(action); if (hasNext()) { action.accept(next()); return true; diff --git a/test/jdk/java/util/Spliterator/SpliteratorTraversingAndSplittingTest.java b/test/jdk/java/util/Spliterator/SpliteratorTraversingAndSplittingTest.java index ece63bfe813..c8f882b599d 100644 --- a/test/jdk/java/util/Spliterator/SpliteratorTraversingAndSplittingTest.java +++ b/test/jdk/java/util/Spliterator/SpliteratorTraversingAndSplittingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2026, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -126,12 +126,19 @@ public class SpliteratorTraversingAndSplittingTest extends SpliteratorTestHelper List exp; + List expRev; + Map mExp; + Map mExpRev; + SpliteratorDataBuilder(List data, List exp) { this.data = data; this.exp = exp; + this.expRev = new ArrayList<>(exp); + Collections.reverse(this.expRev); this.mExp = createMap(exp); + this.mExpRev = createMap(expRev); } Map createMap(List l) { @@ -166,12 +173,23 @@ public class SpliteratorTraversingAndSplittingTest extends SpliteratorTestHelper addMap(m, description); } + void addDescendingMap(Function, ? extends Map> m) { + String description = "new " + m.apply(Collections.emptyMap()).getClass().getName(); + addDescendingMap(m, description); + } + void addMap(Function, ? extends Map> m, String description) { add(description + ".keySet().spliterator()", () -> m.apply(mExp).keySet().spliterator()); add(description + ".values().spliterator()", () -> m.apply(mExp).values().spliterator()); add(description + ".entrySet().spliterator()", mExp.entrySet(), () -> m.apply(mExp).entrySet().spliterator()); } + void addDescendingMap(Function, ? extends Map> m, String description) { + add(description + ".keySet().spliterator()", expRev, () -> m.apply(mExp).keySet().spliterator()); + add(description + ".values().spliterator()", expRev, () -> m.apply(mExp).values().spliterator()); + add(description + ".entrySet().spliterator()", mExpRev.entrySet(), () -> m.apply(mExp).entrySet().spliterator()); + } + StringBuilder joiner(String description) { return new StringBuilder(description). append(" {"). @@ -639,8 +657,14 @@ public class SpliteratorTraversingAndSplittingTest extends SpliteratorTestHelper return cm; }, "new java.util.WeakHashMap(1, size + 1)"); - // @@@ Descending maps etc db.addMap(TreeMap::new); + db.addMap(m -> new TreeMap<>(m).tailMap(Integer.MIN_VALUE)); + db.addMap(m -> new TreeMap<>(m).headMap(Integer.MAX_VALUE)); + db.addMap(m -> new TreeMap<>(m).subMap(Integer.MIN_VALUE, Integer.MAX_VALUE)); + db.addDescendingMap(m -> new TreeMap<>(m).descendingMap()); + db.addDescendingMap(m -> new TreeMap<>(m).descendingMap().tailMap(Integer.MAX_VALUE)); + db.addDescendingMap(m -> new TreeMap<>(m).descendingMap().headMap(Integer.MIN_VALUE)); + db.addDescendingMap(m -> new TreeMap<>(m).descendingMap().subMap(Integer.MAX_VALUE, Integer.MIN_VALUE)); db.addMap(ConcurrentHashMap::new);