From e0be5fffbc886fa52bda6e4ca44f9ac3bdf01069 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 12 Sep 2021 19:31:32 +0200 Subject: [PATCH 1/1] Fix Decima64.valueOf(String) When we have a maximum-length string we end up reporting running out of fraction limit. Fix this by correctly accounting for the period. JIRA: YANGTOOLS-1321 Change-Id: I40b70400004d39a923b536db8b47784d3659bd4a Signed-off-by: Robert Varga (cherry picked from commit 5d46adb7935241534c69b00a13593f3e8d4ec7d6) --- .../opendaylight/yangtools/yang/common/Decimal64.java | 2 +- .../yangtools/yang/common/Decimal64Test.java | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/Decimal64.java b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/Decimal64.java index 78354f3915..c649f015c8 100644 --- a/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/Decimal64.java +++ b/yang/yang-common/src/main/java/org/opendaylight/yangtools/yang/common/Decimal64.java @@ -112,7 +112,7 @@ public class Decimal64 extends Number implements CanonicalValue { limit--; } - final int fracLimit = MAX_FRACTION_DIGITS - intLen; + final int fracLimit = MAX_FRACTION_DIGITS - intLen + 1; byte fracLen = 0; long fracPart = 0; for (; idx <= limit; idx++, fracLen++) { diff --git a/yang/yang-common/src/test/java/org/opendaylight/yangtools/yang/common/Decimal64Test.java b/yang/yang-common/src/test/java/org/opendaylight/yangtools/yang/common/Decimal64Test.java index a496312577..e2b01871d7 100644 --- a/yang/yang-common/src/test/java/org/opendaylight/yangtools/yang/common/Decimal64Test.java +++ b/yang/yang-common/src/test/java/org/opendaylight/yangtools/yang/common/Decimal64Test.java @@ -96,6 +96,15 @@ public class Decimal64Test { Decimal64.valueOf("0.12345678901234568"); } + @Test + public void testFractionLimits() { + Decimal64.valueOf("922337203685477580.7"); + Decimal64.valueOf("9.223372036854775807"); + + assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("922337203685477580.71")); + assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("9.2233720368547758071")); + } + @Test public void testParseTooLongString() { assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("1234567890123456789")); @@ -103,7 +112,7 @@ public class Decimal64Test { @Test public void testParseTooLongDecimal() { - assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("0.123456789012345689")); + assertThrows(NumberFormatException.class, () -> Decimal64.valueOf("0.1234567890123456789")); } @Test -- 2.36.6