From 275f84450821a7a955a5f1c6ca10fa1188b46454 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Tue, 11 Feb 2025 14:44:38 +0100 Subject: [PATCH 1/3] add big decimal tests --- .../cbor/mapper/NumberBeanTest.java | 36 +++++++++++++ .../smile/mapper/NumberReadTest.java | 50 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 smile/src/test/java/com/fasterxml/jackson/dataformat/smile/mapper/NumberReadTest.java diff --git a/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java b/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java index 801015176..1f2e0a0b9 100644 --- a/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java +++ b/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java @@ -4,6 +4,7 @@ import java.math.BigDecimal; import java.math.BigInteger; +import com.fasterxml.jackson.annotation.JsonCreator; import org.junit.jupiter.api.Test; import com.fasterxml.jackson.annotation.JsonUnwrapped; @@ -47,6 +48,25 @@ static class NestedBigDecimalHolder2784 { public BigDecimalHolder2784 holder; } + static class DeserializationIssue4917 { + public DecimalHolder4917 decimalHolder; + public double number; + } + + static class DecimalHolder4917 { + public BigDecimal value; + + private DecimalHolder4917(BigDecimal value) { + this.value = value; + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + static DecimalHolder4917 of(BigDecimal value) { + return new DecimalHolder4917(value); + } + } + + /* /********************************************************** /* Test methods @@ -256,4 +276,20 @@ public void testBigDecimalWithBuffering() throws Exception NestedBigDecimalHolder2784.class); assertEquals(VALUE, result.holder.value); } + + // [databind#4917] + @Test + public void testIssue4917() throws Exception { + final String bd = "100.00"; + final double d = 50.0; + final DeserializationIssue4917 value = new DeserializationIssue4917(); + value.decimalHolder = DecimalHolder4917.of(new BigDecimal(bd)); + value.number = d; + final byte[] data = MAPPER.writeValueAsBytes(value); + final DeserializationIssue4917 result = MAPPER.readValue( + data, DeserializationIssue4917.class); + assertEquals(value.decimalHolder.value, result.decimalHolder.value); + assertEquals(value.number, result.number); + } + } diff --git a/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/mapper/NumberReadTest.java b/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/mapper/NumberReadTest.java new file mode 100644 index 000000000..34feefb27 --- /dev/null +++ b/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/mapper/NumberReadTest.java @@ -0,0 +1,50 @@ +package com.fasterxml.jackson.dataformat.smile.mapper; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.dataformat.smile.BaseTestForSmile; +import com.fasterxml.jackson.dataformat.smile.databind.SmileMapper; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.math.BigDecimal; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class NumberReadTest extends BaseTestForSmile { + + static class DeserializationIssue4917 { + public DecimalHolder4917 decimalHolder; + public double number; + } + + static class DecimalHolder4917 { + public BigDecimal value; + + private DecimalHolder4917(BigDecimal value) { + this.value = value; + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + static DecimalHolder4917 of(BigDecimal value) { + return new DecimalHolder4917(value); + } + } + + // [databind#4917] + @Test + public void testIssue4917() throws Exception { + final String bd = "100.00"; + final double d = 50.0; + final DeserializationIssue4917 value = new DeserializationIssue4917(); + value.decimalHolder = DecimalHolder4917.of(new BigDecimal(bd)); + value.number = d; + final SmileMapper mapper = smileMapper(); + final byte[] data = mapper.writeValueAsBytes(value); + final DeserializationIssue4917 result = mapper.readValue( + data, DeserializationIssue4917.class); + assertEquals(value.decimalHolder.value, result.decimalHolder.value); + assertEquals(value.number, result.number); + } + +} From 9c06bb931e0cddc4755651cd241c2ba76d5c118a Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Wed, 12 Feb 2025 00:45:26 +0100 Subject: [PATCH 2/3] Update NumberBeanTest.java --- .../jackson/dataformat/cbor/mapper/NumberBeanTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java b/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java index 1f2e0a0b9..3393a705e 100644 --- a/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java +++ b/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java @@ -4,9 +4,9 @@ import java.math.BigDecimal; import java.math.BigInteger; -import com.fasterxml.jackson.annotation.JsonCreator; import org.junit.jupiter.api.Test; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonUnwrapped; import com.fasterxml.jackson.core.JsonParser.NumberType; import com.fasterxml.jackson.core.JsonToken; From ad342289b9ce6f0fc4dfa2904f9cf95abdd966dc Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Tue, 11 Feb 2025 19:03:16 -0800 Subject: [PATCH 3/3] Fix tests --- .../jackson/dataformat/cbor/mapper/NumberBeanTest.java | 6 ++++-- .../jackson/dataformat/smile/mapper/NumberReadTest.java | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java b/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java index 3393a705e..d8e3cb63b 100644 --- a/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java +++ b/cbor/src/test/java/com/fasterxml/jackson/dataformat/cbor/mapper/NumberBeanTest.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonUnwrapped; +import com.fasterxml.jackson.annotation.JsonValue; import com.fasterxml.jackson.core.JsonParser.NumberType; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.ObjectMapper; @@ -54,7 +55,8 @@ static class DeserializationIssue4917 { } static class DecimalHolder4917 { - public BigDecimal value; + @JsonValue + BigDecimal value; private DecimalHolder4917(BigDecimal value) { this.value = value; @@ -66,7 +68,6 @@ static DecimalHolder4917 of(BigDecimal value) { } } - /* /********************************************************** /* Test methods @@ -286,6 +287,7 @@ public void testIssue4917() throws Exception { value.decimalHolder = DecimalHolder4917.of(new BigDecimal(bd)); value.number = d; final byte[] data = MAPPER.writeValueAsBytes(value); + final DeserializationIssue4917 result = MAPPER.readValue( data, DeserializationIssue4917.class); assertEquals(value.decimalHolder.value, result.decimalHolder.value); diff --git a/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/mapper/NumberReadTest.java b/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/mapper/NumberReadTest.java index 34feefb27..5cd9d518e 100644 --- a/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/mapper/NumberReadTest.java +++ b/smile/src/test/java/com/fasterxml/jackson/dataformat/smile/mapper/NumberReadTest.java @@ -1,12 +1,11 @@ package com.fasterxml.jackson.dataformat.smile.mapper; import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; import com.fasterxml.jackson.dataformat.smile.BaseTestForSmile; import com.fasterxml.jackson.dataformat.smile.databind.SmileMapper; import org.junit.jupiter.api.Test; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.math.BigDecimal; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -19,7 +18,8 @@ static class DeserializationIssue4917 { } static class DecimalHolder4917 { - public BigDecimal value; + @JsonValue + BigDecimal value; private DecimalHolder4917(BigDecimal value) { this.value = value;