From 1477d8ba4ba5f372150a62fdab5afdfb5eb25510 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Thu, 29 May 2025 10:31:39 -0700 Subject: [PATCH] Add smile tests --- .../CBORNumberParsingGetType1433Test.java | 77 +++++++++++++++++++ .../jackson/dataformat/smile/SmileParser.java | 18 ++--- .../smile/parse/SmileDetectionTest.java | 1 - .../SmileNumberParsingGetType1433Test.java | 77 +++++++++++++++++++ 4 files changed, 163 insertions(+), 10 deletions(-) create mode 100644 cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/parse/CBORNumberParsingGetType1433Test.java create mode 100644 smile/src/test/java/com/fasterxml/jackson/dataformat/smile/parse/SmileNumberParsingGetType1433Test.java diff --git a/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/parse/CBORNumberParsingGetType1433Test.java b/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/parse/CBORNumberParsingGetType1433Test.java new file mode 100644 index 000000000..ddf9604f5 --- /dev/null +++ b/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/parse/CBORNumberParsingGetType1433Test.java @@ -0,0 +1,77 @@ +package com.fasterxml.jackson.dataformat.cbor.parse; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.exc.StreamReadException; +import com.fasterxml.jackson.dataformat.cbor.CBORFactory; +import com.fasterxml.jackson.dataformat.cbor.CBORTestBase; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.fail; + +public class CBORNumberParsingGetType1433Test + extends CBORTestBase +{ + private final CBORFactory JSON_F = cborFactory(); + + @Test + void getNumberType() throws Exception + { + JsonParser p; + + p = _createParser(jsonFactory(), " 123 "); + _verifyGetNumberTypeFail(p, "null"); + assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken()); + assertEquals(JsonParser.NumberType.INT, p.getNumberType()); + assertNull(p.nextToken()); + _verifyGetNumberTypeFail(p, "null"); + p.close(); + _verifyGetNumberTypeFail(p, "null"); + + p = _createParser(jsonFactory(), " -9 false "); + _verifyGetNumberTypeFail(p, "null"); + assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken()); + assertEquals(JsonParser.NumberType.INT, p.getNumberType()); + assertToken(JsonToken.VALUE_FALSE, p.nextToken()); + _verifyGetNumberTypeFail(p, "VALUE_FALSE"); + assertNull(p.nextToken()); + _verifyGetNumberTypeFail(p, "null"); + p.close(); + _verifyGetNumberTypeFail(p, "null"); + + p = _createParser(jsonFactory(), "[123, true]"); + _verifyGetNumberTypeFail(p, "null"); + assertToken(JsonToken.START_ARRAY, p.nextToken()); + _verifyGetNumberTypeFail(p, "START_ARRAY"); + assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken()); + assertEquals(JsonParser.NumberType.INT, p.getNumberType()); + assertToken(JsonToken.VALUE_TRUE, p.nextToken()); + _verifyGetNumberTypeFail(p, "VALUE_TRUE"); + assertToken(JsonToken.END_ARRAY, p.nextToken()); + _verifyGetNumberTypeFail(p, "END_ARRAY"); + assertNull(p.nextToken()); + _verifyGetNumberTypeFail(p, "null"); + p.close(); + _verifyGetNumberTypeFail(p, "null"); + } + + private void _verifyGetNumberTypeFail(JsonParser p, String token) throws Exception + { + try { + p.getNumberType(); + fail("Should not pass"); + } catch (StreamReadException e) { + verifyException(e, "Current token ("+token+") not numeric, can not use numeric"); + } + } + + private CBORFactory jsonFactory() { + return JSON_F; + } + + private JsonParser _createParser(CBORFactory f, String text) throws Exception { + return f.createParser(cborDoc(text)); + } +} diff --git a/smile/src/main/java/com/fasterxml/jackson/dataformat/smile/SmileParser.java b/smile/src/main/java/com/fasterxml/jackson/dataformat/smile/SmileParser.java index fe3e65e22..f429cda2e 100644 --- a/smile/src/main/java/com/fasterxml/jackson/dataformat/smile/SmileParser.java +++ b/smile/src/main/java/com/fasterxml/jackson/dataformat/smile/SmileParser.java @@ -1975,16 +1975,16 @@ private final static int _padQuadForNulls(int firstByte) { @Override protected void _parseNumericValue() throws IOException { - if (!_tokenIncomplete) { - _reportError("Internal error: number token (%s) decoded, no value set", _currToken); - } - _tokenIncomplete = false; - int tb = _typeAsInt; - // ensure we got a numeric type with value that is lazily parsed - if ((tb >> 5) != 1) { - _reportError("Current token (%s) not numeric, can not use numeric value accessors", _currToken); + if (_tokenIncomplete) { + _tokenIncomplete = false; + int tb = _typeAsInt; + // ensure we got a numeric type with value that is lazily parsed + if ((tb >> 5) == 1) { + _finishNumberToken(tb); + return; + } } - _finishNumberToken(tb); + _reportError("Current token (%s) not numeric, can not use numeric value accessors", _currToken); } /* diff --git a/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/parse/SmileDetectionTest.java b/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/parse/SmileDetectionTest.java index 25448cc14..ba700b7f7 100644 --- a/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/parse/SmileDetectionTest.java +++ b/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/parse/SmileDetectionTest.java @@ -13,7 +13,6 @@ public class SmileDetectionTest extends BaseTestForSmile { - @Test public void testSimpleObjectWithHeader() throws IOException { diff --git a/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/parse/SmileNumberParsingGetType1433Test.java b/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/parse/SmileNumberParsingGetType1433Test.java new file mode 100644 index 000000000..5787ff886 --- /dev/null +++ b/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/parse/SmileNumberParsingGetType1433Test.java @@ -0,0 +1,77 @@ +package com.fasterxml.jackson.dataformat.smile.parse; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.exc.StreamReadException; +import com.fasterxml.jackson.dataformat.smile.SmileFactory; +import com.fasterxml.jackson.dataformat.smile.BaseTestForSmile; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.fail; + +public class SmileNumberParsingGetType1433Test + extends BaseTestForSmile +{ + private final SmileFactory JSON_F = smileFactory(false, true, false); + + @Test + void getNumberType() throws Exception + { + JsonParser p; + + p = _createParser(jsonFactory(), " 123 "); + _verifyGetNumberTypeFail(p, "null"); + assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken()); + assertEquals(JsonParser.NumberType.INT, p.getNumberType()); + assertNull(p.nextToken()); + _verifyGetNumberTypeFail(p, "null"); + p.close(); + _verifyGetNumberTypeFail(p, "null"); + + p = _createParser(jsonFactory(), " -9 false "); + _verifyGetNumberTypeFail(p, "null"); + assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken()); + assertEquals(JsonParser.NumberType.INT, p.getNumberType()); + assertToken(JsonToken.VALUE_FALSE, p.nextToken()); + _verifyGetNumberTypeFail(p, "VALUE_FALSE"); + assertNull(p.nextToken()); + _verifyGetNumberTypeFail(p, "null"); + p.close(); + _verifyGetNumberTypeFail(p, "null"); + + p = _createParser(jsonFactory(), "[123, true]"); + _verifyGetNumberTypeFail(p, "null"); + assertToken(JsonToken.START_ARRAY, p.nextToken()); + _verifyGetNumberTypeFail(p, "START_ARRAY"); + assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken()); + assertEquals(JsonParser.NumberType.INT, p.getNumberType()); + assertToken(JsonToken.VALUE_TRUE, p.nextToken()); + _verifyGetNumberTypeFail(p, "VALUE_TRUE"); + assertToken(JsonToken.END_ARRAY, p.nextToken()); + _verifyGetNumberTypeFail(p, "END_ARRAY"); + assertNull(p.nextToken()); + _verifyGetNumberTypeFail(p, "null"); + p.close(); + _verifyGetNumberTypeFail(p, "null"); + } + + private void _verifyGetNumberTypeFail(JsonParser p, String token) throws Exception + { + try { + p.getNumberType(); + fail("Should not pass"); + } catch (StreamReadException e) { + verifyException(e, "Current token ("+token+") not numeric, can not use numeric"); + } + } + + private SmileFactory jsonFactory() { + return JSON_F; + } + + private JsonParser _createParser(SmileFactory f, String text) throws Exception { + return f.createParser(_smileDoc(text)); + } +}