From ff04094b42d72d9c5071bc6ab1ec394904aab107 Mon Sep 17 00:00:00 2001 From: hannyu Date: Mon, 12 May 2025 22:35:45 +0800 Subject: [PATCH] feat: Add "optional" variants -- shortValueOpt(), etc. --- .../java/tools/jackson/databind/JsonNode.java | 40 +++++++++++++++++++ .../jackson/databind/node/BaseJsonNode.java | 24 +++++++++++ .../jackson/databind/node/BigIntegerNode.java | 40 ++++++++++++++++--- .../jackson/databind/node/DecimalNode.java | 24 +++++++++-- .../jackson/databind/node/DoubleNode.java | 19 +++++++++ .../jackson/databind/node/FloatNode.java | 11 +++++ .../tools/jackson/databind/node/IntNode.java | 11 ++++- .../tools/jackson/databind/node/LongNode.java | 10 +++++ .../tools/jackson/databind/node/NullNode.java | 10 +++++ .../jackson/databind/node/NumericFPNode.java | 16 ++++++++ .../jackson/databind/node/NumericIntNode.java | 10 +++++ .../jackson/databind/node/NumericNode.java | 4 ++ .../tools/jackson/databind/node/POJONode.java | 40 +++++++++++++++++++ .../jackson/databind/node/ShortNode.java | 11 ++++- .../jackson/databind/node/StringNode.java | 12 ++++++ .../databind/node/JsonNodeFloatValueTest.java | 7 ++++ .../databind/node/JsonNodeShortValueTest.java | 9 +++++ 17 files changed, 287 insertions(+), 11 deletions(-) diff --git a/src/main/java/tools/jackson/databind/JsonNode.java b/src/main/java/tools/jackson/databind/JsonNode.java index 7f37df8a35..b4a687edf7 100644 --- a/src/main/java/tools/jackson/databind/JsonNode.java +++ b/src/main/java/tools/jackson/databind/JsonNode.java @@ -754,6 +754,16 @@ public String asText(String defaultValue) { */ public abstract short shortValue(short defaultValue); + /** + * Method similar to {@link #shortValue()}, but that will return empty + * {@link Optional} ({@code Optional.empty()}) if this node cannot + * be converted to Java {@code short}. + * + * @return Java {@code short} value this node represents, as {@link Optional}, + * if possible to accurately represent; {@code Optional.empty()} otherwise + */ + public abstract Optional shortValueOpt(); + /** * Method similar to {@link #shortValue()} but in addition to coercing Number * values (same as {@link #shortValue()}), will also try to coerce a @@ -788,6 +798,16 @@ public String asText(String defaultValue) { */ public abstract short asShort(short defaultValue); + /** + * Method similar to {@link #asShort()}, but that will return + * ({@code Optional.empty()}) if this node cannot + * be coerced to {@code short}. + * + * @return {@link Optional} value this node represents, + * if possible to accurately represent; {@code Optional.empty()} otherwise + */ + public abstract Optional asShortOpt(); + // // Scalar access: Numbers, Java int /** @@ -1082,6 +1102,16 @@ public String asText(String defaultValue) { */ public abstract float floatValue(float defaultValue); + /** + * Method similar to {@link #floatValue()}, but that will return empty + * {@link Optional} ({@code Optional.empty()}) if this node cannot + * be converted to Java {@code float}. + * + * @return Java {@code float} value this node represents, as {@link Optional}, + * if possible to accurately represent; {@code Optional.empty()} otherwise + */ + public abstract Optional floatValueOpt(); + /** * Method similar to {@link #floatValue()} but in addition to coercing Number * values will also try coerce couple of additional types: @@ -1110,6 +1140,16 @@ public String asText(String defaultValue) { */ public abstract float asFloat(float defaultValue); + /** + * Method similar to {@link #asFloat()}, but that will return + * ({@code Optional.empty()}) if this node cannot + * be coerced to {@code float}. + * + * @return {@link Optional} value this node represents, + * if possible to accurately represent; {@code Optional.empty()} otherwise + */ + public abstract Optional asFloatOpt(); + // // Scalar access: Numbers, Java double /** diff --git a/src/main/java/tools/jackson/databind/node/BaseJsonNode.java b/src/main/java/tools/jackson/databind/node/BaseJsonNode.java index 1e7b287875..751171efa1 100644 --- a/src/main/java/tools/jackson/databind/node/BaseJsonNode.java +++ b/src/main/java/tools/jackson/databind/node/BaseJsonNode.java @@ -76,6 +76,12 @@ public short shortValue(short defaultValue) { return defaultValue; } + @Override + public Optional shortValueOpt() { + // Overridden by NumericNode, for other types return default + return Optional.empty(); + } + @Override public short asShort() { return _reportCoercionFail("asShort()", Short.TYPE, "value type not numeric"); @@ -87,6 +93,12 @@ public short asShort(short defaultValue) { return defaultValue; } + @Override + public Optional asShortOpt() { + // Overridden by NumericNode, for other types return default + return Optional.empty(); + } + @Override public int intValue() { return _reportCoercionFail("intValue()", Integer.TYPE, "value type not numeric"); @@ -200,6 +212,12 @@ public float floatValue(float defaultValue) { return defaultValue; } + @Override + public Optional floatValueOpt() { + // Overridden by NumericNode, for other types return default + return Optional.empty(); + } + @Override public float asFloat() { return _reportCoercionFail("asFloat()", Float.TYPE, "value type not numeric"); @@ -211,6 +229,12 @@ public float asFloat(float defaultValue) { return defaultValue; } + @Override + public Optional asFloatOpt() { + // Overridden by NumericNode, for other types return default + return Optional.empty(); + } + @Override public double doubleValue() { return _reportCoercionFail("doubleValue()", Double.TYPE, "value type not numeric"); diff --git a/src/main/java/tools/jackson/databind/node/BigIntegerNode.java b/src/main/java/tools/jackson/databind/node/BigIntegerNode.java index 80fbb2eca7..47277873c5 100644 --- a/src/main/java/tools/jackson/databind/node/BigIntegerNode.java +++ b/src/main/java/tools/jackson/databind/node/BigIntegerNode.java @@ -70,27 +70,37 @@ public Number numberValue() { @Override public short shortValue() { if (_inShortRange()) { - return (short) _value.intValue(); + return _value.shortValue(); } return _reportShortCoercionRangeFail("shortValue()"); } @Override public short shortValue(short defaultValue) { - return _inShortRange() ? (short) _value.intValue() : defaultValue; + return _inShortRange() ? _value.shortValue() : defaultValue; + } + + @Override + public Optional shortValueOpt() { + return _inShortRange() ? Optional.of(_value.shortValue()) : Optional.empty(); } @Override public short asShort() { if (_inShortRange()) { - return (short) _value.intValue(); + return _value.shortValue(); } return _reportShortCoercionRangeFail("asShort()"); } @Override public short asShort(short defaultValue) { - return _inShortRange() ? (short) _value.intValue() : defaultValue; + return _inShortRange() ? _value.shortValue() : defaultValue; + } + + @Override + public Optional asShortOpt() { + return _inShortRange() ? Optional.of(_value.shortValue()) : Optional.empty(); } @Override @@ -193,6 +203,15 @@ public float floatValue(float defaultValue) { return (Float.isFinite(f)) ? f : defaultValue; } + @Override + public Optional floatValueOpt() { + float f = _asFloatValueUnchecked(); + if (Float.isFinite(f)) { + return Optional.of(f); + } + return Optional.empty(); + } + @Override public float asFloat() { float f = _asFloatValueUnchecked(); @@ -208,6 +227,15 @@ public float asFloat(float defaultValue) { return (Float.isFinite(f)) ? f : defaultValue; } + @Override + public Optional asFloatOpt() { + float f = _asFloatValueUnchecked(); + if (Float.isFinite(f)) { + return Optional.of(f); + } + return Optional.empty(); + } + @Override public double doubleValue() { double d = _asDoubleValueUnchecked(); @@ -227,7 +255,7 @@ public double doubleValue(double defaultValue) { public OptionalDouble doubleValueOpt() { double d = _asDoubleValueUnchecked(); if (Double.isFinite(d)) { - return OptionalDouble.of(_value.doubleValue()); + return OptionalDouble.of(d); } return OptionalDouble.empty(); } @@ -251,7 +279,7 @@ public double asDouble(double defaultValue) { public OptionalDouble asDoubleOpt() { double d = _asDoubleValueUnchecked(); if (Double.isFinite(d)) { - return OptionalDouble.of(_value.doubleValue()); + return OptionalDouble.of(d); } return OptionalDouble.empty(); } diff --git a/src/main/java/tools/jackson/databind/node/DecimalNode.java b/src/main/java/tools/jackson/databind/node/DecimalNode.java index 1b4d7f22af..265f232ce5 100644 --- a/src/main/java/tools/jackson/databind/node/DecimalNode.java +++ b/src/main/java/tools/jackson/databind/node/DecimalNode.java @@ -89,6 +89,15 @@ public float floatValue(float defaultValue) { return defaultValue; } + @Override + public Optional floatValueOpt() { + float f = _value.floatValue(); + if (Float.isFinite(f)) { + return Optional.of(f); + } + return Optional.empty(); + } + @Override public float asFloat() { float f = _value.floatValue(); @@ -107,6 +116,15 @@ public float asFloat(float defaultValue) { return defaultValue; } + @Override + public Optional asFloatOpt() { + float f = _value.floatValue(); + if (Float.isFinite(f)) { + return Optional.of(f); + } + return Optional.empty(); + } + @Override public double doubleValue() { double d = _value.doubleValue(); @@ -129,7 +147,7 @@ public double doubleValue(double defaultValue) { public OptionalDouble doubleValueOpt() { double d = _value.doubleValue(); if (Double.isFinite(d)) { - return OptionalDouble.of(_value.doubleValue()); + return OptionalDouble.of(d); } return OptionalDouble.empty(); } @@ -156,7 +174,7 @@ public double asDouble(double defaultValue) { public OptionalDouble asDoubleOpt() { double d = _value.doubleValue(); if (Double.isFinite(d)) { - return OptionalDouble.of(_value.doubleValue()); + return OptionalDouble.of(d); } return OptionalDouble.empty(); } @@ -226,7 +244,7 @@ protected boolean _inShortRange() { @Override protected boolean _inIntRange() { - return _inLongRange() && (_value.compareTo(BD_MIN_INTEGER) >= 0) && (_value.compareTo(BD_MAX_INTEGER) <= 0); + return (_value.compareTo(BD_MIN_INTEGER) >= 0) && (_value.compareTo(BD_MAX_INTEGER) <= 0); } @Override diff --git a/src/main/java/tools/jackson/databind/node/DoubleNode.java b/src/main/java/tools/jackson/databind/node/DoubleNode.java index d2334e7d91..f172fa2d54 100644 --- a/src/main/java/tools/jackson/databind/node/DoubleNode.java +++ b/src/main/java/tools/jackson/databind/node/DoubleNode.java @@ -2,6 +2,7 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Optional; import java.util.OptionalDouble; import tools.jackson.core.*; @@ -86,6 +87,15 @@ public float floatValue(float defaultValue) { return defaultValue; } + @Override + public Optional floatValueOpt() { + float f = (float) _value; + if (Float.isFinite(f)) { + return Optional.of(f); + } + return Optional.empty(); + } + @Override public float asFloat() { float f = (float) _value; @@ -104,6 +114,15 @@ public float asFloat(float defaultValue) { return defaultValue; } + @Override + public Optional asFloatOpt() { + float f = (float) _value; + if (Float.isFinite(f)) { + return Optional.of(f); + } + return Optional.empty(); + } + @Override public double doubleValue() { return _value; diff --git a/src/main/java/tools/jackson/databind/node/FloatNode.java b/src/main/java/tools/jackson/databind/node/FloatNode.java index 467ea2a1e4..cf81fc7ed3 100644 --- a/src/main/java/tools/jackson/databind/node/FloatNode.java +++ b/src/main/java/tools/jackson/databind/node/FloatNode.java @@ -2,6 +2,7 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Optional; import java.util.OptionalDouble; import tools.jackson.core.*; @@ -72,6 +73,11 @@ public float floatValue(float defaultValue) { return _value; } + @Override + public Optional floatValueOpt() { + return Optional.of(_value); + } + @Override public float asFloat() { return _value; @@ -82,6 +88,11 @@ public float asFloat(float defaultValue) { return _value; } + @Override + public Optional asFloatOpt() { + return Optional.of(_value); + } + @Override public double doubleValue() { return _value; diff --git a/src/main/java/tools/jackson/databind/node/IntNode.java b/src/main/java/tools/jackson/databind/node/IntNode.java index c5fde896b4..555d00b78d 100644 --- a/src/main/java/tools/jackson/databind/node/IntNode.java +++ b/src/main/java/tools/jackson/databind/node/IntNode.java @@ -95,6 +95,11 @@ public short shortValue(short defaultValue) { return _inShortRange() ? (short) _value : defaultValue; } + @Override + public Optional shortValueOpt() { + return _inShortRange() ? Optional.of((short) _value) : Optional.empty(); + } + @Override public short asShort() { if (_inShortRange()) { @@ -108,6 +113,11 @@ public short asShort(short defaultValue) { return _inShortRange() ? (short) _value : defaultValue; } + @Override + public Optional asShortOpt() { + return _inShortRange() ? Optional.of((short) _value) : Optional.empty(); + } + @Override public int intValue() { return _value; } @@ -132,7 +142,6 @@ public int asInt(int defaultValue) { @Override public OptionalInt asIntOpt() { return OptionalInt.of(_value); - } @Override diff --git a/src/main/java/tools/jackson/databind/node/LongNode.java b/src/main/java/tools/jackson/databind/node/LongNode.java index 9cfda12086..b1da36f888 100644 --- a/src/main/java/tools/jackson/databind/node/LongNode.java +++ b/src/main/java/tools/jackson/databind/node/LongNode.java @@ -75,6 +75,11 @@ public short shortValue(short defaultValue) { return _inShortRange() ? (short) _value : defaultValue; } + @Override + public Optional shortValueOpt() { + return _inShortRange() ? Optional.of((short) _value) : Optional.empty(); + } + @Override public short asShort() { if (_inShortRange()) { @@ -88,6 +93,11 @@ public short asShort(short defaultValue) { return _inShortRange() ? (short) _value : defaultValue; } + @Override + public Optional asShortOpt() { + return _inShortRange() ? Optional.of((short) _value) : Optional.empty(); + } + @Override public int intValue() { if (_inIntRange()) { diff --git a/src/main/java/tools/jackson/databind/node/NullNode.java b/src/main/java/tools/jackson/databind/node/NullNode.java index 177e9bf7c4..19676913b1 100644 --- a/src/main/java/tools/jackson/databind/node/NullNode.java +++ b/src/main/java/tools/jackson/databind/node/NullNode.java @@ -77,6 +77,11 @@ public short asShort(short defaultValue) { return 0; } + @Override + public Optional asShortOpt() { + return Optional.of((short) 0); + } + // `intValue()` (etc) fine as defaults (fail); but need to override `asInt()` @Override @@ -136,6 +141,11 @@ public float asFloat(float defaultValue) { return asFloat(); } + @Override + public Optional asFloatOpt() { + return Optional.of(asFloat()); + } + // `doubleValue()` (etc) fine as defaults (fail); but need to override `asDouble()` @Override diff --git a/src/main/java/tools/jackson/databind/node/NumericFPNode.java b/src/main/java/tools/jackson/databind/node/NumericFPNode.java index eb532918a3..c342fe2f68 100644 --- a/src/main/java/tools/jackson/databind/node/NumericFPNode.java +++ b/src/main/java/tools/jackson/databind/node/NumericFPNode.java @@ -79,6 +79,14 @@ public final short shortValue(short defaultValue) { return _asShortValueUnchecked(); } + @Override + public final Optional shortValueOpt() { + if (!_inShortRange() || _hasFractionalPart()) { + return Optional.empty(); + } + return Optional.of(_asShortValueUnchecked()); + } + @Override public short asShort() { if (!_inShortRange()) { @@ -98,6 +106,14 @@ public short asShort(short defaultValue) { return _asShortValueUnchecked(); } + @Override + public Optional asShortOpt() { + if (!_inShortRange()) { + return Optional.empty(); + } + return Optional.of(_asShortValueUnchecked()); + } + @Override public final int intValue() { if (!_inIntRange()) { diff --git a/src/main/java/tools/jackson/databind/node/NumericIntNode.java b/src/main/java/tools/jackson/databind/node/NumericIntNode.java index 0b59297032..9089e8a2e5 100644 --- a/src/main/java/tools/jackson/databind/node/NumericIntNode.java +++ b/src/main/java/tools/jackson/databind/node/NumericIntNode.java @@ -96,6 +96,11 @@ public float floatValue(float defaultValue) { return _asFloatValueUnchecked(); } + @Override + public Optional floatValueOpt() { + return Optional.of(_asFloatValueUnchecked()); + } + @Override public float asFloat() { return _asFloatValueUnchecked(); @@ -106,6 +111,11 @@ public float asFloat(float defaultValue) { return _asFloatValueUnchecked(); } + @Override + public Optional asFloatOpt() { + return Optional.of(_asFloatValueUnchecked()); + } + @Override public double doubleValue() { return _asDoubleValueUnchecked(); diff --git a/src/main/java/tools/jackson/databind/node/NumericNode.java b/src/main/java/tools/jackson/databind/node/NumericNode.java index a187e1d188..7b0a538626 100644 --- a/src/main/java/tools/jackson/databind/node/NumericNode.java +++ b/src/main/java/tools/jackson/databind/node/NumericNode.java @@ -43,8 +43,10 @@ protected final String _valueDesc() { @Override public abstract short shortValue(); @Override public abstract short shortValue(short defaultValue); + @Override public abstract Optional shortValueOpt(); @Override public abstract short asShort(); @Override public abstract short asShort(short defaultValue); + @Override public abstract Optional asShortOpt(); @Override public abstract int intValue(); @Override public abstract int intValue(int defaultValue); @@ -69,8 +71,10 @@ protected final String _valueDesc() { @Override public abstract float floatValue(); @Override public abstract float floatValue(float defaultValue); + @Override public abstract Optional floatValueOpt(); @Override public abstract float asFloat(); @Override public abstract float asFloat(float defaultValue); + @Override public abstract Optional asFloatOpt(); @Override public abstract double doubleValue(); @Override public abstract double doubleValue(double defaultValue); diff --git a/src/main/java/tools/jackson/databind/node/POJONode.java b/src/main/java/tools/jackson/databind/node/POJONode.java index fa9450329b..f06a454290 100644 --- a/src/main/java/tools/jackson/databind/node/POJONode.java +++ b/src/main/java/tools/jackson/databind/node/POJONode.java @@ -142,6 +142,26 @@ public short asShort(short defaultValue) { return L.shortValue(); } + @Override + public Optional asShortOpt() { + // First, `null` same as `NullNode` + if (_value == null) { + return Optional.of((short) 0); + } + + // Next, check if the value is NOT a Number + if (!(_value instanceof Number)) { + return Optional.empty(); + } + + // Then, extract from Number + Long L = _extractAsLong(); + if (L == null || L < Short.MIN_VALUE || L > Short.MAX_VALUE) { + return Optional.empty(); + } + return Optional.of(L.shortValue()); + } + // `intValue()` (etc) fine as defaults (fail); but need to override `asInt()` @Override @@ -365,6 +385,26 @@ public float asFloat(float defaultValue) { return F; } + @Override + public Optional asFloatOpt() { + // First, `null` same as `NullNode` + if (_value == null) { + return Optional.of(0.0f); + } + + // Next, check if the value is NOT a Number + if (!(_value instanceof Number)) { + return Optional.empty(); + } + + // Then, extract from Number + Float F = _extractAsFloat(); + if (F == null) { + return Optional.empty(); + } + return Optional.of(F); + } + // `doubleValue()` (etc) fine as defaults (fail); but need to override `asDouble()` @Override diff --git a/src/main/java/tools/jackson/databind/node/ShortNode.java b/src/main/java/tools/jackson/databind/node/ShortNode.java index c2b28d5786..9a46ea969e 100644 --- a/src/main/java/tools/jackson/databind/node/ShortNode.java +++ b/src/main/java/tools/jackson/databind/node/ShortNode.java @@ -72,6 +72,11 @@ public Number numberValue() { @Override public short shortValue(short defaultValue) { return _value; } + @Override + public Optional shortValueOpt() { + return Optional.of(_value); + } + @Override public short asShort() { return _value; @@ -82,6 +87,11 @@ public short asShort(short defaultValue) { return _value; } + @Override + public Optional asShortOpt() { + return Optional.of(_value); + } + @Override public int intValue() { return _value; } @@ -106,7 +116,6 @@ public int asInt(int defaultValue) { @Override public OptionalInt asIntOpt() { return OptionalInt.of(_value); - } @Override diff --git a/src/main/java/tools/jackson/databind/node/StringNode.java b/src/main/java/tools/jackson/databind/node/StringNode.java index 6ac0929b79..b75e5c92f9 100644 --- a/src/main/java/tools/jackson/databind/node/StringNode.java +++ b/src/main/java/tools/jackson/databind/node/StringNode.java @@ -179,6 +179,12 @@ public short asShort(short defaultValue) { return (S == null) ? defaultValue : S; } + @Override + public Optional asShortOpt() { + Short S = _tryParseAsShort(); + return (S == null) ? Optional.empty() : Optional.of(S); + } + @Override public int asInt() { Integer I = _tryParseAsInteger(); @@ -267,6 +273,12 @@ public float asFloat(float defaultValue) return (F == null) ? defaultValue : F; } + @Override + public Optional asFloatOpt() { + Float F = _tryParseAsFloat(); + return (F == null) ? Optional.empty() : Optional.of(F); + } + // `doubleValue()` (etc) fine as defaults (fail); but need to override `asDouble()` @Override diff --git a/src/test/java/tools/jackson/databind/node/JsonNodeFloatValueTest.java b/src/test/java/tools/jackson/databind/node/JsonNodeFloatValueTest.java index 5e9bca91be..d8e62941b7 100644 --- a/src/test/java/tools/jackson/databind/node/JsonNodeFloatValueTest.java +++ b/src/test/java/tools/jackson/databind/node/JsonNodeFloatValueTest.java @@ -2,6 +2,7 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Optional; import org.junit.jupiter.api.Test; @@ -246,6 +247,7 @@ private void _assertFloatValue(float expected, JsonNode node) { // and defaults assertEquals(expected, node.floatValue(-9999.5f)); + assertEquals(expected, node.floatValueOpt().get()); } private void _assertFailFloatForValueRange(JsonNode node) { @@ -257,6 +259,7 @@ private void _assertFailFloatForValueRange(JsonNode node) { .contains("value not in 32-bit `float` range"); assertEquals(-2.25f, node.floatValue(-2.25f)); + assertEquals(Optional.empty(), node.floatValueOpt()); } private void _assertFailFloatForNonNumber(JsonNode node) { @@ -268,6 +271,7 @@ private void _assertFailFloatForNonNumber(JsonNode node) { .contains("value type not numeric"); assertEquals(-2.25f, node.floatValue(-2.25f)); + assertEquals(Optional.empty(), node.floatValueOpt()); } private void _assertAsFloat(float expected, JsonNode node) { @@ -275,6 +279,7 @@ private void _assertAsFloat(float expected, JsonNode node) { // and defaults assertEquals(expected, node.asFloat(-9999.5f)); + assertEquals(expected, node.asFloatOpt().get()); } private void _assertAsFloatFailForValueRange(JsonNode node) { @@ -287,6 +292,7 @@ private void _assertAsFloatFailForValueRange(JsonNode node) { .contains("value not in 32-bit `float` range"); assertEquals(-2.25f, node.asFloat(-2.25f)); + assertEquals(Optional.empty(), node.asFloatOpt()); } private void _assertAsFloatFailForNonNumber(JsonNode node) { @@ -303,6 +309,7 @@ private void _assertAsFloatFailForNonNumber(JsonNode node, String extraMatch) { .contains(extraMatch); assertEquals(1.5f, node.asFloat(1.5f)); + assertEquals(Optional.empty(), node.asFloatOpt()); } } diff --git a/src/test/java/tools/jackson/databind/node/JsonNodeShortValueTest.java b/src/test/java/tools/jackson/databind/node/JsonNodeShortValueTest.java index 83a5a2040e..4489fa08c1 100644 --- a/src/test/java/tools/jackson/databind/node/JsonNodeShortValueTest.java +++ b/src/test/java/tools/jackson/databind/node/JsonNodeShortValueTest.java @@ -2,6 +2,7 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Optional; import org.junit.jupiter.api.Test; @@ -294,6 +295,7 @@ private void _assertShortValue(short expected, JsonNode node) { // and defaulting assertEquals(expected, node.shortValue((short) 99)); + assertEquals(expected, node.shortValueOpt().get()); } // // // Shared helper methods @@ -308,6 +310,7 @@ private void _assertFailShortForValueRange(JsonNode node) { // assert defaulting assertEquals(99, node.shortValue((short) 99)); + assertEquals(Optional.empty(), node.shortValueOpt()); } private void _assertFailShortValueForFraction(JsonNode node) { @@ -320,6 +323,7 @@ private void _assertFailShortValueForFraction(JsonNode node) { // assert defaulting assertEquals(99, node.shortValue((short) 99)); + assertEquals(Optional.empty(), node.shortValueOpt()); } private void _assertFailShortForNonNumber(JsonNode node) { @@ -332,6 +336,7 @@ private void _assertFailShortForNonNumber(JsonNode node) { // assert defaulting assertEquals(99, node.shortValue((short) 99)); + assertEquals(Optional.empty(), node.shortValueOpt()); } // // // Shared helper methods: asShort() @@ -341,6 +346,7 @@ private void _assertAsShort(short expected, JsonNode node) { // and defaulting assertEquals(expected, node.asShort((short) 99)); + assertEquals(expected, node.asShortOpt().get()); } private void _assertAsShortFailForValueRange(JsonNode node) { @@ -354,6 +360,7 @@ private void _assertAsShortFailForValueRange(JsonNode node) { // assert defaulting assertEquals(99, node.asShort((short) 99)); + assertFalse(node.asShortOpt().isPresent()); } private void _assertAsShortFailForNonNumber(JsonNode node) { @@ -371,6 +378,7 @@ private void _assertAsShortFailForNonNumber(JsonNode node, String extraFailMsg) // assert defaulting assertEquals(99, node.asShort((short) 99)); + assertFalse(node.asShortOpt().isPresent()); } private void _assertAsShortFailForNaN(JsonNode node) { @@ -384,6 +392,7 @@ private void _assertAsShortFailForNaN(JsonNode node) { // Verify default value handling assertEquals(99, node.asShort((short) 99)); + assertFalse(node.asShortOpt().isPresent()); }