diff options
author | Gary Gregory <garydgregory@gmail.com> | 2024-04-24 16:51:21 -0400 |
---|---|---|
committer | Gary Gregory <garydgregory@gmail.com> | 2024-04-24 16:51:21 -0400 |
commit | bdff802a85306ac8246a80876c0a44baec57ff10 (patch) | |
tree | c8dc6c67e97487c9fa6db335ea4e8f3c368db937 | |
parent | fff3db29be4a0d4065ea42d697630d935b0e96eb (diff) | |
download | apache-commons-lang-bdff802a85306ac8246a80876c0a44baec57ff10.tar.gz |
[LANG-1729] NumberUtils.isParsable() returns true for Fullwidth Unicode
digits
Refactor tests
-rw-r--r-- | src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java | 122 |
1 files changed, 80 insertions, 42 deletions
diff --git a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java index 912109690..29404044d 100644 --- a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java @@ -30,6 +30,7 @@ import java.math.BigInteger; import java.math.RoundingMode; import java.text.NumberFormat; import java.text.ParseException; +import java.util.function.Function; import org.apache.commons.lang3.AbstractLangTest; import org.junit.jupiter.api.Test; @@ -97,68 +98,87 @@ public class NumberUtilsTest extends AbstractLangTest { assertTrue(NumberUtils.compare((short) 213, (short) 32) > 0); } - private boolean isParsableByte(final String s) { - final NumberFormat instance = NumberFormat.getInstance(); - instance.setParseIntegerOnly(false); - try { - instance.parse(s); - } catch (final ParseException e) { - return false; - } + private boolean isApplyNonNull(final String s, final Function<String, ?> function) { try { - Byte.parseByte(s); - } catch (final NumberFormatException e) { + assertNotNull(function.apply(s)); + return true; + } catch (final Exception e) { + if (!s.matches(".*\\s.*")) { + e.printStackTrace(); + } return false; } - return NumberUtils.isParsable(s); } - private boolean isParsableInteger(final String s) { + private boolean isNumberFormatParsable(final String s) { final NumberFormat instance = NumberFormat.getInstance(); - instance.setParseIntegerOnly(false); try { - instance.parse(s); + // Stops parsing when a space is found, then returns an object. + assertNotNull(instance.parse(s)); + return true; } catch (final ParseException e) { return false; } - try { - Integer.parseInt(s); - } catch (final NumberFormatException e) { - return false; - } - return NumberUtils.isParsable(s); } - private boolean isParsableLong(final String s) { + private boolean isNumberIntegerOnlyFormatParsable(final String s) { final NumberFormat instance = NumberFormat.getInstance(); - instance.setParseIntegerOnly(false); + instance.setParseIntegerOnly(true); try { - instance.parse(s); + // Stops parsing when a space is found, then returns an object. + assertNotNull(instance.parse(s)); + return true; } catch (final ParseException e) { return false; } - try { - Long.parseLong(s); - } catch (final NumberFormatException e) { - return false; - } - return NumberUtils.isParsable(s); + } + + private boolean isParsableByte(final String s) { + final boolean parsable = NumberUtils.isParsable(s); + assertTrue(isNumberFormatParsable(s), s); + assertTrue(isNumberIntegerOnlyFormatParsable(s), s); + assertEquals(parsable, isApplyNonNull(s, Byte::parseByte), s); + return parsable; + } + + private boolean isParsableFloat(final String s) { + final boolean parsable = NumberUtils.isParsable(s); + assertTrue(isNumberFormatParsable(s), s); + assertTrue(isNumberIntegerOnlyFormatParsable(s), s); + assertEquals(parsable, isApplyNonNull(s, Float::parseFloat), s); + return parsable; + } + + private boolean isParsableDouble(final String s) { + final boolean parsable = NumberUtils.isParsable(s); + assertTrue(isNumberFormatParsable(s), s); + assertTrue(isNumberIntegerOnlyFormatParsable(s), s); + assertEquals(parsable, isApplyNonNull(s, Double::parseDouble), s); + return parsable; + } + + private boolean isParsableInteger(final String s) { + final boolean parsable = NumberUtils.isParsable(s); + assertTrue(isNumberFormatParsable(s), s); + assertTrue(isNumberIntegerOnlyFormatParsable(s), s); + assertEquals(parsable, isApplyNonNull(s, Integer::parseInt), s); + return parsable; + } + + private boolean isParsableLong(final String s) { + final boolean parsable = NumberUtils.isParsable(s); + assertTrue(isNumberFormatParsable(s), s); + assertTrue(isNumberIntegerOnlyFormatParsable(s), s); + assertEquals(parsable, isApplyNonNull(s, Long::parseLong), s); + return parsable; } private boolean isParsableShort(final String s) { - final NumberFormat instance = NumberFormat.getInstance(); - instance.setParseIntegerOnly(false); - try { - instance.parse(s); - } catch (final ParseException e) { - return false; - } - try { - Short.parseShort(s); - } catch (final NumberFormatException e) { - return false; - } - return NumberUtils.isParsable(s); + final boolean parsable = NumberUtils.isParsable(s); + assertTrue(isNumberFormatParsable(s), s); + assertTrue(isNumberIntegerOnlyFormatParsable(s), s); + assertEquals(parsable, isApplyNonNull(s, Short::parseShort), s); + return parsable; } /** @@ -1032,6 +1052,24 @@ public class NumberUtilsTest extends AbstractLangTest { } @Test + public void testLang1729IsParsableDouble() { + assertTrue(isParsableDouble("1")); + assertFalse(isParsableDouble("1 2 3")); + // TODO Expected to be fixed in Java 23 + // assertTrue(isParsableDouble("123")); + assertFalse(isParsableDouble("1 2 3")); + } + + @Test + public void testLang1729IsParsableFloat() { + assertTrue(isParsableFloat("1")); + assertFalse(isParsableFloat("1 2 3")); + // TODO Expected to be fixed in Java 23 + // assertTrue(isParsableFloat("123")); + assertFalse(isParsableFloat("1 2 3")); + } + + @Test public void testLang1729IsParsableInteger() { assertTrue(isParsableInteger("1")); assertFalse(isParsableInteger("1 2 3")); |