Skip to content

Commit cea91f3

Browse files
committed
Merge branch '2.x' into 3.x
2 parents 7dd8392 + 01aa0bc commit cea91f3

File tree

3 files changed

+163
-9
lines changed

3 files changed

+163
-9
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package tools.jackson.dataformat.cbor.parse;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import tools.jackson.core.*;
6+
import tools.jackson.core.exc.StreamReadException;
7+
import tools.jackson.dataformat.cbor.CBORFactory;
8+
import tools.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(ObjectReadContext.empty(), cborDoc(text));
76+
}
77+
}

smile/src/main/java/tools/jackson/dataformat/smile/SmileParser.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2252,16 +2252,16 @@ private final static int _padQuadForNulls(int firstByte) {
22522252
@Override
22532253
protected void _parseNumericValue() throws JacksonException
22542254
{
2255-
if (!_tokenIncomplete) {
2256-
throw _constructReadException("Internal error: number token (%s) decoded, no value set", _currToken);
2257-
}
2258-
_tokenIncomplete = false;
2259-
int tb = _typeAsInt;
2260-
// ensure we got a numeric type with value that is lazily parsed
2261-
if ((tb >> 5) != 1) {
2262-
throw _constructReadException("Current token (%s) not numeric, can not use numeric value accessors", _currToken);
2255+
if (_tokenIncomplete) {
2256+
_tokenIncomplete = false;
2257+
int tb = _typeAsInt;
2258+
// ensure we got a numeric type with value that is lazily parsed
2259+
if ((tb >> 5) == 1) {
2260+
_finishNumberToken(tb);
2261+
return;
2262+
}
22632263
}
2264-
_finishNumberToken(tb);
2264+
throw _constructReadException("Current token (%s) not numeric, cannot use numeric value accessors", _currToken);
22652265
}
22662266

22672267
/*
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package tools.jackson.dataformat.smile.parse;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import tools.jackson.core.*;
6+
import tools.jackson.core.exc.StreamReadException;
7+
import tools.jackson.dataformat.smile.SmileFactory;
8+
import tools.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, cannot 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(ObjectReadContext.empty(), _smileDoc(text));
76+
}
77+
}

0 commit comments

Comments
 (0)