Skip to content

Commit ba7e42d

Browse files
committed
Optimize common cases
1 parent 85e79f8 commit ba7e42d

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

junit-platform-commons/src/main/java/org/junit/platform/commons/util/CollectionUtils.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,13 @@ public static Stream<?> toStream(Object object) {
210210
*/
211211
@API(status = INTERNAL, since = "1.9.2")
212212
public static <T> void forEachInReverseOrder(List<T> list, Consumer<? super T> action) {
213+
if (list.isEmpty()) {
214+
return;
215+
}
216+
if (list.size() == 1) {
217+
action.accept(list.get(0));
218+
return;
219+
}
213220
for (ListIterator<T> iterator = list.listIterator(list.size()); iterator.hasPrevious();) {
214221
action.accept(iterator.previous());
215222
}

platform-tests/src/test/java/org/junit/platform/commons/util/CollectionUtilsTests.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,13 @@
3434
import org.junit.jupiter.api.DynamicTest;
3535
import org.junit.jupiter.api.Test;
3636
import org.junit.jupiter.api.TestFactory;
37+
import org.junit.jupiter.api.extension.ParameterContext;
3738
import org.junit.jupiter.params.ParameterizedTest;
39+
import org.junit.jupiter.params.converter.ArgumentConversionException;
40+
import org.junit.jupiter.params.converter.ArgumentConverter;
41+
import org.junit.jupiter.params.converter.ConvertWith;
3842
import org.junit.jupiter.params.provider.Arguments;
43+
import org.junit.jupiter.params.provider.CsvSource;
3944
import org.junit.jupiter.params.provider.MethodSource;
4045
import org.junit.jupiter.params.provider.ValueSource;
4146
import org.junit.platform.commons.PreconditionViolationException;
@@ -277,13 +282,26 @@ private void toStreamWithPrimitiveArray(Object primitiveArray) {
277282
}
278283
}
279284

280-
@Test
281-
void iteratesListElementsInReverseOrder() {
282-
var items = List.of("foo", "bar", "baz");
285+
@ParameterizedTest
286+
@CsvSource(delimiter = '|', nullValues = "N/A", textBlock = """
287+
foo,bar,baz | baz,bar,foo
288+
foo,bar | bar,foo
289+
foo | foo
290+
N/A | N/A
291+
""")
292+
void iteratesListElementsInReverseOrder(@ConvertWith(CommaSeparator.class) List<String> input,
293+
@ConvertWith(CommaSeparator.class) List<String> expected) {
283294
var result = new ArrayList<>();
284295

285-
CollectionUtils.forEachInReverseOrder(items, result::add);
296+
CollectionUtils.forEachInReverseOrder(input, result::add);
286297

287-
assertThat(result).containsExactly("baz", "bar", "foo");
298+
assertEquals(expected, result);
299+
}
300+
301+
private static class CommaSeparator implements ArgumentConverter {
302+
@Override
303+
public Object convert(Object source, ParameterContext context) throws ArgumentConversionException {
304+
return source == null ? List.of() : List.of(((String) source).split(","));
305+
}
288306
}
289307
}

0 commit comments

Comments
 (0)