diff --git a/json-path/src/main/java/com/jayway/jsonpath/internal/function/sequence/AbstractSequenceAggregation.java b/json-path/src/main/java/com/jayway/jsonpath/internal/function/sequence/AbstractSequenceAggregation.java index 24c87e136..741b42612 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/internal/function/sequence/AbstractSequenceAggregation.java +++ b/json-path/src/main/java/com/jayway/jsonpath/internal/function/sequence/AbstractSequenceAggregation.java @@ -30,7 +30,7 @@ public Object invoke(String currentPath, PathRef parent, Object model, Evaluatio return objectList.get(targetIndex); } else { int realIndex = objectList.size() + targetIndex; - if (realIndex > 0) { + if (realIndex >= 0) { return objectList.get(realIndex); } else { throw new JsonPathException("Target index:" + targetIndex + " larger than object count:" + objectList.size()); diff --git a/json-path/src/test/java/com/jayway/jsonpath/internal/function/SequenceBoundaryTest.java b/json-path/src/test/java/com/jayway/jsonpath/internal/function/SequenceBoundaryTest.java new file mode 100644 index 000000000..a53adce64 --- /dev/null +++ b/json-path/src/test/java/com/jayway/jsonpath/internal/function/SequenceBoundaryTest.java @@ -0,0 +1,28 @@ +package com.jayway.jsonpath.internal.function; + +import com.jayway.jsonpath.JsonPath; +import com.jayway.jsonpath.JsonPathException; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class SequenceBoundaryTest { + @Test + void lastOfSingleton() { + Object result = JsonPath.read("[42]", "$.last()"); + assertThat(result).isEqualTo(42); + } + + @Test + void negativeIndexCanSelectFirstElement() { + Object result = JsonPath.read("[1,2,3]", "$.index(-3)"); + assertThat(result).isEqualTo(1); + } + + @Test + void negativeIndexBeforeStartStillFails() { + assertThatThrownBy(() -> JsonPath.read("[1,2,3]", "$.index(-4)")) + .isInstanceOf(JsonPathException.class); + } +}