diff --git a/pom.xml b/pom.xml index 9865dcc..4069116 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ 1.8 1.8 1.1.5 - 5.4.2 + 5.5.1 diff --git a/src/main/java/org/leadpony/jsonp/testsuite/tests/JsonParserSkipTest.java b/src/main/java/org/leadpony/jsonp/testsuite/tests/JsonParserSkipTest.java new file mode 100644 index 0000000..067a6ef --- /dev/null +++ b/src/main/java/org/leadpony/jsonp/testsuite/tests/JsonParserSkipTest.java @@ -0,0 +1,192 @@ +/* + * Copyright 2019 the JSON-P Test Suite Authors. + * + * Licensed 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.leadpony.jsonp.testsuite.tests; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertTimeoutPreemptively; + +import java.io.StringReader; +import java.time.Duration; + +import javax.json.Json; +import javax.json.stream.JsonParser; +import javax.json.stream.JsonParserFactory; +import javax.json.stream.JsonParser.Event; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; + +/** + * @author leadpony + */ +public class JsonParserSkipTest { + + private static JsonParserFactory parserFactory; + + @BeforeAll + public static void setUpOnce() { + parserFactory = Json.createParserFactory(null); + } + + /** + * Test cases for {@code JsonParser#skipArray()}. + * + * @author leadpony + */ + enum SkipArrayTestCase implements JsonSource { + EMPTY_ARRAY("[]", 1, 3), + SIMPLE_ARRAY("[1,2,3]", 1, 8), + ARRAY_IN_ARRAY("[[1,2],[3,4]]", 2, 7, Event.START_ARRAY), + ARRAY_IN_OBJECT("{\"a\":[1,2],\"b\":[3,4]}", 3, 11, Event.KEY_NAME); + + private final String json; + final int iterations; + final int columnNumber; + final Event event; + + SkipArrayTestCase(String json, int iterations, int columnNumber) { + this(json, iterations, columnNumber, null); + } + + SkipArrayTestCase(String json, int iterations, int columnNumber, Event event) { + this.json = json; + this.iterations = iterations; + this.columnNumber = columnNumber; + this.event = event; + } + + @Override + public String getJson() { + return json; + } + } + + @ParameterizedTest + @EnumSource(SkipArrayTestCase.class) + public void skipArrayShouldSkipArrayAsExpected(SkipArrayTestCase test) { + JsonParser parser = createJsonParser(test.getJson()); + + int iterations = test.iterations; + while (iterations-- > 0) { + parser.next(); + } + + parser.skipArray(); + + long column = parser.getLocation().getColumnNumber(); + Event event = parser.hasNext() ? parser.next() : null; + + parser.close(); + + assertThat(column).isEqualTo(test.columnNumber); + assertThat(event).isSameAs(test.event); + } + + /** + * @see https://github.com/eclipse-ee4j/jsonp/pull/147 + */ + @Test + public void skipArrayShouldNotLoopForeverIfNotClosed() { + String json = "[1,2,3"; + JsonParser parser = createJsonParser(json); + parser.next(); + + assertTimeoutPreemptively(Duration.ofMillis(500), () -> { + try { + parser.skipArray(); + } catch (Exception e) { + } + }); + } + + /** + * Test cases for {@code JsonParser#skipObject()}. + * + * @author leadpony + */ + enum SkipObjectTestCase implements JsonSource { + EMPTY_OBJECT("{}", 1, 3), + SIMPLE_OBJECT("{\"a\":1,\"b\":2}", 1, 14), + OBJECT_IN_ARRAY( + "[{\"a\":1,\"b\":2},{\"c\":3,\"d\":4}]", + 2, 15, Event.START_OBJECT); + + private final String json; + final int iterations; + final int columnNumber; + final Event event; + + SkipObjectTestCase(String json, int iterations, int columnNumber) { + this(json, iterations, columnNumber, null); + } + + SkipObjectTestCase(String json, int iterations, int columnNumber, Event event) { + this.json = json; + this.iterations = iterations; + this.columnNumber = columnNumber; + this.event = event; + } + + @Override + public String getJson() { + return json; + } + } + + @ParameterizedTest + @EnumSource(SkipObjectTestCase.class) + public void skipObjectShouldSkipArrayAsExpected(SkipObjectTestCase test) { + JsonParser parser = createJsonParser(test.getJson()); + + int iterations = test.iterations; + while (iterations-- > 0) { + parser.next(); + } + + parser.skipObject(); + + long column = parser.getLocation().getColumnNumber(); + Event event = parser.hasNext() ? parser.next() : null; + + parser.close(); + + assertThat(column).isEqualTo(test.columnNumber); + assertThat(event).isSameAs(test.event); + } + + /** + * @see https://github.com/eclipse-ee4j/jsonp/pull/147 + */ + @Test + public void skipObjectShouldNotLoopForeverIfNotClosed() { + String json = "{\"a\":1"; + JsonParser parser = createJsonParser(json); + parser.next(); + + assertTimeoutPreemptively(Duration.ofMillis(500), () -> { + try { + parser.skipObject(); + } catch (Exception e) { + } + }); + } + + private JsonParser createJsonParser(String json) { + return parserFactory.createParser(new StringReader(json)); + } +} diff --git a/src/main/java/org/leadpony/jsonp/testsuite/tests/JsonParserTest.java b/src/main/java/org/leadpony/jsonp/testsuite/tests/JsonParserTest.java index db40e69..5b0a99c 100644 --- a/src/main/java/org/leadpony/jsonp/testsuite/tests/JsonParserTest.java +++ b/src/main/java/org/leadpony/jsonp/testsuite/tests/JsonParserTest.java @@ -1023,115 +1023,6 @@ public void getValueStreamShouldReturnsValuesAsStream(ValueStreamTestCase test) parser.close(); } - /** - * Test cases for {@code JsonParser#skipArray()}. - * - * @author leadpony - */ - enum SkipArrayTestCase implements JsonSource { - EMPTY_ARRAY("[]", 1, 3), - SIMPLE_ARRAY("[1,2,3]", 1, 8), - ARRAY_IN_ARRAY("[[1,2],[3,4]]", 2, 7, Event.START_ARRAY), - ARRAY_IN_OBJECT("{\"a\":[1,2],\"b\":[3,4]}", 3, 11, Event.KEY_NAME); - - private final String json; - final int iterations; - final int columnNumber; - final Event event; - - SkipArrayTestCase(String json, int iterations, int columnNumber) { - this(json, iterations, columnNumber, null); - } - - SkipArrayTestCase(String json, int iterations, int columnNumber, Event event) { - this.json = json; - this.iterations = iterations; - this.columnNumber = columnNumber; - this.event = event; - } - - @Override - public String getJson() { - return json; - } - } - - @ParameterizedTest - @EnumSource(SkipArrayTestCase.class) - public void skipArrayShouldSkipArrayAsExpected(SkipArrayTestCase test) { - JsonParser parser = createJsonParser(test.getJson()); - - int iterations = test.iterations; - while (iterations-- > 0) { - parser.next(); - } - - parser.skipArray(); - - long column = parser.getLocation().getColumnNumber(); - Event event = parser.hasNext() ? parser.next() : null; - - parser.close(); - - assertThat(column).isEqualTo(test.columnNumber); - assertThat(event).isSameAs(test.event); - } - - /** - * Test cases for {@code JsonParser#skipObject()}. - * - * @author leadpony - */ - enum SkipObjectTestCase implements JsonSource { - EMPTY_OBJECT("{}", 1, 3), - SIMPLE_OBJECT("{\"a\":1,\"b\":2}", 1, 14), - OBJECT_IN_ARRAY( - "[{\"a\":1,\"b\":2},{\"c\":3,\"d\":4}]", - 2, 15, Event.START_OBJECT); - - private final String json; - final int iterations; - final int columnNumber; - final Event event; - - SkipObjectTestCase(String json, int iterations, int columnNumber) { - this(json, iterations, columnNumber, null); - } - - SkipObjectTestCase(String json, int iterations, int columnNumber, Event event) { - this.json = json; - this.iterations = iterations; - this.columnNumber = columnNumber; - this.event = event; - } - - @Override - public String getJson() { - return json; - } - } - - @ParameterizedTest - @EnumSource(SkipObjectTestCase.class) - public void skipObjectShouldSkipArrayAsExpected(SkipObjectTestCase test) { - JsonParser parser = createJsonParser(test.getJson()); - - int iterations = test.iterations; - while (iterations-- > 0) { - parser.next(); - } - - parser.skipObject(); - - long column = parser.getLocation().getColumnNumber(); - Event event = parser.hasNext() ? parser.next() : null; - - parser.close(); - - assertThat(column).isEqualTo(test.columnNumber); - assertThat(event).isSameAs(test.event); - } - private JsonParser createJsonParser(String json) { return parserFactory.createParser(new StringReader(json)); }