first commit, reading primitives, testfiles
This commit is contained in:
commit
e1874de683
334 changed files with 1245 additions and 0 deletions
17
.gitignore
vendored
Normal file
17
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
# Created by .ignore support plugin (hsz.mobi)
|
||||
### Maven template
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
|
||||
*.iml
|
||||
out/
|
||||
.idea/
|
||||
68
src/main/java/nl/sander/jsontoy2/ByteBuf.java
Normal file
68
src/main/java/nl/sander/jsontoy2/ByteBuf.java
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.*;
|
||||
|
||||
/**
|
||||
* storage like ArrayList, with specialized array
|
||||
*/
|
||||
public class ByteBuf {
|
||||
|
||||
private ByteBuffer data;
|
||||
|
||||
public ByteBuf() {
|
||||
this(64);
|
||||
}
|
||||
|
||||
public ByteBuf(final int initialSize) {
|
||||
data = ByteBuffer.allocate(initialSize);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
data.flip();
|
||||
|
||||
CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder(); // decode is not threadsafe, might put it in threadlocal
|
||||
// but I don't think this (newDecoder()+config) is expensive
|
||||
|
||||
decoder.onMalformedInput(CodingErrorAction.REPLACE)
|
||||
.onUnmappableCharacter(CodingErrorAction.REPLACE)
|
||||
;
|
||||
|
||||
try {
|
||||
return decoder.decode(data).toString();
|
||||
} catch (CharacterCodingException e) {
|
||||
throw new JsonReadException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
data.clear();
|
||||
}
|
||||
|
||||
public void add(final byte c) {
|
||||
if (data.remaining() == 0) {
|
||||
enlarge(1);
|
||||
}
|
||||
data.put(c);
|
||||
}
|
||||
|
||||
public void add(final byte[] c) {
|
||||
if (data.remaining() < c.length) {
|
||||
enlarge(c.length);
|
||||
}
|
||||
data.put(c);
|
||||
}
|
||||
|
||||
private void enlarge(final int size) {
|
||||
final int length1 = 2 * data.limit();
|
||||
final int length2 = data.limit() + size;
|
||||
ByteBuffer newData = ByteBuffer.allocate(Math.max(length1, length2));
|
||||
data.flip();
|
||||
newData.put(data);
|
||||
data = newData;
|
||||
}
|
||||
|
||||
public int length() {
|
||||
return data.limit() - data.remaining();
|
||||
}
|
||||
}
|
||||
183
src/main/java/nl/sander/jsontoy2/IoReader.java
Normal file
183
src/main/java/nl/sander/jsontoy2/IoReader.java
Normal file
|
|
@ -0,0 +1,183 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
public class IoReader {
|
||||
private static final int HEX_RADIX = 16;
|
||||
private final InputStream inputStream;
|
||||
private final ByteBuf characterBuffer = new ByteBuf();
|
||||
private final ByteBuf encodedCodePointBuffer = new ByteBuf(4);
|
||||
private boolean escaping = false;
|
||||
private boolean encoded = false;
|
||||
private final ByteBuffer convertBuffer = ByteBuffer.allocate(4);
|
||||
private byte current;
|
||||
private int linecount = 0;
|
||||
|
||||
protected IoReader(InputStream inputStream) {
|
||||
this.inputStream = inputStream;
|
||||
advance();
|
||||
}
|
||||
|
||||
protected IoReader(String jsonString) {
|
||||
this.inputStream = new ByteArrayInputStream(jsonString.getBytes());
|
||||
advance();
|
||||
}
|
||||
|
||||
public Integer readInteger() {
|
||||
String value = readNumeric();
|
||||
return Double.valueOf(value).intValue();
|
||||
}
|
||||
|
||||
public Long readLong() {
|
||||
String value = readNumeric();
|
||||
return Long.parseLong(value);
|
||||
}
|
||||
|
||||
public Float readFloat() {
|
||||
String value = readNumeric();
|
||||
return Float.parseFloat(value);
|
||||
}
|
||||
|
||||
public Double readDouble() {
|
||||
String value = readNumeric();
|
||||
return Double.parseDouble(value);
|
||||
}
|
||||
|
||||
public Short readShort() {
|
||||
String value = readNumeric();
|
||||
return Short.parseShort(value);
|
||||
}
|
||||
|
||||
public Byte readByte() {
|
||||
String value = readNumeric();
|
||||
return Byte.parseByte(value);
|
||||
}
|
||||
|
||||
public Character readCharacter() {
|
||||
eat('\"');
|
||||
char currentChar = (char) current;
|
||||
eat('\"');
|
||||
return currentChar;
|
||||
}
|
||||
|
||||
public Boolean readBoolean() {
|
||||
characterBuffer.clear();
|
||||
while (Character.isAlphabetic(current)) {
|
||||
characterBuffer.add(current);
|
||||
advance();
|
||||
}
|
||||
|
||||
return characterBuffer.toString().equalsIgnoreCase("TRUE");
|
||||
}
|
||||
|
||||
boolean isNumeric(int c) {
|
||||
return Character.isDigit(c) || c == '.' || c == 'e' || c == '-' || c == '+';
|
||||
}
|
||||
|
||||
private String readNumeric() {
|
||||
characterBuffer.clear();
|
||||
if (current == '-') {
|
||||
characterBuffer.add(current);
|
||||
advance();
|
||||
}
|
||||
while (current > -1 && isNumeric(current)) {
|
||||
characterBuffer.add(current);
|
||||
advance();
|
||||
}
|
||||
return characterBuffer.toString();
|
||||
}
|
||||
|
||||
|
||||
public String readString() {
|
||||
eat('\"');
|
||||
|
||||
characterBuffer.clear();
|
||||
boolean endOfString = false;
|
||||
while (current > -1 && !endOfString) {
|
||||
if (current == '\\' && !escaping) {
|
||||
escaping = true;
|
||||
} else {
|
||||
if (!escaping) {
|
||||
// regular character
|
||||
if (current != '\"') {
|
||||
characterBuffer.add(current);
|
||||
} else {
|
||||
endOfString = true;
|
||||
}
|
||||
} else {
|
||||
// json encoded string
|
||||
if (current == 'u') {
|
||||
encoded = true;
|
||||
} else if (current == 'n') {
|
||||
linecount++;
|
||||
characterBuffer.add("\n".getBytes());
|
||||
escaping = false;
|
||||
} else if (current == '\"') {
|
||||
characterBuffer.add("\"".getBytes());
|
||||
escaping = false;
|
||||
} else if (current == '\'') {
|
||||
throw new JsonReadException("illegal escaped quote in line " + linecount);
|
||||
} else {
|
||||
if (encoded) {
|
||||
// load next 4 characters in special buffer
|
||||
encodedCodePointBuffer.add(current);
|
||||
if (encodedCodePointBuffer.length() == 4) {
|
||||
byte[] bytes = parseCodePoint();
|
||||
characterBuffer.add(bytes);
|
||||
encoded = false;
|
||||
escaping = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
advance();
|
||||
}
|
||||
if (current != -1) {
|
||||
advance();
|
||||
}
|
||||
|
||||
return characterBuffer.toString();
|
||||
}
|
||||
|
||||
private byte[] parseCodePoint() {
|
||||
String hex = encodedCodePointBuffer.toString();
|
||||
int codepoint = Integer.parseInt(hex, HEX_RADIX);
|
||||
convertBuffer.clear();
|
||||
encodedCodePointBuffer.clear();
|
||||
return convertBuffer.putInt(codepoint).array();
|
||||
}
|
||||
|
||||
void advance() {
|
||||
try {
|
||||
current = (byte)inputStream.read();
|
||||
} catch (IOException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
}
|
||||
|
||||
void skipWhitespace() {
|
||||
try {
|
||||
while (current > -1 && Character.isWhitespace(current)) {
|
||||
current = (byte)inputStream.read();
|
||||
}
|
||||
if (current == -1) {
|
||||
throw new JsonReadException("end of source reached");
|
||||
}
|
||||
} catch (IOException e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
}
|
||||
|
||||
String eat(char until) {
|
||||
characterBuffer.clear();
|
||||
|
||||
while (current > -1 && (current != until | Character.isWhitespace(current))) {
|
||||
characterBuffer.add(current);
|
||||
advance();
|
||||
}
|
||||
advance();
|
||||
return characterBuffer.toString();
|
||||
}
|
||||
}
|
||||
7
src/main/java/nl/sander/jsontoy2/JsonObjectReader.java
Normal file
7
src/main/java/nl/sander/jsontoy2/JsonObjectReader.java
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import java.io.Reader;
|
||||
|
||||
public interface JsonObjectReader<T> {
|
||||
T read(IoReader ioReader);
|
||||
}
|
||||
12
src/main/java/nl/sander/jsontoy2/JsonReadException.java
Normal file
12
src/main/java/nl/sander/jsontoy2/JsonReadException.java
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
public class JsonReadException extends RuntimeException {
|
||||
|
||||
public JsonReadException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public JsonReadException(Throwable e) {
|
||||
super(e);
|
||||
}
|
||||
}
|
||||
60
src/main/java/nl/sander/jsontoy2/JsonReader.java
Normal file
60
src/main/java/nl/sander/jsontoy2/JsonReader.java
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import nl.sander.jsontoy2.readers.*;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Date;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
/**
|
||||
* public facade
|
||||
*/
|
||||
public class JsonReader {
|
||||
private static final ConcurrentMap<Class<?>, JsonObjectReader<?>> readers = new ConcurrentHashMap<>();
|
||||
|
||||
public static <T> T read(Class<T> type, InputStream reader) {
|
||||
return read(type, new IoReader(reader));
|
||||
}
|
||||
|
||||
public static <T> T read(Class<T> type, String jsonString) {
|
||||
return read(type, new IoReader(jsonString));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T> T read(Class<T> type, IoReader ioReader) {
|
||||
return (T) getReader(type).read(ioReader);
|
||||
// class.cast() does not work for primitives;
|
||||
}
|
||||
|
||||
private static <T> JsonObjectReader<?> getReader(Class<T> type) {
|
||||
return readers.get(type);
|
||||
}
|
||||
|
||||
public static <T> void register(Class<T> type, JsonObjectReader<T> objectReader) {
|
||||
readers.put(type, objectReader);
|
||||
}
|
||||
|
||||
static {
|
||||
register(Boolean.class, new BooleanReader());
|
||||
register(boolean.class, new BooleanReader());
|
||||
register(Integer.class, new IntegerReader());
|
||||
register(int.class, new IntegerReader());
|
||||
register(Long.class, new LongReader());
|
||||
register(long.class, new LongReader());
|
||||
register(Byte.class, new ByteReader());
|
||||
register(byte.class, new ByteReader());
|
||||
register(Short.class, new ShortReader());
|
||||
register(short.class, new ShortReader());
|
||||
register(Double.class, new DoubleReader());
|
||||
register(double.class, new DoubleReader());
|
||||
register(Float.class, new FloatReader());
|
||||
register(float.class, new FloatReader());
|
||||
register(Date.class, new DateReader());
|
||||
register(Character.class, new CharReader());
|
||||
register(char.class, new CharReader());
|
||||
register(String.class, new StringReader());
|
||||
register(LocalDateTime.class, new LocalDateTimeReader());
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
package nl.sander.jsontoy2.readers;
|
||||
|
||||
import nl.sander.jsontoy2.IoReader;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.format.DateTimeFormatterBuilder;
|
||||
import java.time.temporal.ChronoField;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public abstract class AbstractDatesReader<T> {
|
||||
|
||||
private static final ZoneId zone = ZoneId.systemDefault();
|
||||
|
||||
public static final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
|
||||
// date and time
|
||||
.appendPattern("yyyy-MM-dd'T'HH:mm:ss.SSS")
|
||||
// optional offset - prints +0000 when it's zero (instead of Z)
|
||||
.optionalStart().appendOffset("+HHMM", "+0000").optionalEnd()
|
||||
// optional zone id (so it parses "Z")
|
||||
.optionalStart()
|
||||
.appendZoneId()
|
||||
// add default value for offset seconds when field is not present
|
||||
.parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
|
||||
.optionalEnd()
|
||||
// create formatter using the "UTC-cloned" zone
|
||||
.toFormatter().withZone(zone);
|
||||
|
||||
protected ZonedDateTime getZonedDateTime(Supplier<String> supplier) {
|
||||
return formatter.parse(supplier.get(), ZonedDateTime::from);
|
||||
}
|
||||
|
||||
}
|
||||
10
src/main/java/nl/sander/jsontoy2/readers/BooleanReader.java
Normal file
10
src/main/java/nl/sander/jsontoy2/readers/BooleanReader.java
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
package nl.sander.jsontoy2.readers;
|
||||
|
||||
import nl.sander.jsontoy2.IoReader;
|
||||
|
||||
public class BooleanReader implements nl.sander.jsontoy2.JsonObjectReader<Boolean> {
|
||||
@Override
|
||||
public Boolean read(IoReader ioReader) {
|
||||
return ioReader.readBoolean();
|
||||
}
|
||||
}
|
||||
11
src/main/java/nl/sander/jsontoy2/readers/ByteReader.java
Normal file
11
src/main/java/nl/sander/jsontoy2/readers/ByteReader.java
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
package nl.sander.jsontoy2.readers;
|
||||
|
||||
import nl.sander.jsontoy2.IoReader;
|
||||
import nl.sander.jsontoy2.JsonObjectReader;
|
||||
|
||||
public class ByteReader implements JsonObjectReader<Byte> {
|
||||
@Override
|
||||
public Byte read(IoReader ioReader) {
|
||||
return ioReader.readByte();
|
||||
}
|
||||
}
|
||||
11
src/main/java/nl/sander/jsontoy2/readers/CharReader.java
Normal file
11
src/main/java/nl/sander/jsontoy2/readers/CharReader.java
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
package nl.sander.jsontoy2.readers;
|
||||
|
||||
import nl.sander.jsontoy2.IoReader;
|
||||
import nl.sander.jsontoy2.JsonObjectReader;
|
||||
|
||||
public class CharReader implements JsonObjectReader<Character> {
|
||||
@Override
|
||||
public Character read(IoReader ioReader) {
|
||||
return ioReader.readCharacter();
|
||||
}
|
||||
}
|
||||
22
src/main/java/nl/sander/jsontoy2/readers/DateReader.java
Normal file
22
src/main/java/nl/sander/jsontoy2/readers/DateReader.java
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
package nl.sander.jsontoy2.readers;
|
||||
|
||||
import nl.sander.jsontoy2.IoReader;
|
||||
import nl.sander.jsontoy2.JsonObjectReader;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.time.format.DateTimeFormatterBuilder;
|
||||
import java.time.temporal.ChronoField;
|
||||
import java.util.Date;
|
||||
|
||||
public class DateReader extends AbstractDatesReader<Date> implements JsonObjectReader<Date> {
|
||||
|
||||
@Override
|
||||
public Date read(IoReader ioReader) {
|
||||
ZonedDateTime zdt = getZonedDateTime(ioReader::readString);
|
||||
return Date.from(zdt.toInstant());
|
||||
}
|
||||
|
||||
}
|
||||
14
src/main/java/nl/sander/jsontoy2/readers/DoubleReader.java
Normal file
14
src/main/java/nl/sander/jsontoy2/readers/DoubleReader.java
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
package nl.sander.jsontoy2.readers;
|
||||
|
||||
import nl.sander.jsontoy2.IoReader;
|
||||
import nl.sander.jsontoy2.JsonObjectReader;
|
||||
|
||||
import java.io.Reader;
|
||||
|
||||
public class DoubleReader implements JsonObjectReader<Double> {
|
||||
@Override
|
||||
public Double read(IoReader ioReader) {
|
||||
return ioReader.readDouble();
|
||||
}
|
||||
|
||||
}
|
||||
12
src/main/java/nl/sander/jsontoy2/readers/FloatReader.java
Normal file
12
src/main/java/nl/sander/jsontoy2/readers/FloatReader.java
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
package nl.sander.jsontoy2.readers;
|
||||
|
||||
import nl.sander.jsontoy2.IoReader;
|
||||
import nl.sander.jsontoy2.JsonObjectReader;
|
||||
|
||||
public class FloatReader implements JsonObjectReader<Float> {
|
||||
@Override
|
||||
public Float read(IoReader ioReader) {
|
||||
return ioReader.readFloat();
|
||||
}
|
||||
|
||||
}
|
||||
11
src/main/java/nl/sander/jsontoy2/readers/IntegerReader.java
Normal file
11
src/main/java/nl/sander/jsontoy2/readers/IntegerReader.java
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
package nl.sander.jsontoy2.readers;
|
||||
|
||||
import nl.sander.jsontoy2.IoReader;
|
||||
import nl.sander.jsontoy2.JsonObjectReader;
|
||||
|
||||
public class IntegerReader implements JsonObjectReader<Integer> {
|
||||
@Override
|
||||
public Integer read(IoReader ioReader) {
|
||||
return ioReader.readInteger();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
package nl.sander.jsontoy2.readers;
|
||||
|
||||
import nl.sander.jsontoy2.IoReader;
|
||||
import nl.sander.jsontoy2.JsonObjectReader;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.ZonedDateTime;
|
||||
|
||||
public class LocalDateTimeReader extends AbstractDatesReader<LocalDateTime> implements JsonObjectReader<LocalDateTime> {
|
||||
|
||||
@Override
|
||||
public LocalDateTime read(IoReader ioReader) {
|
||||
ZonedDateTime zdt = getZonedDateTime(ioReader::readString);
|
||||
return LocalDateTime.from(zdt);
|
||||
}
|
||||
|
||||
}
|
||||
11
src/main/java/nl/sander/jsontoy2/readers/LongReader.java
Normal file
11
src/main/java/nl/sander/jsontoy2/readers/LongReader.java
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
package nl.sander.jsontoy2.readers;
|
||||
|
||||
import nl.sander.jsontoy2.IoReader;
|
||||
import nl.sander.jsontoy2.JsonObjectReader;
|
||||
|
||||
public class LongReader implements JsonObjectReader<Long> {
|
||||
@Override
|
||||
public Long read(IoReader ioReader) {
|
||||
return ioReader.readLong();
|
||||
}
|
||||
}
|
||||
12
src/main/java/nl/sander/jsontoy2/readers/ShortReader.java
Normal file
12
src/main/java/nl/sander/jsontoy2/readers/ShortReader.java
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
package nl.sander.jsontoy2.readers;
|
||||
|
||||
import nl.sander.jsontoy2.IoReader;
|
||||
import nl.sander.jsontoy2.JsonObjectReader;
|
||||
|
||||
public class ShortReader implements JsonObjectReader<Short> {
|
||||
|
||||
@Override
|
||||
public Short read(IoReader ioReader) {
|
||||
return ioReader.readShort();
|
||||
}
|
||||
}
|
||||
12
src/main/java/nl/sander/jsontoy2/readers/StringReader.java
Normal file
12
src/main/java/nl/sander/jsontoy2/readers/StringReader.java
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
package nl.sander.jsontoy2.readers;
|
||||
|
||||
import nl.sander.jsontoy2.IoReader;
|
||||
import nl.sander.jsontoy2.JsonObjectReader;
|
||||
|
||||
public class StringReader implements JsonObjectReader<String> {
|
||||
|
||||
@Override
|
||||
public String read(IoReader ioReader) {
|
||||
return ioReader.readString();
|
||||
}
|
||||
}
|
||||
25
src/test/java/nl/sander/jsontoy2/Booleans.java
Normal file
25
src/test/java/nl/sander/jsontoy2/Booleans.java
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
|
||||
public class Booleans {
|
||||
|
||||
@Test
|
||||
public void testTrue() {
|
||||
assertEquals(true, JsonReader.read(Boolean.class, "true"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFalse() {
|
||||
assertEquals(false, JsonReader.read(Boolean.class, "false"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPrimitiveFalse() {
|
||||
boolean value = JsonReader.read(boolean.class, "false");
|
||||
assertFalse(value);
|
||||
}
|
||||
}
|
||||
58
src/test/java/nl/sander/jsontoy2/ByteBufTest.java
Normal file
58
src/test/java/nl/sander/jsontoy2/ByteBufTest.java
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
public class ByteBufTest {
|
||||
|
||||
|
||||
@Test
|
||||
public void testAdd(){
|
||||
ByteBuf c=new ByteBuf(1);
|
||||
c.add("1".getBytes(StandardCharsets.UTF_8));
|
||||
assertEquals("1", c.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExpansion(){
|
||||
ByteBuf c=new ByteBuf(1);
|
||||
c.add("1".getBytes());
|
||||
c.add("2".getBytes());
|
||||
assertEquals("12", c.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testClear(){
|
||||
ByteBuf c=new ByteBuf(1);
|
||||
c.add("1".getBytes());
|
||||
c.clear();
|
||||
c.add("2".getBytes());
|
||||
assertEquals("2", c.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLength(){
|
||||
ByteBuf c=new ByteBuf(10);
|
||||
c.add("1".getBytes());
|
||||
c.clear();
|
||||
c.add("2".getBytes());
|
||||
assertEquals(1, c.length());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUtf(){
|
||||
ByteBuf c=new ByteBuf(1);
|
||||
c.add("東".getBytes(StandardCharsets.UTF_8));
|
||||
assertEquals("東", c.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIllegalUtf(){
|
||||
ByteBuf c=new ByteBuf(1);
|
||||
c.add(new byte[]{0,0,-40,0});
|
||||
assertEquals("\u0000\u0000<EFBFBD>\u0000", c.toString());
|
||||
}
|
||||
}
|
||||
27
src/test/java/nl/sander/jsontoy2/Bytes.java
Normal file
27
src/test/java/nl/sander/jsontoy2/Bytes.java
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
public class Bytes {
|
||||
@Test
|
||||
public void testSimpleByte() {
|
||||
assertEquals((byte) 0, JsonReader.read(Byte.class, "0"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimplePrimitiveLong() {
|
||||
assertEquals((byte) 1, JsonReader.read(Byte.class, "1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleNegativeLong() {
|
||||
assertEquals((byte) -20, JsonReader.read(Byte.class, "-20"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleNegativePrimitiveLong() {
|
||||
assertEquals(Byte.MIN_VALUE, JsonReader.read(Byte.class, "-128"));
|
||||
}
|
||||
}
|
||||
24
src/test/java/nl/sander/jsontoy2/Chars.java
Normal file
24
src/test/java/nl/sander/jsontoy2/Chars.java
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
public class Chars {
|
||||
|
||||
@Test
|
||||
public void testSimpleChar() {
|
||||
assertEquals('a', JsonReader.read(Character.class, "\"a\""));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimplePrimitiveChar() {
|
||||
assertEquals('A', JsonReader.read(char.class, "\"A\""));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTooLongChar() {
|
||||
assertEquals('A', JsonReader.read(char.class, "\"AB\""));
|
||||
}
|
||||
|
||||
}
|
||||
36
src/test/java/nl/sander/jsontoy2/Dates.java
Normal file
36
src/test/java/nl/sander/jsontoy2/Dates.java
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import nl.sander.jsontoy2.readers.AbstractDatesReader;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Date;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
|
||||
public class Dates {
|
||||
|
||||
@Test
|
||||
public void testDate() throws ParseException {
|
||||
Date value = JsonReader.read(Date.class, "\"2012-04-23T18:25:43.511Z\"");
|
||||
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
|
||||
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
Date expected = simpleDateFormat.parse("2012-04-23T18:25:43.511Z");
|
||||
assertEquals(expected, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLocalDateTime() {
|
||||
LocalDateTime value = JsonReader.read(LocalDateTime.class, "\"2012-04-23T18:25:43.511Z\"");
|
||||
LocalDateTime expected = LocalDateTime.parse("2012-04-23T18:25:43.511Z", AbstractDatesReader.formatter);
|
||||
assertEquals(expected, value);
|
||||
}
|
||||
|
||||
}
|
||||
47
src/test/java/nl/sander/jsontoy2/Doubles.java
Normal file
47
src/test/java/nl/sander/jsontoy2/Doubles.java
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
|
||||
public class Doubles {
|
||||
|
||||
@Test
|
||||
public void testSmallDouble() {
|
||||
Double value = JsonReader.read(Double.class, "123.456e-289");
|
||||
assertEquals(123.456e-289D, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLargeDouble() {
|
||||
Double value = JsonReader.read(Double.class, "999999999999999999999999999999999999999999999999999999.4e99");
|
||||
assertEquals(999999999999999999999999999999999999999999999999999999.4e99D, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNegativeDouble() {
|
||||
Double value = JsonReader.read(Double.class, "-1.2e+9");
|
||||
assertEquals(-1.2e+9D, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNegativeDoubleOverflow() {
|
||||
Double value = JsonReader.read(Double.class, "-1.2e+100000");
|
||||
assertEquals(Double.NEGATIVE_INFINITY, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNegativeFloatUnderflow() {
|
||||
Double value = JsonReader.read(Double.class, "-1.2e-100000");
|
||||
assertEquals(-0D, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPositiveFloatUnderflow() {
|
||||
Double value = JsonReader.read(Double.class, "1.2e-100000");
|
||||
assertEquals(0D, value);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
47
src/test/java/nl/sander/jsontoy2/Floats.java
Normal file
47
src/test/java/nl/sander/jsontoy2/Floats.java
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
|
||||
public class Floats {
|
||||
|
||||
@Test
|
||||
public void testSmallFloat() {
|
||||
Float value = JsonReader.read(Float.class, "123.456e-28");
|
||||
assertEquals(123.456e-28F, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLargeFloat() {
|
||||
Float value = JsonReader.read(Float.class, "9999.4e29");
|
||||
assertEquals(9999.4e29F, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNegativeFloat() {
|
||||
Float value = JsonReader.read(Float.class, "-1.2e+9");
|
||||
assertEquals(-1.2e+9F, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNegativeFloatOverflow() {
|
||||
Float value = JsonReader.read(Float.class, "-1.2e+100000");
|
||||
assertEquals(Float.NEGATIVE_INFINITY, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNegativeFloatUnderflow() {
|
||||
Float value = JsonReader.read(Float.class, "-1.2e-100000");
|
||||
assertEquals(-0F, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPositiveFloatUnderflow() {
|
||||
Float value = JsonReader.read(Float.class, "1.2e-100000");
|
||||
assertEquals(0F, value);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
40
src/test/java/nl/sander/jsontoy2/Ints.java
Normal file
40
src/test/java/nl/sander/jsontoy2/Ints.java
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
public class Ints {
|
||||
|
||||
@Test
|
||||
public void testSimpleInt(){
|
||||
assertEquals(1,JsonReader.read(Integer.class,"1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimplePrimitiveInt(){
|
||||
assertEquals(1,JsonReader.read(int.class,"1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleNegativeInt(){
|
||||
assertEquals(-20001,JsonReader.read(Integer.class,"-20001"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleNegativePrimitiveInt(){
|
||||
assertEquals(Integer.MIN_VALUE,JsonReader.read(int.class,"-2147483684"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNegativeScientificNotation() {
|
||||
Integer value = JsonReader.read(Integer.class, "-1e+9");
|
||||
assertEquals(-1000000000, value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPositiveScientificNotation() {
|
||||
Integer value = JsonReader.read(Integer.class, "1e+9");
|
||||
assertEquals(1000000000, value);
|
||||
}
|
||||
}
|
||||
27
src/test/java/nl/sander/jsontoy2/Longs.java
Normal file
27
src/test/java/nl/sander/jsontoy2/Longs.java
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
public class Longs {
|
||||
@Test
|
||||
public void testSimpleLong(){
|
||||
assertEquals(0,JsonReader.read(Long.class,"0"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimplePrimitiveLong(){
|
||||
assertEquals(1,JsonReader.read(long.class,"1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleNegativeLong(){
|
||||
assertEquals(-20001,JsonReader.read(Long.class,"-20001"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleNegativePrimitiveLong(){
|
||||
assertEquals(Long.MIN_VALUE,JsonReader.read(long.class,"-9223372036854775808"));
|
||||
}
|
||||
}
|
||||
28
src/test/java/nl/sander/jsontoy2/Shorts.java
Normal file
28
src/test/java/nl/sander/jsontoy2/Shorts.java
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
public class Shorts {
|
||||
|
||||
@Test
|
||||
public void testSimpleShort() {
|
||||
assertEquals((short) 1, JsonReader.read(Short.class, "1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimplePrimitiveShort() {
|
||||
assertEquals((short) 1, JsonReader.read(short.class, "1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleNegativeShort() {
|
||||
assertEquals((short) -100, JsonReader.read(Short.class, "-100"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleNegativePrimitiveShort() {
|
||||
assertEquals((short) -100, JsonReader.read(short.class, "-100"));
|
||||
}
|
||||
}
|
||||
54
src/test/java/nl/sander/jsontoy2/Strings.java
Normal file
54
src/test/java/nl/sander/jsontoy2/Strings.java
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
package nl.sander.jsontoy2;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.CharacterCodingException;
|
||||
import java.nio.charset.CharsetDecoder;
|
||||
import java.nio.charset.CodingErrorAction;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
|
||||
public class Strings {
|
||||
|
||||
@Test
|
||||
public void regular() {
|
||||
assertEquals("DADA", JsonReader.read(String.class, "\"DADA\""));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void firstSurrogateButSecondMissing() throws NoSuchFieldException, IllegalAccessException {
|
||||
String value = JsonReader.read(String.class, "\"\\uDADA\"");
|
||||
|
||||
assertEquals("\u0000\u0000<EFBFBD><EFBFBD>", value); // question mark
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void incompleteSurrogateAndEscapeValid() {
|
||||
String value = JsonReader.read(String.class, "\"\\uD800\n\"");
|
||||
assertEquals("\u0000\u0000<EFBFBD>\u0000\n", value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void firstValidSurrogateSecondInvalid() throws CharacterCodingException {
|
||||
String value = JsonReader.read(String.class, "\"\\uD888\\u1334\"");
|
||||
|
||||
assertEquals("\u0000\u0000؈\u0000\u0000\u00134",value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void escapedDoubleQuote() {
|
||||
String value = JsonReader.read(String.class, "\"\\\"\"");
|
||||
assertEquals("\"", value);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void escapedSingleQuote() {
|
||||
assertThrows(JsonReadException.class, () -> JsonReader.read(String.class, "\"\\\'\""));
|
||||
}
|
||||
|
||||
}
|
||||
1
src/test/resources/i_object_key_lone_2nd_surrogate.json
Normal file
1
src/test/resources/i_object_key_lone_2nd_surrogate.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
{"\uDFAA":0}
|
||||
BIN
src/test/resources/i_string_UTF-16LE_with_BOM.json
Normal file
BIN
src/test/resources/i_string_UTF-16LE_with_BOM.json
Normal file
Binary file not shown.
1
src/test/resources/i_string_UTF-8_invalid_sequence.json
Executable file
1
src/test/resources/i_string_UTF-8_invalid_sequence.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
["譌・ム淫"]
|
||||
1
src/test/resources/i_string_UTF8_surrogate_U+D800.json
Normal file
1
src/test/resources/i_string_UTF8_surrogate_U+D800.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
["<22><><EFBFBD>"]
|
||||
1
src/test/resources/i_string_incomplete_surrogate_pair.json
Executable file
1
src/test/resources/i_string_incomplete_surrogate_pair.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
["\uDd1ea"]
|
||||
1
src/test/resources/i_string_incomplete_surrogates_escape_valid.json
Executable file
1
src/test/resources/i_string_incomplete_surrogates_escape_valid.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
["\uD800\uD800\n"]
|
||||
1
src/test/resources/i_string_invalid_lonely_surrogate.json
Executable file
1
src/test/resources/i_string_invalid_lonely_surrogate.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
["\ud800"]
|
||||
1
src/test/resources/i_string_invalid_surrogate.json
Executable file
1
src/test/resources/i_string_invalid_surrogate.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
["\ud800abc"]
|
||||
1
src/test/resources/i_string_invalid_utf-8.json
Normal file
1
src/test/resources/i_string_invalid_utf-8.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
["<22>"]
|
||||
1
src/test/resources/i_string_inverted_surrogates_U+1D11E.json
Executable file
1
src/test/resources/i_string_inverted_surrogates_U+1D11E.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
["\uDd1e\uD834"]
|
||||
1
src/test/resources/i_string_iso_latin_1.json
Normal file
1
src/test/resources/i_string_iso_latin_1.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
["И"]
|
||||
1
src/test/resources/i_string_lone_second_surrogate.json
Normal file
1
src/test/resources/i_string_lone_second_surrogate.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
["\uDFAA"]
|
||||
|
|
@ -0,0 +1 @@
|
|||
["<22>"]
|
||||
1
src/test/resources/i_string_not_in_unicode_range.json
Normal file
1
src/test/resources/i_string_not_in_unicode_range.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
["<22><><EFBFBD><EFBFBD>"]
|
||||
|
|
@ -0,0 +1 @@
|
|||
["<22><>"]
|
||||
1
src/test/resources/i_string_overlong_sequence_6_bytes.json
Executable file
1
src/test/resources/i_string_overlong_sequence_6_bytes.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
["<22>ソソソソ"]
|
||||
1
src/test/resources/i_string_overlong_sequence_6_bytes_null.json
Executable file
1
src/test/resources/i_string_overlong_sequence_6_bytes_null.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
["<22>"]
|
||||
1
src/test/resources/i_string_truncated-utf-8.json
Normal file
1
src/test/resources/i_string_truncated-utf-8.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
["<22><>"]
|
||||
BIN
src/test/resources/i_string_utf16BE_no_BOM.json
Normal file
BIN
src/test/resources/i_string_utf16BE_no_BOM.json
Normal file
Binary file not shown.
BIN
src/test/resources/i_string_utf16LE_no_BOM.json
Normal file
BIN
src/test/resources/i_string_utf16LE_no_BOM.json
Normal file
Binary file not shown.
1
src/test/resources/i_structure_500_nested_arrays.json
Normal file
1
src/test/resources/i_structure_500_nested_arrays.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
|
||||
1
src/test/resources/i_structure_UTF-8_BOM_empty_object.json
Executable file
1
src/test/resources/i_structure_UTF-8_BOM_empty_object.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
{}
|
||||
1
src/test/resources/n_array_1_true_without_comma.json
Normal file
1
src/test/resources/n_array_1_true_without_comma.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[1 true]
|
||||
1
src/test/resources/n_array_a_invalid_utf8.json
Normal file
1
src/test/resources/n_array_a_invalid_utf8.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[a蘊
|
||||
1
src/test/resources/n_array_colon_instead_of_comma.json
Normal file
1
src/test/resources/n_array_colon_instead_of_comma.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
["": 1]
|
||||
1
src/test/resources/n_array_comma_after_close.json
Normal file
1
src/test/resources/n_array_comma_after_close.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[""],
|
||||
1
src/test/resources/n_array_comma_and_number.json
Executable file
1
src/test/resources/n_array_comma_and_number.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[,1]
|
||||
1
src/test/resources/n_array_double_comma.json
Executable file
1
src/test/resources/n_array_double_comma.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[1,,2]
|
||||
1
src/test/resources/n_array_double_extra_comma.json
Normal file
1
src/test/resources/n_array_double_extra_comma.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
["x",,]
|
||||
1
src/test/resources/n_array_extra_close.json
Normal file
1
src/test/resources/n_array_extra_close.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
["x"]]
|
||||
1
src/test/resources/n_array_extra_comma.json
Normal file
1
src/test/resources/n_array_extra_comma.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
["",]
|
||||
1
src/test/resources/n_array_incomplete.json
Normal file
1
src/test/resources/n_array_incomplete.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
["x"
|
||||
1
src/test/resources/n_array_incomplete_invalid_value.json
Normal file
1
src/test/resources/n_array_incomplete_invalid_value.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[x
|
||||
1
src/test/resources/n_array_inner_array_no_comma.json
Normal file
1
src/test/resources/n_array_inner_array_no_comma.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[3[4]]
|
||||
1
src/test/resources/n_array_invalid_utf8.json
Normal file
1
src/test/resources/n_array_invalid_utf8.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[<EFBFBD>]
|
||||
1
src/test/resources/n_array_items_separated_by_semicolon.json
Executable file
1
src/test/resources/n_array_items_separated_by_semicolon.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[1:2]
|
||||
1
src/test/resources/n_array_just_comma.json
Executable file
1
src/test/resources/n_array_just_comma.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[,]
|
||||
1
src/test/resources/n_array_just_minus.json
Executable file
1
src/test/resources/n_array_just_minus.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[-]
|
||||
1
src/test/resources/n_array_missing_value.json
Normal file
1
src/test/resources/n_array_missing_value.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[ , ""]
|
||||
3
src/test/resources/n_array_newlines_unclosed.json
Normal file
3
src/test/resources/n_array_newlines_unclosed.json
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
["a",
|
||||
4
|
||||
,1,
|
||||
1
src/test/resources/n_array_number_and_comma.json
Executable file
1
src/test/resources/n_array_number_and_comma.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[1,]
|
||||
1
src/test/resources/n_array_number_and_several_commas.json
Executable file
1
src/test/resources/n_array_number_and_several_commas.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[1,,]
|
||||
1
src/test/resources/n_array_spaces_vertical_tab_formfeed.json
Executable file
1
src/test/resources/n_array_spaces_vertical_tab_formfeed.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
["a"\f]
|
||||
1
src/test/resources/n_array_star_inside.json
Executable file
1
src/test/resources/n_array_star_inside.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[*]
|
||||
1
src/test/resources/n_array_unclosed.json
Normal file
1
src/test/resources/n_array_unclosed.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[""
|
||||
1
src/test/resources/n_array_unclosed_trailing_comma.json
Normal file
1
src/test/resources/n_array_unclosed_trailing_comma.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[1,
|
||||
3
src/test/resources/n_array_unclosed_with_new_lines.json
Normal file
3
src/test/resources/n_array_unclosed_with_new_lines.json
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[1,
|
||||
1
|
||||
,1
|
||||
|
|
@ -0,0 +1 @@
|
|||
[{}
|
||||
1
src/test/resources/n_incomplete_false.json
Normal file
1
src/test/resources/n_incomplete_false.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[fals]
|
||||
1
src/test/resources/n_incomplete_null.json
Normal file
1
src/test/resources/n_incomplete_null.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[nul]
|
||||
1
src/test/resources/n_incomplete_true.json
Normal file
1
src/test/resources/n_incomplete_true.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[tru]
|
||||
BIN
src/test/resources/n_multidigit_number_then_00.json
Normal file
BIN
src/test/resources/n_multidigit_number_then_00.json
Normal file
Binary file not shown.
1
src/test/resources/n_number_++.json
Normal file
1
src/test/resources/n_number_++.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[++1234]
|
||||
1
src/test/resources/n_number_+1.json
Executable file
1
src/test/resources/n_number_+1.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[+1]
|
||||
1
src/test/resources/n_number_+Inf.json
Executable file
1
src/test/resources/n_number_+Inf.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[+Inf]
|
||||
1
src/test/resources/n_number_-01.json
Executable file
1
src/test/resources/n_number_-01.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[-01]
|
||||
1
src/test/resources/n_number_-1.0..json
Executable file
1
src/test/resources/n_number_-1.0..json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[-1.0.]
|
||||
1
src/test/resources/n_number_-2..json
Executable file
1
src/test/resources/n_number_-2..json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[-2.]
|
||||
1
src/test/resources/n_number_-NaN.json
Executable file
1
src/test/resources/n_number_-NaN.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[-NaN]
|
||||
1
src/test/resources/n_number_.-1.json
Normal file
1
src/test/resources/n_number_.-1.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[.-1]
|
||||
1
src/test/resources/n_number_.2e-3.json
Executable file
1
src/test/resources/n_number_.2e-3.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[.2e-3]
|
||||
1
src/test/resources/n_number_0.1.2.json
Executable file
1
src/test/resources/n_number_0.1.2.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[0.1.2]
|
||||
1
src/test/resources/n_number_0.3e+.json
Normal file
1
src/test/resources/n_number_0.3e+.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[0.3e+]
|
||||
1
src/test/resources/n_number_0.3e.json
Normal file
1
src/test/resources/n_number_0.3e.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[0.3e]
|
||||
1
src/test/resources/n_number_0.e1.json
Normal file
1
src/test/resources/n_number_0.e1.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[0.e1]
|
||||
1
src/test/resources/n_number_0_capital_E+.json
Normal file
1
src/test/resources/n_number_0_capital_E+.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[0E+]
|
||||
1
src/test/resources/n_number_0_capital_E.json
Executable file
1
src/test/resources/n_number_0_capital_E.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[0E]
|
||||
1
src/test/resources/n_number_0e+.json
Normal file
1
src/test/resources/n_number_0e+.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[0e+]
|
||||
1
src/test/resources/n_number_0e.json
Normal file
1
src/test/resources/n_number_0e.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
[0e]
|
||||
1
src/test/resources/n_number_1.0e+.json
Executable file
1
src/test/resources/n_number_1.0e+.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[1.0e+]
|
||||
1
src/test/resources/n_number_1.0e-.json
Executable file
1
src/test/resources/n_number_1.0e-.json
Executable file
|
|
@ -0,0 +1 @@
|
|||
[1.0e-]
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue