Skip to content

Commit 01aa0bc

Browse files
authored
Add smile tests (#595)
1 parent d11753f commit 01aa0bc

File tree

4 files changed

+163
-10
lines changed

4 files changed

+163
-10
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.fasterxml.jackson.dataformat.cbor.parse;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import com.fasterxml.jackson.core.*;
6+
import com.fasterxml.jackson.core.exc.StreamReadException;
7+
import com.fasterxml.jackson.dataformat.cbor.CBORFactory;
8+
import com.fasterxml.jackson.dataformat.cbor.CBORTestBase;
9+
10+
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
import static org.junit.jupiter.api.Assertions.assertNull;
12+
import static org.junit.jupiter.api.Assertions.fail;
13+
14+
public class CBORNumberParsingGetType1433Test
15+
extends CBORTestBase
16+
{
17+
private final CBORFactory JSON_F = cborFactory();
18+
19+
@Test
20+
void getNumberType() throws Exception
21+
{
22+
JsonParser p;
23+
24+
p = _createParser(jsonFactory(), " 123 ");
25+
_verifyGetNumberTypeFail(p, "null");
26+
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
27+
assertEquals(JsonParser.NumberType.INT, p.getNumberType());
28+
assertNull(p.nextToken());
29+
_verifyGetNumberTypeFail(p, "null");
30+
p.close();
31+
_verifyGetNumberTypeFail(p, "null");
32+
33+
p = _createParser(jsonFactory(), " -9 false ");
34+
_verifyGetNumberTypeFail(p, "null");
35+
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
36+
assertEquals(JsonParser.NumberType.INT, p.getNumberType());
37+
assertToken(JsonToken.VALUE_FALSE, p.nextToken());
38+
_verifyGetNumberTypeFail(p, "VALUE_FALSE");
39+
assertNull(p.nextToken());
40+
_verifyGetNumberTypeFail(p, "null");
41+
p.close();
42+
_verifyGetNumberTypeFail(p, "null");
43+
44+
p = _createParser(jsonFactory(), "[123, true]");
45+
_verifyGetNumberTypeFail(p, "null");
46+
assertToken(JsonToken.START_ARRAY, p.nextToken());
47+
_verifyGetNumberTypeFail(p, "START_ARRAY");
48+
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
49+
assertEquals(JsonParser.NumberType.INT, p.getNumberType());
50+
assertToken(JsonToken.VALUE_TRUE, p.nextToken());
51+
_verifyGetNumberTypeFail(p, "VALUE_TRUE");
52+
assertToken(JsonToken.END_ARRAY, p.nextToken());
53+
_verifyGetNumberTypeFail(p, "END_ARRAY");
54+
assertNull(p.nextToken());
55+
_verifyGetNumberTypeFail(p, "null");
56+
p.close();
57+
_verifyGetNumberTypeFail(p, "null");
58+
}
59+
60+
private void _verifyGetNumberTypeFail(JsonParser p, String token) throws Exception
61+
{
62+
try {
63+
p.getNumberType();
64+
fail("Should not pass");
65+
} catch (StreamReadException e) {
66+
verifyException(e, "Current token ("+token+") not numeric, can not use numeric");
67+
}
68+
}
69+
70+
private CBORFactory jsonFactory() {
71+
return JSON_F;
72+
}
73+
74+
private JsonParser _createParser(CBORFactory f, String text) throws Exception {
75+
return f.createParser(cborDoc(text));
76+
}
77+
}

smile/src/main/java/com/fasterxml/jackson/dataformat/smile/SmileParser.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1975,16 +1975,16 @@ private final static int _padQuadForNulls(int firstByte) {
19751975
@Override
19761976
protected void _parseNumericValue() throws IOException
19771977
{
1978-
if (!_tokenIncomplete) {
1979-
_reportError("Internal error: number token (%s) decoded, no value set", _currToken);
1980-
}
1981-
_tokenIncomplete = false;
1982-
int tb = _typeAsInt;
1983-
// ensure we got a numeric type with value that is lazily parsed
1984-
if ((tb >> 5) != 1) {
1985-
_reportError("Current token (%s) not numeric, can not use numeric value accessors", _currToken);
1978+
if (_tokenIncomplete) {
1979+
_tokenIncomplete = false;
1980+
int tb = _typeAsInt;
1981+
// ensure we got a numeric type with value that is lazily parsed
1982+
if ((tb >> 5) == 1) {
1983+
_finishNumberToken(tb);
1984+
return;
1985+
}
19861986
}
1987-
_finishNumberToken(tb);
1987+
_reportError("Current token (%s) not numeric, can not use numeric value accessors", _currToken);
19881988
}
19891989

19901990
/*

smile/src/test/java/com/fasterxml/jackson/dataformat/smile/parse/SmileDetectionTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
public class SmileDetectionTest extends BaseTestForSmile
1515
{
16-
1716
@Test
1817
public void testSimpleObjectWithHeader() throws IOException
1918
{
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.fasterxml.jackson.dataformat.smile.parse;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import com.fasterxml.jackson.core.*;
6+
import com.fasterxml.jackson.core.exc.StreamReadException;
7+
import com.fasterxml.jackson.dataformat.smile.SmileFactory;
8+
import com.fasterxml.jackson.dataformat.smile.BaseTestForSmile;
9+
10+
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
import static org.junit.jupiter.api.Assertions.assertNull;
12+
import static org.junit.jupiter.api.Assertions.fail;
13+
14+
public class SmileNumberParsingGetType1433Test
15+
extends BaseTestForSmile
16+
{
17+
private final SmileFactory JSON_F = smileFactory(false, true, false);
18+
19+
@Test
20+
void getNumberType() throws Exception
21+
{
22+
JsonParser p;
23+
24+
p = _createParser(jsonFactory(), " 123 ");
25+
_verifyGetNumberTypeFail(p, "null");
26+
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
27+
assertEquals(JsonParser.NumberType.INT, p.getNumberType());
28+
assertNull(p.nextToken());
29+
_verifyGetNumberTypeFail(p, "null");
30+
p.close();
31+
_verifyGetNumberTypeFail(p, "null");
32+
33+
p = _createParser(jsonFactory(), " -9 false ");
34+
_verifyGetNumberTypeFail(p, "null");
35+
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
36+
assertEquals(JsonParser.NumberType.INT, p.getNumberType());
37+
assertToken(JsonToken.VALUE_FALSE, p.nextToken());
38+
_verifyGetNumberTypeFail(p, "VALUE_FALSE");
39+
assertNull(p.nextToken());
40+
_verifyGetNumberTypeFail(p, "null");
41+
p.close();
42+
_verifyGetNumberTypeFail(p, "null");
43+
44+
p = _createParser(jsonFactory(), "[123, true]");
45+
_verifyGetNumberTypeFail(p, "null");
46+
assertToken(JsonToken.START_ARRAY, p.nextToken());
47+
_verifyGetNumberTypeFail(p, "START_ARRAY");
48+
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
49+
assertEquals(JsonParser.NumberType.INT, p.getNumberType());
50+
assertToken(JsonToken.VALUE_TRUE, p.nextToken());
51+
_verifyGetNumberTypeFail(p, "VALUE_TRUE");
52+
assertToken(JsonToken.END_ARRAY, p.nextToken());
53+
_verifyGetNumberTypeFail(p, "END_ARRAY");
54+
assertNull(p.nextToken());
55+
_verifyGetNumberTypeFail(p, "null");
56+
p.close();
57+
_verifyGetNumberTypeFail(p, "null");
58+
}
59+
60+
private void _verifyGetNumberTypeFail(JsonParser p, String token) throws Exception
61+
{
62+
try {
63+
p.getNumberType();
64+
fail("Should not pass");
65+
} catch (StreamReadException e) {
66+
verifyException(e, "Current token ("+token+") not numeric, can not use numeric");
67+
}
68+
}
69+
70+
private SmileFactory jsonFactory() {
71+
return JSON_F;
72+
}
73+
74+
private JsonParser _createParser(SmileFactory f, String text) throws Exception {
75+
return f.createParser(_smileDoc(text));
76+
}
77+
}

0 commit comments

Comments
 (0)