blob: 80483bf702b6e860baa6559c31881b4040713aa6 [file] [log] [blame]
package com.fasterxml.jackson.core.json;
import java.io.ByteArrayOutputStream;
import java.io.StringWriter;
import com.fasterxml.jackson.core.*;
/**
* Basic testing for scalar-array write methods added in 2.8
*/
public class ArrayGenerationTest extends BaseTest
{
private final JsonFactory FACTORY = new JsonFactory();
public void testIntArray() throws Exception
{
_testIntArray(false);
_testIntArray(true);
}
public void testLongArray() throws Exception
{
_testLongArray(false);
_testLongArray(true);
}
public void testDoubleArray() throws Exception
{
_testDoubleArray(false);
_testDoubleArray(true);
}
private void _testIntArray(boolean useBytes) throws Exception {
// first special cases of 0, 1 values
_testIntArray(useBytes, 0, 0, 0);
_testIntArray(useBytes, 0, 1, 1);
_testIntArray(useBytes, 1, 0, 0);
_testIntArray(useBytes, 1, 1, 1);
// and then some bigger data
_testIntArray(useBytes, 15, 0, 0);
_testIntArray(useBytes, 15, 2, 3);
_testIntArray(useBytes, 39, 0, 0);
_testIntArray(useBytes, 39, 4, 0);
_testIntArray(useBytes, 271, 0, 0);
_testIntArray(useBytes, 271, 0, 4);
_testIntArray(useBytes, 5009, 0, 0);
_testIntArray(useBytes, 5009, 0, 1);
}
private void _testLongArray(boolean useBytes) throws Exception {
// first special cases of 0, 1 values
_testLongArray(useBytes, 0, 0, 0);
_testLongArray(useBytes, 0, 1, 1);
_testLongArray(useBytes, 1, 0, 0);
_testLongArray(useBytes, 1, 1, 1);
// and then some bigger data
_testLongArray(useBytes, 15, 0, 0);
_testLongArray(useBytes, 15, 2, 3);
_testLongArray(useBytes, 39, 0, 0);
_testLongArray(useBytes, 39, 4, 0);
_testLongArray(useBytes, 271, 0, 0);
_testLongArray(useBytes, 271, 0, 4);
_testLongArray(useBytes, 5009, 0, 0);
_testLongArray(useBytes, 5009, 0, 1);
}
private void _testDoubleArray(boolean useBytes) throws Exception {
// first special cases of 0, 1 values
_testDoubleArray(useBytes, 0, 0, 0);
_testDoubleArray(useBytes, 0, 1, 1);
_testDoubleArray(useBytes, 1, 0, 0);
_testDoubleArray(useBytes, 1, 1, 1);
// and then some bigger data
_testDoubleArray(useBytes, 15, 0, 0);
_testDoubleArray(useBytes, 15, 2, 3);
_testDoubleArray(useBytes, 39, 0, 0);
_testDoubleArray(useBytes, 39, 4, 0);
_testDoubleArray(useBytes, 271, 0, 0);
_testDoubleArray(useBytes, 271, 0, 4);
_testDoubleArray(useBytes, 5009, 0, 0);
_testDoubleArray(useBytes, 5009, 0, 1);
}
private void _testIntArray(boolean useBytes, int elements, int pre, int post) throws Exception
{
int[] values = new int[elements+pre+post];
for (int i = pre, end = pre+elements; i < end; ++i) {
values[i] = i-pre;
}
StringWriter sw = new StringWriter();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
JsonGenerator gen = useBytes ? FACTORY.createGenerator(bytes)
: FACTORY.createGenerator(sw);
gen.writeArray(values, pre, elements);
gen.close();
String json;
if (useBytes) {
json = bytes.toString("UTF-8");
} else {
json = sw.toString();
}
JsonParser p = useBytes ? FACTORY.createParser(bytes.toByteArray())
: FACTORY.createParser(json);
assertToken(JsonToken.START_ARRAY, p.nextToken());
for (int i = 0; i < elements; ++i) {
if ((i & 1) == 0) { // alternate
JsonToken t = p.nextToken();
if (t != JsonToken.VALUE_NUMBER_INT) {
fail("Expected number, got "+t+", element #"+i);
}
assertEquals(i, p.getIntValue());
} else {
assertEquals(i, p.nextIntValue(-1));
}
}
assertToken(JsonToken.END_ARRAY, p.nextToken());
p.close();
}
private void _testLongArray(boolean useBytes, int elements, int pre, int post) throws Exception
{
long[] values = new long[elements+pre+post];
for (int i = pre, end = pre+elements; i < end; ++i) {
values[i] = i-pre;
}
StringWriter sw = new StringWriter();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
JsonGenerator gen = useBytes ? FACTORY.createGenerator(bytes)
: FACTORY.createGenerator(sw);
gen.writeArray(values, pre, elements);
gen.close();
String json;
if (useBytes) {
json = bytes.toString("UTF-8");
} else {
json = sw.toString();
}
JsonParser p = useBytes ? FACTORY.createParser(bytes.toByteArray())
: FACTORY.createParser(json);
assertToken(JsonToken.START_ARRAY, p.nextToken());
for (int i = 0; i < elements; ++i) {
if ((i & 1) == 0) { // alternate
JsonToken t = p.nextToken();
if (t != JsonToken.VALUE_NUMBER_INT) {
fail("Expected number, got "+t+", element #"+i);
}
assertEquals(i, p.getLongValue());
} else {
assertEquals(i, p.nextLongValue(-1));
}
}
assertToken(JsonToken.END_ARRAY, p.nextToken());
p.close();
}
private void _testDoubleArray(boolean useBytes, int elements, int pre, int post) throws Exception
{
double[] values = new double[elements+pre+post];
for (int i = pre, end = pre+elements; i < end; ++i) {
values[i] = i-pre;
}
StringWriter sw = new StringWriter();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
JsonGenerator gen = useBytes ? FACTORY.createGenerator(bytes)
: FACTORY.createGenerator(sw);
gen.writeArray(values, pre, elements);
gen.close();
String json;
if (useBytes) {
json = bytes.toString("UTF-8");
} else {
json = sw.toString();
}
JsonParser p = useBytes ? FACTORY.createParser(bytes.toByteArray())
: FACTORY.createParser(json);
assertToken(JsonToken.START_ARRAY, p.nextToken());
for (int i = 0; i < elements; ++i) {
JsonToken t = p.nextToken();
if (t != JsonToken.VALUE_NUMBER_FLOAT) {
fail("Expected floating-point number, got "+t+", element #"+i);
}
assertEquals((double) i, p.getDoubleValue());
}
assertToken(JsonToken.END_ARRAY, p.nextToken());
p.close();
}
}