package com.jsoniter;
import com.jsoniter.spi.JsonException;
import junit.framework.TestCase;
import org.junit.experimental.categories.Category;
import java.io.ByteArrayInputStream;
import java.io.IOException;
//import java.math.BigDecimal;
//import java.math.BigInteger;
public class TestInteger extends TestCase {
static {
// JsonIterator.setMode(DecodingMode.DYNAMIC_MODE_AND_MATCH_FIELD_STRICTLY);
}
private boolean isStreaming;
public void test_char() throws IOException {
Character c = JsonIterator.deserialize("50", Character.class);
assertEquals(50, (int) c);
}
public void test_positive_negative_int() throws IOException {
assertEquals(0, parseInt("0"));
assertEquals(4321, parseInt("4321"));
assertEquals(54321, parseInt("54321"));
assertEquals(654321, parseInt("654321"));
assertEquals(7654321, parseInt("7654321"));
assertEquals(87654321, parseInt("87654321"));
assertEquals(987654321, parseInt("987654321"));
assertEquals(2147483647, parseInt("2147483647"));
assertEquals(-4321, parseInt("-4321"));
assertEquals(-2147483648, parseInt("-2147483648"));
}
public void test_positive_negative_long() throws IOException {
assertEquals(0L, parseLong("0"));
assertEquals(4321L, parseLong("4321"));
assertEquals(54321L, parseLong("54321"));
assertEquals(654321L, parseLong("654321"));
assertEquals(7654321L, parseLong("7654321"));
assertEquals(87654321L, parseLong("87654321"));
assertEquals(987654321L, parseLong("987654321"));
assertEquals(9223372036854775807L, parseLong("9223372036854775807"));
assertEquals(-4321L, parseLong("-4321"));
assertEquals(-9223372036854775808L, parseLong("-9223372036854775808"));
}
public void test_max_min_int() throws IOException {
assertEquals(Integer.MAX_VALUE, parseInt(Integer.toString(Integer.MAX_VALUE)));
assertEquals(Integer.MAX_VALUE - 1, parseInt(Integer.toString(Integer.MAX_VALUE - 1)));
assertEquals(Integer.MIN_VALUE + 1, parseInt(Integer.toString(Integer.MIN_VALUE + 1)));
assertEquals(Integer.MIN_VALUE, parseInt(Integer.toString(Integer.MIN_VALUE)));
}
public void test_max_min_long() throws IOException {
assertEquals(Long.MAX_VALUE, parseLong(Long.toString(Long.MAX_VALUE)));
assertEquals(Long.MAX_VALUE - 1, parseLong(Long.toString(Long.MAX_VALUE - 1)));
assertEquals(Long.MIN_VALUE + 1, parseLong(Long.toString(Long.MIN_VALUE + 1)));
assertEquals(Long.MIN_VALUE, parseLong(Long.toString(Long.MIN_VALUE)));
}
public void test_large_number() throws IOException {
try {
JsonIterator.deserialize("2147483648", Integer.class);
fail();
} catch (JsonException e) {
}
for (int i = 300000000; i < 2000000000; i += 10000000) {
try {
JsonIterator.deserialize(i + "0", Integer.class);
fail();
} catch (JsonException e) {
}
try {
JsonIterator.deserialize(-i + "0", Integer.class);
fail();
} catch (JsonException e) {
}
}
try {
JsonIterator.deserialize("9223372036854775808", Long.class);
fail();
} catch (JsonException e) {
}
for (long i = 1000000000000000000L; i < 9000000000000000000L; i += 100000000000000000L) {
try {
JsonIterator.deserialize(i + "0", Long.class);
fail();
} catch (JsonException e) {
}
try {
JsonIterator.deserialize(-i + "0", Long.class);
fail();
} catch (JsonException e) {
}
}
}
public void test_byte() throws IOException {
Byte val = JsonIterator.deserialize("120", Byte.class);
assertEquals(Byte.valueOf((byte) 120), val);
byte[] vals = JsonIterator.deserialize("[120]", byte[].class);
assertEquals((byte) 120, vals[0]);
}
@Category(StreamingCategory.class)
public void test_streaming() throws IOException {
isStreaming = true;
test_positive_negative_int();
test_positive_negative_long();
test_max_min_int();
test_max_min_long();
test_large_number();
}
public void test_leading_zero() throws IOException {
assertEquals(Integer.valueOf(0), JsonIterator.deserialize("0", int.class));
assertEquals(Long.valueOf(0), JsonIterator.deserialize("0", long.class));
try {
JsonIterator.deserialize("01", int.class);
fail();
} catch (JsonException e) {
}
try {
JsonIterator.deserialize("02147483647", int.class);
fail();
} catch (JsonException e) {
}
try {
JsonIterator.deserialize("01", long.class);
fail();
} catch (JsonException e) {
}
try {
JsonIterator.deserialize("09223372036854775807", long.class);
fail();
} catch (JsonException e) {
}
/* FIXME if we should fail on parsing of leading zeroes for other numbers
try {
JsonIterator.deserialize("01", double.class);
fail();
} catch (JsonException e) {
}
try {
JsonIterator.deserialize("01", float.class);
fail();
} catch (JsonException e) {
}
try {
JsonIterator.deserialize("01", BigInteger.class);
fail();
} catch (JsonException e) {
}
try {
JsonIterator.deserialize("01", BigDecimal.class);
fail();
} catch (JsonException e) {
}
*/
}
public void test_max_int() throws IOException {
int[] ints = JsonIterator.deserialize("[2147483647,-2147483648]", int[].class);
assertEquals(Integer.MAX_VALUE, ints[0]);
assertEquals(Integer.MIN_VALUE, ints[1]);
}
private int parseInt(String input) throws IOException {
if (isStreaming) {
JsonIterator iter = JsonIterator.parse(new ByteArrayInputStream(input.getBytes()), 2);
return iter.readInt();
} else {
JsonIterator iter = JsonIterator.parse(input);
int v = iter.readInt();
assertEquals(input.length(), iter.head); // iterator head should point on next non-parsed byte
return v;
}
}
private long parseLong(String input) throws IOException {
if (isStreaming) {
JsonIterator iter = JsonIterator.parse(new ByteArrayInputStream(input.getBytes()), 2);
return iter.readLong();
} else {
JsonIterator iter = JsonIterator.parse(input);
long v = iter.readLong();
assertEquals(input.length(), iter.head); // iterator head should point on next non-parsed byte
return v;
}
}
}