Skip to content

Commit

Permalink
[eclipse-ee4j#112]Corrected skip methods behavior of JsonParserImpl; …
Browse files Browse the repository at this point in the history
…created test for these methods

Signed-off-by: Anton Pinsky <[email protected]>
  • Loading branch information
api-from-the-ion committed Nov 13, 2023
1 parent 981cd2f commit c1a42cb
Show file tree
Hide file tree
Showing 4 changed files with 244 additions and 107 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,4 @@ nbproject/
*err_pid*.log
/tck-impl/.gradle/
/tck-impl/build/
/.sdkmanrc
143 changes: 73 additions & 70 deletions impl/src/main/java/org/eclipse/parsson/JsonParserImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -189,26 +189,27 @@ public Stream<JsonValue> getArrayStream() {
JsonMessages.PARSER_GETARRAY_ERR(currentEvent));
}
Spliterator<JsonValue> spliterator =
new Spliterators.AbstractSpliterator<JsonValue>(Long.MAX_VALUE, Spliterator.ORDERED) {
@Override
public Spliterator<JsonValue> trySplit() {
return null;
}
@Override
public boolean tryAdvance(Consumer<? super JsonValue> action) {
if (action == null) {
throw new NullPointerException();
}
if (! hasNext()) {
return false;
}
if (next() == JsonParser.Event.END_ARRAY) {
return false;
}
action.accept(getValue());
return true;
}
};
new Spliterators.AbstractSpliterator<>(Long.MAX_VALUE, Spliterator.ORDERED) {
@Override
public Spliterator<JsonValue> trySplit() {
return null;
}

@Override
public boolean tryAdvance(Consumer<? super JsonValue> action) {
if (action == null) {
throw new NullPointerException();
}
if (!hasNext()) {
return false;
}
if (next() == JsonParser.Event.END_ARRAY) {
return false;
}
action.accept(getValue());
return true;
}
};
return StreamSupport.stream(spliterator, false);
}

Expand All @@ -219,36 +220,37 @@ public Stream<Map.Entry<String, JsonValue>> getObjectStream() {
JsonMessages.PARSER_GETOBJECT_ERR(currentEvent));
}
Spliterator<Map.Entry<String, JsonValue>> spliterator =
new Spliterators.AbstractSpliterator<Map.Entry<String, JsonValue>>(Long.MAX_VALUE, Spliterator.ORDERED) {
@Override
public Spliterator<Map.Entry<String,JsonValue>> trySplit() {
return null;
}
@Override
public boolean tryAdvance(Consumer<? super Map.Entry<String, JsonValue>> action) {
if (action == null) {
throw new NullPointerException();
}
if (! hasNext()) {
return false;
}
JsonParser.Event e = next();
if (e == JsonParser.Event.END_OBJECT) {
return false;
}
if (e != JsonParser.Event.KEY_NAME) {
throw new JsonException(JsonMessages.INTERNAL_ERROR());
}
String key = getString();
if (! hasNext()) {
throw new JsonException(JsonMessages.INTERNAL_ERROR());
}
next();
JsonValue value = getValue();
action.accept(new AbstractMap.SimpleImmutableEntry<>(key, value));
return true;
}
};
new Spliterators.AbstractSpliterator<>(Long.MAX_VALUE, Spliterator.ORDERED) {
@Override
public Spliterator<Map.Entry<String, JsonValue>> trySplit() {
return null;
}

@Override
public boolean tryAdvance(Consumer<? super Map.Entry<String, JsonValue>> action) {
if (action == null) {
throw new NullPointerException();
}
if (!hasNext()) {
return false;
}
JsonParser.Event e = next();
if (e == JsonParser.Event.END_OBJECT) {
return false;
}
if (e != JsonParser.Event.KEY_NAME) {
throw new JsonException(JsonMessages.INTERNAL_ERROR());
}
String key = getString();
if (!hasNext()) {
throw new JsonException(JsonMessages.INTERNAL_ERROR());
}
next();
JsonValue value = getValue();
action.accept(new AbstractMap.SimpleImmutableEntry<>(key, value));
return true;
}
};
return StreamSupport.stream(spliterator, false);
}

