From a077324670693187ea98c33591e90831e5da12c9 Mon Sep 17 00:00:00 2001 From: Sam Brannen <104798+sbrannen@users.noreply.github.com> Date: Tue, 23 Jun 2026 12:18:54 +0200 Subject: [PATCH] Polish contribution See gh-36956 --- .../support/NumberToDataSizeConverter.java | 1 + .../converter/DefaultConversionServiceTests.java | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/convert/support/NumberToDataSizeConverter.java b/spring-core/src/main/java/org/springframework/core/convert/support/NumberToDataSizeConverter.java index 0231b64f1a0..4c82183c768 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/support/NumberToDataSizeConverter.java +++ b/spring-core/src/main/java/org/springframework/core/convert/support/NumberToDataSizeConverter.java @@ -33,6 +33,7 @@ final class NumberToDataSizeConverter implements Converter { @Override public DataSize convert(Number source) { long bytes = source.longValue(); + // Ensure Number is a whole number. if (source.doubleValue() - bytes != 0) { throw new IllegalArgumentException("'" + source + "' is not a valid data size"); } diff --git a/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java b/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java index b6378d187d7..1873f9e8b4e 100644 --- a/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java +++ b/spring-core/src/test/java/org/springframework/core/convert/converter/DefaultConversionServiceTests.java @@ -44,6 +44,7 @@ import java.util.Properties; import java.util.Set; import java.util.TimeZone; import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Pattern; import java.util.stream.Stream; @@ -257,19 +258,28 @@ class DefaultConversionServiceTests { } @Test // gh-36830 - void numberToDataSizeWithDecimalNumber() { + void numberToDataSizeConversionRejectsNumberWithFractionalPart() { assertThatExceptionOfType(ConversionFailedException.class) - .isThrownBy(() -> conversionService.convert(10.5, DataSize.class)); + .isThrownBy(() -> conversionService.convert(-10.5, DataSize.class)) + .havingRootCause() + .isInstanceOf(IllegalArgumentException.class) + .withMessage("'-10.5' is not a valid data size"); assertThatExceptionOfType(ConversionFailedException.class) - .isThrownBy(() -> conversionService.convert(new BigDecimal("10.5"), DataSize.class)); + .isThrownBy(() -> conversionService.convert(new BigDecimal("10.5"), DataSize.class)) + .havingRootCause() + .isInstanceOf(IllegalArgumentException.class) + .withMessage("'10.5' is not a valid data size"); } @Test // gh-36830 void numberToDataSize() { assertThat(conversionService.convert(10, DataSize.class)).isEqualTo(DataSize.ofBytes(10)); + assertThat(conversionService.convert(10.0, DataSize.class)).isEqualTo(DataSize.ofBytes(10)); assertThat(conversionService.convert(-10L, DataSize.class)).isEqualTo(DataSize.ofBytes(-10)); + assertThat(conversionService.convert(-10.0, DataSize.class)).isEqualTo(DataSize.ofBytes(-10)); assertThat(conversionService.convert(new BigDecimal("10"), DataSize.class)).isEqualTo(DataSize.ofBytes(10)); assertThat(conversionService.convert(new BigDecimal("10.0"), DataSize.class)).isEqualTo(DataSize.ofBytes(10)); + assertThat(conversionService.convert(new AtomicInteger(1000), DataSize.class)).isEqualTo(DataSize.ofBytes(1000)); } @Test