Skip to content

Commit d9764e2

Browse files
Move spliterator invariant checks to CollectionSpliteratorTester
Per review feedback — the spec invariants apply to all spliterators, not just ConcurrentMap ones, so they belong in the common tester. Added checks for all four spec-mandated invariants: - CONCURRENT + SIZED must not coexist - CONCURRENT + IMMUTABLE must not coexist - SUBSIZED requires SIZED - SORTED requires ORDERED Stripped ConcurrentMapSpliteratorTester down to just the CONCURRENT-must-exist assertions and dropped the reflection methods to match the other ConcurrentMap*Tester classes.
1 parent 4d66578 commit d9764e2

File tree

2 files changed

+52
-88
lines changed

2 files changed

+52
-88
lines changed

guava-testlib/src/com/google/common/collect/testing/testers/CollectionSpliteratorTester.java

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,56 @@ public void testSpliteratorNotImmutable_collectionAllowsRemove() {
7575
assertFalse(collection.spliterator().hasCharacteristics(Spliterator.IMMUTABLE));
7676
}
7777

78+
/**
79+
* Tests that the spliterator does not report both {@code CONCURRENT} and {@code SIZED}
80+
* characteristics, which are incompatible per the {@link Spliterator} specification.
81+
*/
82+
public void testSpliteratorNotConcurrentAndSized() {
83+
Spliterator<E> spliterator = collection.spliterator();
84+
assertFalse(
85+
"spliterator should not have both CONCURRENT and SIZED characteristics",
86+
spliterator.hasCharacteristics(Spliterator.CONCURRENT)
87+
&& spliterator.hasCharacteristics(Spliterator.SIZED));
88+
}
89+
90+
/**
91+
* Tests that the spliterator does not report both {@code CONCURRENT} and {@code IMMUTABLE}
92+
* characteristics, which are incompatible per the {@link Spliterator} specification.
93+
*/
94+
public void testSpliteratorNotConcurrentAndImmutable() {
95+
Spliterator<E> spliterator = collection.spliterator();
96+
assertFalse(
97+
"spliterator should not have both CONCURRENT and IMMUTABLE characteristics",
98+
spliterator.hasCharacteristics(Spliterator.CONCURRENT)
99+
&& spliterator.hasCharacteristics(Spliterator.IMMUTABLE));
100+
}
101+
102+
/**
103+
* Tests that if the spliterator reports {@code SORTED}, it also reports {@code ORDERED}, as
104+
* required by the {@link Spliterator} specification.
105+
*/
106+
public void testSpliteratorSortedRequiresOrdered() {
107+
Spliterator<E> spliterator = collection.spliterator();
108+
if (spliterator.hasCharacteristics(Spliterator.SORTED)) {
109+
assertTrue(
110+
"spliterator reporting SORTED must also report ORDERED",
111+
spliterator.hasCharacteristics(Spliterator.ORDERED));
112+
}
113+
}
114+
115+
/**
116+
* Tests that if the spliterator reports {@code SUBSIZED}, it also reports {@code SIZED}, as
117+
* required by the {@link Spliterator} specification.
118+
*/
119+
public void testSpliteratorSubsizedRequiresSized() {
120+
Spliterator<E> spliterator = collection.spliterator();
121+
if (spliterator.hasCharacteristics(Spliterator.SUBSIZED)) {
122+
assertTrue(
123+
"spliterator reporting SUBSIZED must also report SIZED",
124+
spliterator.hasCharacteristics(Spliterator.SIZED));
125+
}
126+
}
127+
78128
@J2ktIncompatible
79129
@GwtIncompatible // reflection
80130
public static Method getSpliteratorNotImmutableCollectionAllowsAddMethod() {

guava-testlib/src/com/google/common/collect/testing/testers/ConcurrentMapSpliteratorTester.java

Lines changed: 2 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,8 @@
1616

1717
package com.google.common.collect.testing.testers;
1818

19-
import static com.google.common.collect.testing.Helpers.getMethod;
20-
2119
import com.google.common.annotations.GwtCompatible;
22-
import com.google.common.annotations.GwtIncompatible;
23-
import com.google.common.annotations.J2ktIncompatible;
2420
import com.google.common.collect.testing.AbstractMapTester;
25-
import java.lang.reflect.Method;
2621
import java.util.Spliterator;
2722
import java.util.concurrent.ConcurrentMap;
2823
import org.jspecify.annotations.NullMarked;
@@ -32,15 +27,14 @@
3227
* A generic JUnit test which tests spliterator characteristics on concurrent map views. Verifies
3328
* that {@link ConcurrentMap} implementations return spliterators with the {@link
3429
* Spliterator#CONCURRENT} characteristic on their {@code entrySet()}, {@code keySet()}, and {@code
35-
* values()} views, and that no spliterator reports both {@code CONCURRENT} and {@code SIZED}
36-
* characteristics (which are mutually incompatible per the Java specification).
30+
* values()} views.
3731
*
3832
* <p>Can't be invoked directly; please see {@link
3933
* com.google.common.collect.testing.ConcurrentMapTestSuiteBuilder}.
4034
*
4135
* @author Guava Authors
4236
*/
43-
@GwtCompatible(emulated = true)
37+
@GwtCompatible
4438
@Ignore("test runners must not instantiate and run this directly, only via suites we build")
4539
// @Ignore affects the Android test runner, which respects JUnit 4 annotations on JUnit 3 tests.
4640
@SuppressWarnings("JUnit4ClassUsedInJUnit3")
@@ -83,84 +77,4 @@ public void testValuesSpliteratorHasConcurrent() {
8377
"values().spliterator() should have CONCURRENT characteristic",
8478
spliterator.hasCharacteristics(Spliterator.CONCURRENT));
8579
}
86-
87-
/**
88-
* Tests that the spliterator returned by {@code entrySet().spliterator()} does not have both
89-
* {@code CONCURRENT} and {@code SIZED} characteristics, which are mutually incompatible per the
90-
* Java specification.
91-
*/
92-
public void testEntrySetSpliteratorNotConcurrentAndSized() {
93-
Spliterator<?> spliterator = getMap().entrySet().spliterator();
94-
assertFalse(
95-
"entrySet().spliterator() should not have both CONCURRENT and SIZED characteristics",
96-
spliterator.hasCharacteristics(Spliterator.CONCURRENT)
97-
&& spliterator.hasCharacteristics(Spliterator.SIZED));
98-
}
99-
100-
/**
101-
* Tests that the spliterator returned by {@code keySet().spliterator()} does not have both {@code
102-
* CONCURRENT} and {@code SIZED} characteristics, which are mutually incompatible per the Java
103-
* specification.
104-
*/
105-
public void testKeySetSpliteratorNotConcurrentAndSized() {
106-
Spliterator<?> spliterator = getMap().keySet().spliterator();
107-
assertFalse(
108-
"keySet().spliterator() should not have both CONCURRENT and SIZED characteristics",
109-
spliterator.hasCharacteristics(Spliterator.CONCURRENT)
110-
&& spliterator.hasCharacteristics(Spliterator.SIZED));
111-
}
112-
113-
/**
114-
* Tests that the spliterator returned by {@code values().spliterator()} does not have both {@code
115-
* CONCURRENT} and {@code SIZED} characteristics, which are mutually incompatible per the Java
116-
* specification.
117-
*/
118-
public void testValuesSpliteratorNotConcurrentAndSized() {
119-
Spliterator<?> spliterator = getMap().values().spliterator();
120-
assertFalse(
121-
"values().spliterator() should not have both CONCURRENT and SIZED characteristics",
122-
spliterator.hasCharacteristics(Spliterator.CONCURRENT)
123-
&& spliterator.hasCharacteristics(Spliterator.SIZED));
124-
}
125-
126-
// Reflection methods for test suppression
127-
128-
@J2ktIncompatible
129-
@GwtIncompatible // reflection
130-
public static Method getEntrySetSpliteratorHasConcurrentMethod() {
131-
return getMethod(ConcurrentMapSpliteratorTester.class, "testEntrySetSpliteratorHasConcurrent");
132-
}
133-
134-
@J2ktIncompatible
135-
@GwtIncompatible // reflection
136-
public static Method getKeySetSpliteratorHasConcurrentMethod() {
137-
return getMethod(ConcurrentMapSpliteratorTester.class, "testKeySetSpliteratorHasConcurrent");
138-
}
139-
140-
@J2ktIncompatible
141-
@GwtIncompatible // reflection
142-
public static Method getValuesSpliteratorHasConcurrentMethod() {
143-
return getMethod(ConcurrentMapSpliteratorTester.class, "testValuesSpliteratorHasConcurrent");
144-
}
145-
146-
@J2ktIncompatible
147-
@GwtIncompatible // reflection
148-
public static Method getEntrySetSpliteratorNotConcurrentAndSizedMethod() {
149-
return getMethod(
150-
ConcurrentMapSpliteratorTester.class, "testEntrySetSpliteratorNotConcurrentAndSized");
151-
}
152-
153-
@J2ktIncompatible
154-
@GwtIncompatible // reflection
155-
public static Method getKeySetSpliteratorNotConcurrentAndSizedMethod() {
156-
return getMethod(
157-
ConcurrentMapSpliteratorTester.class, "testKeySetSpliteratorNotConcurrentAndSized");
158-
}
159-
160-
@J2ktIncompatible
161-
@GwtIncompatible // reflection
162-
public static Method getValuesSpliteratorNotConcurrentAndSizedMethod() {
163-
return getMethod(
164-
ConcurrentMapSpliteratorTester.class, "testValuesSpliteratorNotConcurrentAndSized");
165-
}
16680
}

0 commit comments

Comments
 (0)