Expand All @@ -259,30 +261,31 @@ public Stream<JsonValue> getValueStream() {
JsonMessages.PARSER_GETVALUESTREAM_ERR());
}
Spliterator<JsonValue> spliterator =
new Spliterators.AbstractSpliterator<JsonValue>(Long.MAX_VALUE, Spliterator.ORDERED) {
@Override
public Spliterator<JsonValue> trySplit() {
return null;
}
@Override
public boolean tryAdvance(Consumer<? super JsonValue> action) {
if (action == null) {
throw new NullPointerException();
}
if (! hasNext()) {
return false;
}
next();
action.accept(getValue());
return true;
}
};
new Spliterators.AbstractSpliterator<>(Long.MAX_VALUE, Spliterator.ORDERED) {
@Override
public Spliterator<JsonValue> trySplit() {
return null;
}

@Override
public boolean tryAdvance(Consumer<? super JsonValue> action) {
if (action == null) {
throw new NullPointerException();
}
if (!hasNext()) {
return false;
}
next();
action.accept(getValue());
return true;
}
};
return StreamSupport.stream(spliterator, false);
}

@Override
public void skipArray() {
if (currentEvent == Event.START_ARRAY) {
if (currentContext instanceof ArrayContext) {
currentContext.skip();
currentContext = stack.pop();
currentEvent = Event.END_ARRAY;
Expand All @@ -291,7 +294,7 @@ public void skipArray() {

@Override
public void skipObject() {
if (currentEvent == Event.START_OBJECT) {
if (currentContext instanceof ObjectContext) {
currentContext.skip();
currentContext = stack.pop();
currentEvent = Event.END_OBJECT;
Expand Down
73 changes: 73 additions & 0 deletions impl/src/test/java/org/eclipse/parsson/JsonParserFixture.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/

package org.eclipse.parsson;

import java.io.StringReader;
import java.util.function.Consumer;
import java.util.function.Supplier;

import jakarta.json.Json;
import jakarta.json.JsonArray;
import jakarta.json.JsonObject;
import jakarta.json.stream.JsonParser;

/**
* Class with methods that creates JsonParser with different configuration from different sources and runs the test code with this parser
*/
public class JsonParserFixture {
/**
* Runs the test code with JsonParser created from the given JsonObject
*
* @param object JsonObject to create JsonParser from
* @param parserConsumer test code to run with the created JsonParser
*/
public static void testWithCreateParserFromObject(JsonObject object, Consumer<JsonParser> parserConsumer) {
testWithParser(() -> Json.createParserFactory(null).createParser(object), parserConsumer);
}

/**
* Runs the test code with JsonParser created from the given JsonArray
*
* @param array JsonArray to create JsonParser from
* @param parserConsumer test code to run with the created JsonParser
*/
public static void testWithCreateParserFromArray(JsonArray array, Consumer<JsonParser> parserConsumer) {
testWithParser(() -> Json.createParserFactory(null).createParser(array), parserConsumer);
}

/**
* Runs the test code with JsonParser created from the given String
*
* @param string String with JSON to create JsonParser from
* @param parserConsumer test code to run with the created JsonParser
*/
public static void testWithCreateParserFromString(String string, Consumer<JsonParser> parserConsumer) {
testWithParser(() -> Json.createParser(new StringReader(string)), parserConsumer);
}

/**
* Runs the test code with JsonParser created from the given String
*
* @param parserSupplier Supplier of JsonParser to create JsonParser from
* @param parserConsumer test code to run with the created JsonParser
*/
private static void testWithParser(Supplier<JsonParser> parserSupplier, Consumer<JsonParser> parserConsumer) {
try (JsonParser parser = parserSupplier.get()) {
parserConsumer.accept(parser);
}
}
}
Loading

0 comments on commit c1a42cb

Please sign in to comment.