diff --git a/src/changes/changes.xml b/src/changes/changes.xml index fdb5c6980..a38e9d84d 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -51,6 +51,7 @@ The type attribute can be add,update,fix,remove. Restore handling of collections for non-JSON ToStringStyle #610. ContextedException Javadoc add missing semicolon #581. Resolve JUnit pioneer transitive dependencies using JUnit BOM. + NumberUtilsTest - incorrect types in min/max tests #634. Add BooleanUtils.booleanValues(). Add BooleanUtils.primitiveValues(). 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 cb78580ae..dea507c68 100644 --- a/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/math/NumberUtilsTest.java @@ -36,150 +36,57 @@ */ public class NumberUtilsTest { - //----------------------------------------------------------------------- - @Test - public void testConstructor() { - assertNotNull(new NumberUtils()); - final Constructor[] cons = NumberUtils.class.getDeclaredConstructors(); - assertEquals(1, cons.length); - assertTrue(Modifier.isPublic(cons[0].getModifiers())); - assertTrue(Modifier.isPublic(NumberUtils.class.getModifiers())); - assertFalse(Modifier.isFinal(NumberUtils.class.getModifiers())); + private boolean checkCreateNumber(final String val) { + try { + final Object obj = NumberUtils.createNumber(val); + return obj != null; + } catch (final NumberFormatException e) { + return false; + } } - //--------------------------------------------------------------------- + // --------------------------------------------------------------------- - /** - * Test for {@link NumberUtils#toInt(String)}. - */ @Test - public void testToIntString() { - assertEquals(12345, NumberUtils.toInt("12345"), "toInt(String) 1 failed"); - assertEquals(0, NumberUtils.toInt("abc"), "toInt(String) 2 failed"); - assertEquals(0, NumberUtils.toInt(""), "toInt(empty) failed"); - assertEquals(0, NumberUtils.toInt(null), "toInt(null) failed"); + public void compareByte() { + assertTrue(NumberUtils.compare((byte) -3, (byte) 0) < 0); + assertEquals(0, NumberUtils.compare((byte) 113, (byte) 113)); + assertTrue(NumberUtils.compare((byte) 123, (byte) 32) > 0); } - /** - * Test for {@link NumberUtils#toInt(String, int)}. - */ @Test - public void testToIntStringI() { - assertEquals(12345, NumberUtils.toInt("12345", 5), "toInt(String, int) 1 failed"); - assertEquals(5, NumberUtils.toInt("1234.5", 5), "toInt(String, int) 2 failed"); + public void compareInt() { + assertTrue(NumberUtils.compare(-3, 0) < 0); + assertEquals(0, NumberUtils.compare(113, 113)); + assertTrue(NumberUtils.compare(213, 32) > 0); } - /** - * Test for {@link NumberUtils#toLong(String)}. - */ - @Test - public void testToLongString() { - assertEquals(12345L, NumberUtils.toLong("12345"), "toLong(String) 1 failed"); - assertEquals(0L, NumberUtils.toLong("abc"), "toLong(String) 2 failed"); - assertEquals(0L, NumberUtils.toLong("1L"), "toLong(String) 3 failed"); - assertEquals(0L, NumberUtils.toLong("1l"), "toLong(String) 4 failed"); - assertEquals(NumberUtils.toLong(Long.MAX_VALUE + ""), Long.MAX_VALUE, "toLong(Long.MAX_VALUE) failed"); - assertEquals(NumberUtils.toLong(Long.MIN_VALUE + ""), Long.MIN_VALUE, "toLong(Long.MIN_VALUE) failed"); - assertEquals(0L, NumberUtils.toLong(""), "toLong(empty) failed"); - assertEquals(0L, NumberUtils.toLong(null), "toLong(null) failed"); + private void compareIsCreatableWithCreateNumber(final String val, final boolean expected) { + final boolean isValid = NumberUtils.isCreatable(val); + final boolean canCreate = checkCreateNumber(val); + assertTrue(isValid == expected && canCreate == expected, "Expecting " + expected + + " for isCreatable/createNumber using \"" + val + "\" but got " + isValid + " and " + canCreate); } - /** - * Test for {@link NumberUtils#toLong(String, long)}. - */ - @Test - public void testToLongStringL() { - assertEquals(12345L, NumberUtils.toLong("12345", 5L), "toLong(String, long) 1 failed"); - assertEquals(5L, NumberUtils.toLong("1234.5", 5L), "toLong(String, long) 2 failed"); + private void compareIsNumberWithCreateNumber(final String val, final boolean expected) { + final boolean isValid = NumberUtils.isCreatable(val); + final boolean canCreate = checkCreateNumber(val); + assertTrue(isValid == expected && canCreate == expected, "Expecting " + expected + + " for isCreatable/createNumber using \"" + val + "\" but got " + isValid + " and " + canCreate); } - /** - * Test for {@link NumberUtils#toFloat(String)}. - */ @Test - public void testToFloatString() { - assertEquals(NumberUtils.toFloat("-1.2345"), -1.2345f, "toFloat(String) 1 failed"); - assertEquals(1.2345f, NumberUtils.toFloat("1.2345"), "toFloat(String) 2 failed"); - assertEquals(0.0f, NumberUtils.toFloat("abc"), "toFloat(String) 3 failed"); - // LANG-1060 - assertEquals(NumberUtils.toFloat("-001.2345"), -1.2345f, "toFloat(String) 4 failed"); - assertEquals(1.2345f, NumberUtils.toFloat("+001.2345"), "toFloat(String) 5 failed"); - assertEquals(1.2345f, NumberUtils.toFloat("001.2345"), "toFloat(String) 6 failed"); - assertEquals(0f, NumberUtils.toFloat("000.00"), "toFloat(String) 7 failed"); - - assertEquals(NumberUtils.toFloat(Float.MAX_VALUE + ""), Float.MAX_VALUE, "toFloat(Float.MAX_VALUE) failed"); - assertEquals(NumberUtils.toFloat(Float.MIN_VALUE + ""), Float.MIN_VALUE, "toFloat(Float.MIN_VALUE) failed"); - assertEquals(0.0f, NumberUtils.toFloat(""), "toFloat(empty) failed"); - assertEquals(0.0f, NumberUtils.toFloat(null), "toFloat(null) failed"); + public void compareLong() { + assertTrue(NumberUtils.compare(-3L, 0L) < 0); + assertEquals(0, NumberUtils.compare(113L, 113L)); + assertTrue(NumberUtils.compare(213L, 32L) > 0); } - /** - * Test for {@link NumberUtils#toFloat(String, float)}. - */ @Test - public void testToFloatStringF() { - assertEquals(1.2345f, NumberUtils.toFloat("1.2345", 5.1f), "toFloat(String, int) 1 failed"); - assertEquals(5.0f, NumberUtils.toFloat("a", 5.0f), "toFloat(String, int) 2 failed"); - // LANG-1060 - assertEquals(5.0f, NumberUtils.toFloat("-001Z.2345", 5.0f), "toFloat(String, int) 3 failed"); - assertEquals(5.0f, NumberUtils.toFloat("+001AB.2345", 5.0f), "toFloat(String, int) 4 failed"); - assertEquals(5.0f, NumberUtils.toFloat("001Z.2345", 5.0f), "toFloat(String, int) 5 failed"); - } - - /** - * Test for {(@link NumberUtils#createNumber(String)} - */ - @Test - public void testStringCreateNumberEnsureNoPrecisionLoss() { - final String shouldBeFloat = "1.23"; - final String shouldBeDouble = "3.40282354e+38"; - final String shouldBeBigDecimal = "1.797693134862315759e+308"; - assertTrue(NumberUtils.createNumber(shouldBeFloat) instanceof Float); - assertTrue(NumberUtils.createNumber(shouldBeDouble) instanceof Double); - assertTrue(NumberUtils.createNumber(shouldBeBigDecimal) instanceof BigDecimal); - // LANG-1060 - assertTrue(NumberUtils.createNumber("001.12") instanceof Float); - assertTrue(NumberUtils.createNumber("-001.12") instanceof Float); - assertTrue(NumberUtils.createNumber("+001.12") instanceof Float); - assertTrue(NumberUtils.createNumber("003.40282354e+38") instanceof Double); - assertTrue(NumberUtils.createNumber("-003.40282354e+38") instanceof Double); - assertTrue(NumberUtils.createNumber("+003.40282354e+38") instanceof Double); - assertTrue(NumberUtils.createNumber("0001.797693134862315759e+308") instanceof BigDecimal); - assertTrue(NumberUtils.createNumber("-001.797693134862315759e+308") instanceof BigDecimal); - assertTrue(NumberUtils.createNumber("+001.797693134862315759e+308") instanceof BigDecimal); - } - /** - * Test for {@link NumberUtils#toDouble(String)}. - */ - @Test - public void testStringToDoubleString() { - assertEquals(NumberUtils.toDouble("-1.2345"), -1.2345d, "toDouble(String) 1 failed"); - assertEquals(1.2345d, NumberUtils.toDouble("1.2345"), "toDouble(String) 2 failed"); - assertEquals(0.0d, NumberUtils.toDouble("abc"), "toDouble(String) 3 failed"); - // LANG-1060 - assertEquals(NumberUtils.toDouble("-001.2345"), -1.2345d, "toDouble(String) 4 failed"); - assertEquals(1.2345d, NumberUtils.toDouble("+001.2345"), "toDouble(String) 5 failed"); - assertEquals(1.2345d, NumberUtils.toDouble("001.2345"), "toDouble(String) 6 failed"); - assertEquals(0d, NumberUtils.toDouble("000.00000"), "toDouble(String) 7 failed"); - - assertEquals(NumberUtils.toDouble(Double.MAX_VALUE + ""), Double.MAX_VALUE, "toDouble(Double.MAX_VALUE) failed"); - assertEquals(NumberUtils.toDouble(Double.MIN_VALUE + ""), Double.MIN_VALUE, "toDouble(Double.MIN_VALUE) failed"); - assertEquals(0.0d, NumberUtils.toDouble(""), "toDouble(empty) failed"); - assertEquals(0.0d, NumberUtils.toDouble((String) null), "toDouble(null) failed"); - } - - /** - * Test for {@link NumberUtils#toDouble(String, double)}. - */ - @Test - public void testStringToDoubleStringD() { - assertEquals(1.2345d, NumberUtils.toDouble("1.2345", 5.1d), "toDouble(String, int) 1 failed"); - assertEquals(5.0d, NumberUtils.toDouble("a", 5.0d), "toDouble(String, int) 2 failed"); - // LANG-1060 - assertEquals(1.2345d, NumberUtils.toDouble("001.2345", 5.1d), "toDouble(String, int) 3 failed"); - assertEquals(NumberUtils.toDouble("-001.2345", 5.1d), -1.2345d, "toDouble(String, int) 4 failed"); - assertEquals(1.2345d, NumberUtils.toDouble("+001.2345", 5.1d), "toDouble(String, int) 5 failed"); - assertEquals(0d, NumberUtils.toDouble("000.00", 5.1d), "toDouble(String, int) 7 failed"); + public void compareShort() { + assertTrue(NumberUtils.compare((short) -3, (short) 0) < 0); + assertEquals(0, NumberUtils.compare((short) 113, (short) 113)); + assertTrue(NumberUtils.compare((short) 213, (short) 32) > 0); } /** @@ -200,855 +107,6 @@ public void testBigIntegerToDoubleBigIntegerD() { assertEquals(8.5d, NumberUtils.toDouble(BigDecimal.valueOf(8.5d), 1.1d), "toDouble(BigInteger) 2 failed"); } - /** - * Test for {@link NumberUtils#toByte(String)}. - */ - @Test - public void testToByteString() { - assertEquals(123, NumberUtils.toByte("123"), "toByte(String) 1 failed"); - assertEquals(0, NumberUtils.toByte("abc"), "toByte(String) 2 failed"); - assertEquals(0, NumberUtils.toByte(""), "toByte(empty) failed"); - assertEquals(0, NumberUtils.toByte(null), "toByte(null) failed"); - } - - /** - * Test for {@link NumberUtils#toByte(String, byte)}. - */ - @Test - public void testToByteStringI() { - assertEquals(123, NumberUtils.toByte("123", (byte) 5), "toByte(String, byte) 1 failed"); - assertEquals(5, NumberUtils.toByte("12.3", (byte) 5), "toByte(String, byte) 2 failed"); - } - - /** - * Test for {@link NumberUtils#toShort(String)}. - */ - @Test - public void testToShortString() { - assertEquals(12345, NumberUtils.toShort("12345"), "toShort(String) 1 failed"); - assertEquals(0, NumberUtils.toShort("abc"), "toShort(String) 2 failed"); - assertEquals(0, NumberUtils.toShort(""), "toShort(empty) failed"); - assertEquals(0, NumberUtils.toShort(null), "toShort(null) failed"); - } - - /** - * Test for {@link NumberUtils#toShort(String, short)}. - */ - @Test - public void testToShortStringI() { - assertEquals(12345, NumberUtils.toShort("12345", (short) 5), "toShort(String, short) 1 failed"); - assertEquals(5, NumberUtils.toShort("1234.5", (short) 5), "toShort(String, short) 2 failed"); - } - - /** - * Test for {@link NumberUtils#toScaledBigDecimal(BigDecimal)}. - */ - @Test - public void testToScaledBigDecimalBigDecimal() { - assertEquals(NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(123.456)), BigDecimal.valueOf(123.46), "toScaledBigDecimal(BigDecimal) 1 failed"); - // Test RoudingMode.HALF_EVEN default rounding. - assertEquals(NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(23.515)), BigDecimal.valueOf(23.52), "toScaledBigDecimal(BigDecimal) 2 failed"); - assertEquals(NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(23.525)), BigDecimal.valueOf(23.52), "toScaledBigDecimal(BigDecimal) 3 failed"); - assertEquals("2352.00", NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(23.525)) - .multiply(BigDecimal.valueOf(100)).toString(), "toScaledBigDecimal(BigDecimal) 4 failed"); - assertEquals(NumberUtils.toScaledBigDecimal((BigDecimal) null), BigDecimal.ZERO, "toScaledBigDecimal(BigDecimal) 5 failed"); - } - - /** - * Test for {@link NumberUtils#toScaledBigDecimal(BigDecimal, int, RoundingMode)}. - */ - @Test - public void testToScaledBigDecimalBigDecimalIRM() { - assertEquals(NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(123.456), 1, RoundingMode.CEILING), BigDecimal.valueOf(123.5), "toScaledBigDecimal(BigDecimal, int, RoudingMode) 1 failed"); - assertEquals(NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(23.5159), 3, RoundingMode.FLOOR), BigDecimal.valueOf(23.515), "toScaledBigDecimal(BigDecimal, int, RoudingMode) 2 failed"); - assertEquals(NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(23.525), 2, RoundingMode.HALF_UP), BigDecimal.valueOf(23.53), "toScaledBigDecimal(BigDecimal, int, RoudingMode) 3 failed"); - assertEquals("23521.0000", NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(23.521), 4, RoundingMode.HALF_EVEN) - .multiply(BigDecimal.valueOf(1000)) - .toString(), "toScaledBigDecimal(BigDecimal, int, RoudingMode) 4 failed"); - assertEquals(NumberUtils.toScaledBigDecimal((BigDecimal) null, 2, RoundingMode.HALF_UP), BigDecimal.ZERO, "toScaledBigDecimal(BigDecimal, int, RoudingMode) 5 failed"); - } - - /** - * Test for {@link NumberUtils#toScaledBigDecimal(Float)}. - */ - @Test - public void testToScaledBigDecimalFloat() { - assertEquals(NumberUtils.toScaledBigDecimal(Float.valueOf(123.456f)), BigDecimal.valueOf(123.46), "toScaledBigDecimal(Float) 1 failed"); - // Test RoudingMode.HALF_EVEN default rounding. - assertEquals(NumberUtils.toScaledBigDecimal(Float.valueOf(23.515f)), BigDecimal.valueOf(23.51), "toScaledBigDecimal(Float) 2 failed"); - // Note. NumberUtils.toScaledBigDecimal(Float.valueOf(23.515f)).equals(BigDecimal.valueOf(23.51)) - // because of roundoff error. It is ok. - assertEquals(NumberUtils.toScaledBigDecimal(Float.valueOf(23.525f)), BigDecimal.valueOf(23.52), "toScaledBigDecimal(Float) 3 failed"); - assertEquals("2352.00", NumberUtils.toScaledBigDecimal(Float.valueOf(23.525f)) - .multiply(BigDecimal.valueOf(100)).toString(), "toScaledBigDecimal(Float) 4 failed"); - assertEquals(NumberUtils.toScaledBigDecimal((Float) null), BigDecimal.ZERO, "toScaledBigDecimal(Float) 5 failed"); - } - - /** - * Test for {@link NumberUtils#toScaledBigDecimal(Float, int, RoundingMode)}. - */ - @Test - public void testToScaledBigDecimalFloatIRM() { - assertEquals(NumberUtils.toScaledBigDecimal(Float.valueOf(123.456f), 1, RoundingMode.CEILING), BigDecimal.valueOf(123.5), "toScaledBigDecimal(Float, int, RoudingMode) 1 failed"); - assertEquals(NumberUtils.toScaledBigDecimal(Float.valueOf(23.5159f), 3, RoundingMode.FLOOR), BigDecimal.valueOf(23.515), "toScaledBigDecimal(Float, int, RoudingMode) 2 failed"); - // The following happens due to roundoff error. We're ok with this. - assertEquals(NumberUtils.toScaledBigDecimal(Float.valueOf(23.525f), 2, RoundingMode.HALF_UP), BigDecimal.valueOf(23.52), "toScaledBigDecimal(Float, int, RoudingMode) 3 failed"); - assertEquals("23521.0000", NumberUtils.toScaledBigDecimal(Float.valueOf(23.521f), 4, RoundingMode.HALF_EVEN) - .multiply(BigDecimal.valueOf(1000)) - .toString(), "toScaledBigDecimal(Float, int, RoudingMode) 4 failed"); - assertEquals(NumberUtils.toScaledBigDecimal((Float) null, 2, RoundingMode.HALF_UP), BigDecimal.ZERO, "toScaledBigDecimal(Float, int, RoudingMode) 5 failed"); - } - - /** - * Test for {@link NumberUtils#toScaledBigDecimal(Double)}. - */ - @Test - public void testToScaledBigDecimalDouble() { - assertEquals(NumberUtils.toScaledBigDecimal(Double.valueOf(123.456d)), BigDecimal.valueOf(123.46), "toScaledBigDecimal(Double) 1 failed"); - // Test RoudingMode.HALF_EVEN default rounding. - assertEquals(NumberUtils.toScaledBigDecimal(Double.valueOf(23.515d)), BigDecimal.valueOf(23.52), "toScaledBigDecimal(Double) 2 failed"); - assertEquals(NumberUtils.toScaledBigDecimal(Double.valueOf(23.525d)), BigDecimal.valueOf(23.52), "toScaledBigDecimal(Double) 3 failed"); - assertEquals("2352.00", NumberUtils.toScaledBigDecimal(Double.valueOf(23.525d)) - .multiply(BigDecimal.valueOf(100)).toString(), "toScaledBigDecimal(Double) 4 failed"); - assertEquals(NumberUtils.toScaledBigDecimal((Double) null), BigDecimal.ZERO, "toScaledBigDecimal(Double) 5 failed"); - } - - /** - * Test for {@link NumberUtils#toScaledBigDecimal(Double, int, RoundingMode)}. - */ - @Test - public void testToScaledBigDecimalDoubleIRM() { - assertEquals(NumberUtils.toScaledBigDecimal(Double.valueOf(123.456d), 1, RoundingMode.CEILING), BigDecimal.valueOf(123.5), "toScaledBigDecimal(Double, int, RoudingMode) 1 failed"); - assertEquals(NumberUtils.toScaledBigDecimal(Double.valueOf(23.5159d), 3, RoundingMode.FLOOR), BigDecimal.valueOf(23.515), "toScaledBigDecimal(Double, int, RoudingMode) 2 failed"); - assertEquals(NumberUtils.toScaledBigDecimal(Double.valueOf(23.525d), 2, RoundingMode.HALF_UP), BigDecimal.valueOf(23.53), "toScaledBigDecimal(Double, int, RoudingMode) 3 failed"); - assertEquals("23521.0000", NumberUtils.toScaledBigDecimal(Double.valueOf(23.521d), 4, RoundingMode.HALF_EVEN) - .multiply(BigDecimal.valueOf(1000)) - .toString(), "toScaledBigDecimal(Double, int, RoudingMode) 4 failed"); - assertEquals(NumberUtils.toScaledBigDecimal((Double) null, 2, RoundingMode.HALF_UP), BigDecimal.ZERO, "toScaledBigDecimal(Double, int, RoudingMode) 5 failed"); - } - - /** - * Test for {@link NumberUtils#toScaledBigDecimal(Double)}. - */ - @Test - public void testToScaledBigDecimalString() { - assertEquals(NumberUtils.toScaledBigDecimal("123.456"), BigDecimal.valueOf(123.46), "toScaledBigDecimal(String) 1 failed"); - // Test RoudingMode.HALF_EVEN default rounding. - assertEquals(NumberUtils.toScaledBigDecimal("23.515"), BigDecimal.valueOf(23.52), "toScaledBigDecimal(String) 2 failed"); - assertEquals(NumberUtils.toScaledBigDecimal("23.525"), BigDecimal.valueOf(23.52), "toScaledBigDecimal(String) 3 failed"); - assertEquals("2352.00", NumberUtils.toScaledBigDecimal("23.525") - .multiply(BigDecimal.valueOf(100)).toString(), "toScaledBigDecimal(String) 4 failed"); - assertEquals(NumberUtils.toScaledBigDecimal((String) null), BigDecimal.ZERO, "toScaledBigDecimal(String) 5 failed"); - } - - /** - * Test for {@link NumberUtils#toScaledBigDecimal(Double, int, RoundingMode)}. - */ - @Test - public void testToScaledBigDecimalStringIRM() { - assertEquals(NumberUtils.toScaledBigDecimal("123.456", 1, RoundingMode.CEILING), BigDecimal.valueOf(123.5), "toScaledBigDecimal(String, int, RoudingMode) 1 failed"); - assertEquals(NumberUtils.toScaledBigDecimal("23.5159", 3, RoundingMode.FLOOR), BigDecimal.valueOf(23.515), "toScaledBigDecimal(String, int, RoudingMode) 2 failed"); - assertEquals(NumberUtils.toScaledBigDecimal("23.525", 2, RoundingMode.HALF_UP), BigDecimal.valueOf(23.53), "toScaledBigDecimal(String, int, RoudingMode) 3 failed"); - assertEquals("23521.0000", NumberUtils.toScaledBigDecimal("23.521", 4, RoundingMode.HALF_EVEN) - .multiply(BigDecimal.valueOf(1000)) - .toString(), "toScaledBigDecimal(String, int, RoudingMode) 4 failed"); - assertEquals(NumberUtils.toScaledBigDecimal((String) null, 2, RoundingMode.HALF_UP), BigDecimal.ZERO, "toScaledBigDecimal(String, int, RoudingMode) 5 failed"); - } - - @Test - public void testCreateNumber() { - // a lot of things can go wrong - assertEquals(Float.valueOf("1234.5"), NumberUtils.createNumber("1234.5"), "createNumber(String) 1 failed"); - assertEquals(Integer.valueOf("12345"), NumberUtils.createNumber("12345"), "createNumber(String) 2 failed"); - assertEquals(Double.valueOf("1234.5"), NumberUtils.createNumber("1234.5D"), "createNumber(String) 3 failed"); - assertEquals(Double.valueOf("1234.5"), NumberUtils.createNumber("1234.5d"), "createNumber(String) 3 failed"); - assertEquals(Float.valueOf("1234.5"), NumberUtils.createNumber("1234.5F"), "createNumber(String) 4 failed"); - assertEquals(Float.valueOf("1234.5"), NumberUtils.createNumber("1234.5f"), "createNumber(String) 4 failed"); - assertEquals(Long.valueOf(Integer.MAX_VALUE + 1L), NumberUtils.createNumber("" - + (Integer.MAX_VALUE + 1L)), "createNumber(String) 5 failed"); - assertEquals(Long.valueOf(12345), NumberUtils.createNumber("12345L"), "createNumber(String) 6 failed"); - assertEquals(Long.valueOf(12345), NumberUtils.createNumber("12345l"), "createNumber(String) 6 failed"); - assertEquals(Float.valueOf("-1234.5"), NumberUtils.createNumber("-1234.5"), "createNumber(String) 7 failed"); - assertEquals(Integer.valueOf("-12345"), NumberUtils.createNumber("-12345"), "createNumber(String) 8 failed"); - assertEquals(0xFADE, NumberUtils.createNumber("0xFADE").intValue(), "createNumber(String) 9a failed"); - assertEquals(0xFADE, NumberUtils.createNumber("0Xfade").intValue(), "createNumber(String) 9b failed"); - assertEquals(-0xFADE, NumberUtils.createNumber("-0xFADE").intValue(), "createNumber(String) 10a failed"); - assertEquals(-0xFADE, NumberUtils.createNumber("-0Xfade").intValue(), "createNumber(String) 10b failed"); - assertEquals(Double.valueOf("1.1E200"), NumberUtils.createNumber("1.1E200"), "createNumber(String) 11 failed"); - assertEquals(Float.valueOf("1.1E20"), NumberUtils.createNumber("1.1E20"), "createNumber(String) 12 failed"); - assertEquals(Double.valueOf("-1.1E200"), NumberUtils.createNumber("-1.1E200"), "createNumber(String) 13 failed"); - assertEquals(Double.valueOf("1.1E-200"), NumberUtils.createNumber("1.1E-200"), "createNumber(String) 14 failed"); - assertNull(NumberUtils.createNumber(null), "createNumber(null) failed"); - assertEquals(new BigInteger("12345678901234567890"), NumberUtils.createNumber("12345678901234567890L"), "createNumber(String) failed"); - - assertEquals(new BigDecimal("1.1E-700"), NumberUtils.createNumber("1.1E-700F"), "createNumber(String) 15 failed"); - - assertEquals(Long.valueOf("10" + Integer.MAX_VALUE), NumberUtils.createNumber("10" + Integer.MAX_VALUE + "L"), "createNumber(String) 16 failed"); - assertEquals(Long.valueOf("10" + Integer.MAX_VALUE), NumberUtils.createNumber("10" + Integer.MAX_VALUE), "createNumber(String) 17 failed"); - assertEquals(new BigInteger("10" + Long.MAX_VALUE), NumberUtils.createNumber("10" + Long.MAX_VALUE), "createNumber(String) 18 failed"); - - // LANG-521 - assertEquals(Float.valueOf("2."), NumberUtils.createNumber("2."), "createNumber(String) LANG-521 failed"); - - // LANG-638 - assertFalse(checkCreateNumber("1eE"), "createNumber(String) succeeded"); - - // LANG-693 - assertEquals(Double.valueOf(Double.MAX_VALUE), NumberUtils.createNumber("" + Double.MAX_VALUE), "createNumber(String) LANG-693 failed"); - - // LANG-822 - // ensure that the underlying negative number would create a BigDecimal - final Number bigNum = NumberUtils.createNumber("-1.1E-700F"); - assertNotNull(bigNum); - assertEquals(BigDecimal.class, bigNum.getClass()); - - // LANG-1018 - assertEquals(Double.valueOf("-160952.54"), NumberUtils.createNumber("-160952.54"), - "createNumber(String) LANG-1018 failed"); - // LANG-1187 - assertEquals(Double.valueOf("6264583.33"), NumberUtils.createNumber("6264583.33"), - "createNumber(String) LANG-1187 failed"); - // LANG-1215 - assertEquals(Double.valueOf("193343.82"), NumberUtils.createNumber("193343.82"), - "createNumber(String) LANG-1215 failed"); - // LANG-1060 - assertEquals(Double.valueOf("001234.5678"), NumberUtils.createNumber("001234.5678"), "createNumber(String) LANG-1060a failed"); - assertEquals(Double.valueOf("+001234.5678"), NumberUtils.createNumber("+001234.5678"), "createNumber(String) LANG-1060b failed"); - assertEquals(Double.valueOf("-001234.5678"), NumberUtils.createNumber("-001234.5678"), "createNumber(String) LANG-1060c failed"); - assertEquals(Double.valueOf("0000.00000"), NumberUtils.createNumber("0000.00000d"), "createNumber(String) LANG-1060d failed"); - assertEquals(Float.valueOf("001234.56"), NumberUtils.createNumber("001234.56"), "createNumber(String) LANG-1060e failed"); - assertEquals(Float.valueOf("+001234.56"), NumberUtils.createNumber("+001234.56"), "createNumber(String) LANG-1060f failed"); - assertEquals(Float.valueOf("-001234.56"), NumberUtils.createNumber("-001234.56"), "createNumber(String) LANG-1060g failed"); - assertEquals(Float.valueOf("0000.10"), NumberUtils.createNumber("0000.10"), "createNumber(String) LANG-1060h failed"); - assertEquals(Float.valueOf("001.1E20"), NumberUtils.createNumber("001.1E20"), "createNumber(String) LANG-1060i failed"); - assertEquals(Float.valueOf("+001.1E20"), NumberUtils.createNumber("+001.1E20"), "createNumber(String) LANG-1060j failed"); - assertEquals(Float.valueOf("-001.1E20"), NumberUtils.createNumber("-001.1E20"), "createNumber(String) LANG-1060k failed"); - assertEquals(Double.valueOf("001.1E200"), NumberUtils.createNumber("001.1E200"), "createNumber(String) LANG-1060l failed"); - assertEquals(Double.valueOf("+001.1E200"), NumberUtils.createNumber("+001.1E200"), "createNumber(String) LANG-1060m failed"); - assertEquals(Double.valueOf("-001.1E200"), NumberUtils.createNumber("-001.1E200"), "createNumber(String) LANG-1060n failed"); - } - - @Test - public void testLang1087() { - // no sign cases - assertEquals(Float.class, NumberUtils.createNumber("0.0").getClass()); - assertEquals(Float.valueOf("0.0"), NumberUtils.createNumber("0.0")); - // explicit positive sign cases - assertEquals(Float.class, NumberUtils.createNumber("+0.0").getClass()); - assertEquals(Float.valueOf("+0.0"), NumberUtils.createNumber("+0.0")); - // negative sign cases - assertEquals(Float.class, NumberUtils.createNumber("-0.0").getClass()); - assertEquals(Float.valueOf("-0.0"), NumberUtils.createNumber("-0.0")); - } - - @Test - public void TestLang747() { - assertEquals(Integer.valueOf(0x8000), NumberUtils.createNumber("0x8000")); - assertEquals(Integer.valueOf(0x80000), NumberUtils.createNumber("0x80000")); - assertEquals(Integer.valueOf(0x800000), NumberUtils.createNumber("0x800000")); - assertEquals(Integer.valueOf(0x8000000), NumberUtils.createNumber("0x8000000")); - assertEquals(Integer.valueOf(0x7FFFFFFF), NumberUtils.createNumber("0x7FFFFFFF")); - assertEquals(Long.valueOf(0x80000000L), NumberUtils.createNumber("0x80000000")); - assertEquals(Long.valueOf(0xFFFFFFFFL), NumberUtils.createNumber("0xFFFFFFFF")); - - // Leading zero tests - assertEquals(Integer.valueOf(0x8000000), NumberUtils.createNumber("0x08000000")); - assertEquals(Integer.valueOf(0x7FFFFFFF), NumberUtils.createNumber("0x007FFFFFFF")); - assertEquals(Long.valueOf(0x80000000L), NumberUtils.createNumber("0x080000000")); - assertEquals(Long.valueOf(0xFFFFFFFFL), NumberUtils.createNumber("0x00FFFFFFFF")); - - assertEquals(Long.valueOf(0x800000000L), NumberUtils.createNumber("0x800000000")); - assertEquals(Long.valueOf(0x8000000000L), NumberUtils.createNumber("0x8000000000")); - assertEquals(Long.valueOf(0x80000000000L), NumberUtils.createNumber("0x80000000000")); - assertEquals(Long.valueOf(0x800000000000L), NumberUtils.createNumber("0x800000000000")); - assertEquals(Long.valueOf(0x8000000000000L), NumberUtils.createNumber("0x8000000000000")); - assertEquals(Long.valueOf(0x80000000000000L), NumberUtils.createNumber("0x80000000000000")); - assertEquals(Long.valueOf(0x800000000000000L), NumberUtils.createNumber("0x800000000000000")); - assertEquals(Long.valueOf(0x7FFFFFFFFFFFFFFFL), NumberUtils.createNumber("0x7FFFFFFFFFFFFFFF")); - // N.B. Cannot use a hex constant such as 0x8000000000000000L here as that is interpreted as a negative long - assertEquals(new BigInteger("8000000000000000", 16), NumberUtils.createNumber("0x8000000000000000")); - assertEquals(new BigInteger("FFFFFFFFFFFFFFFF", 16), NumberUtils.createNumber("0xFFFFFFFFFFFFFFFF")); - - // Leading zero tests - assertEquals(Long.valueOf(0x80000000000000L), NumberUtils.createNumber("0x00080000000000000")); - assertEquals(Long.valueOf(0x800000000000000L), NumberUtils.createNumber("0x0800000000000000")); - assertEquals(Long.valueOf(0x7FFFFFFFFFFFFFFFL), NumberUtils.createNumber("0x07FFFFFFFFFFFFFFF")); - // N.B. Cannot use a hex constant such as 0x8000000000000000L here as that is interpreted as a negative long - assertEquals(new BigInteger("8000000000000000", 16), NumberUtils.createNumber("0x00008000000000000000")); - assertEquals(new BigInteger("FFFFFFFFFFFFFFFF", 16), NumberUtils.createNumber("0x0FFFFFFFFFFFFFFFF")); - } - - @Test - // Check that the code fails to create a valid number when preceded by -- rather than - - public void testCreateNumberFailure_1() { - assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("--1.1E-700F")); - } - - @Test - // Check that the code fails to create a valid number when both e and E are present (with decimal) - public void testCreateNumberFailure_2() { - assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("-1.1E+0-7e00")); - } - - @Test - // Check that the code fails to create a valid number when both e and E are present (no decimal) - public void testCreateNumberFailure_3() { - assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("-11E+0-7e00")); - } - - @Test - // Check that the code fails to create a valid number when both e and E are present (no decimal) - public void testCreateNumberFailure_4() { - assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("1eE+00001")); - } - - @Test - // Check that the code fails to create a valid number when there are multiple trailing 'f' characters (LANG-1205) - public void testCreateNumberFailure_5() { - assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("1234.5ff")); - } - - @Test - // Check that the code fails to create a valid number when there are multiple trailing 'F' characters (LANG-1205) - public void testCreateNumberFailure_6() { - assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("1234.5FF")); - } - - @Test - // Check that the code fails to create a valid number when there are multiple trailing 'd' characters (LANG-1205) - public void testCreateNumberFailure_7() { - assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("1234.5dd")); - } - - @Test - // Check that the code fails to create a valid number when there are multiple trailing 'D' characters (LANG-1205) - public void testCreateNumberFailure_8() { - assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("1234.5DD")); - } - - // Tests to show when magnitude causes switch to next Number type - // Will probably need to be adjusted if code is changed to check precision (LANG-693) - @Test - public void testCreateNumberMagnitude() { - // Test Float.MAX_VALUE, and same with +1 in final digit to check conversion changes to next Number type - assertEquals(Float.valueOf(Float.MAX_VALUE), NumberUtils.createNumber("3.4028235e+38")); - assertEquals(Double.valueOf(3.4028236e+38), NumberUtils.createNumber("3.4028236e+38")); - - // Test Double.MAX_VALUE - assertEquals(Double.valueOf(Double.MAX_VALUE), NumberUtils.createNumber("1.7976931348623157e+308")); - // Test with +2 in final digit (+1 does not cause roll-over to BigDecimal) - assertEquals(new BigDecimal("1.7976931348623159e+308"), NumberUtils.createNumber("1.7976931348623159e+308")); - - assertEquals(Integer.valueOf(0x12345678), NumberUtils.createNumber("0x12345678")); - assertEquals(Long.valueOf(0x123456789L), NumberUtils.createNumber("0x123456789")); - - assertEquals(Long.valueOf(0x7fffffffffffffffL), NumberUtils.createNumber("0x7fffffffffffffff")); - // Does not appear to be a way to create a literal BigInteger of this magnitude - assertEquals(new BigInteger("7fffffffffffffff0", 16), NumberUtils.createNumber("0x7fffffffffffffff0")); - - assertEquals(Long.valueOf(0x7fffffffffffffffL), NumberUtils.createNumber("#7fffffffffffffff")); - assertEquals(new BigInteger("7fffffffffffffff0", 16), NumberUtils.createNumber("#7fffffffffffffff0")); - - assertEquals(Integer.valueOf(017777777777), NumberUtils.createNumber("017777777777")); // 31 bits - assertEquals(Long.valueOf(037777777777L), NumberUtils.createNumber("037777777777")); // 32 bits - - assertEquals(Long.valueOf(0777777777777777777777L), NumberUtils.createNumber("0777777777777777777777")); // 63 bits - assertEquals(new BigInteger("1777777777777777777777", 8), NumberUtils.createNumber("01777777777777777777777")); // 64 bits - } - - @Test - public void testCreateFloat() { - assertEquals(Float.valueOf("1234.5"), NumberUtils.createFloat("1234.5"), "createFloat(String) failed"); - assertNull(NumberUtils.createFloat(null), "createFloat(null) failed"); - this.testCreateFloatFailure(""); - this.testCreateFloatFailure(" "); - this.testCreateFloatFailure("\b\t\n\f\r"); - // Funky whitespaces - this.testCreateFloatFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F"); - } - - protected void testCreateFloatFailure(final String str) { - assertThrows( - NumberFormatException.class, - () -> NumberUtils.createFloat(str), "createFloat(\"" + str + "\") should have failed."); - } - - @Test - public void testCreateDouble() { - assertEquals(Double.valueOf("1234.5"), NumberUtils.createDouble("1234.5"), "createDouble(String) failed"); - assertNull(NumberUtils.createDouble(null), "createDouble(null) failed"); - this.testCreateDoubleFailure(""); - this.testCreateDoubleFailure(" "); - this.testCreateDoubleFailure("\b\t\n\f\r"); - // Funky whitespaces - this.testCreateDoubleFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F"); - } - - protected void testCreateDoubleFailure(final String str) { - assertThrows( - NumberFormatException.class, - () -> NumberUtils.createDouble(str), - "createDouble(\"" + str + "\") should have failed."); - } - - @Test - public void testCreateInteger() { - assertEquals(Integer.valueOf("12345"), NumberUtils.createInteger("12345"), "createInteger(String) failed"); - assertNull(NumberUtils.createInteger(null), "createInteger(null) failed"); - this.testCreateIntegerFailure(""); - this.testCreateIntegerFailure(" "); - this.testCreateIntegerFailure("\b\t\n\f\r"); - // Funky whitespaces - this.testCreateIntegerFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F"); - } - - protected void testCreateIntegerFailure(final String str) { - assertThrows( - NumberFormatException.class, - () -> NumberUtils.createInteger(str), - "createInteger(\"" + str + "\") should have failed."); - } - - @Test - public void testCreateLong() { - assertEquals(Long.valueOf("12345"), NumberUtils.createLong("12345"), "createLong(String) failed"); - assertNull(NumberUtils.createLong(null), "createLong(null) failed"); - this.testCreateLongFailure(""); - this.testCreateLongFailure(" "); - this.testCreateLongFailure("\b\t\n\f\r"); - // Funky whitespaces - this.testCreateLongFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F"); - } - - protected void testCreateLongFailure(final String str) { - assertThrows( - NumberFormatException.class, - () -> NumberUtils.createLong(str), - "createLong(\"" + str + "\") should have failed."); - } - - @Test - public void testCreateBigInteger() { - assertEquals(new BigInteger("12345"), NumberUtils.createBigInteger("12345"), "createBigInteger(String) failed"); - assertNull(NumberUtils.createBigInteger(null), "createBigInteger(null) failed"); - this.testCreateBigIntegerFailure(""); - this.testCreateBigIntegerFailure(" "); - this.testCreateBigIntegerFailure("\b\t\n\f\r"); - // Funky whitespaces - this.testCreateBigIntegerFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F"); - assertEquals(new BigInteger("255"), NumberUtils.createBigInteger("0xff"), "createBigInteger(String) failed"); - assertEquals(new BigInteger("255"), NumberUtils.createBigInteger("0Xff"), "createBigInteger(String) failed"); - assertEquals(new BigInteger("255"), NumberUtils.createBigInteger("#ff"), "createBigInteger(String) failed"); - assertEquals(new BigInteger("-255"), NumberUtils.createBigInteger("-0xff"), "createBigInteger(String) failed"); - assertEquals(new BigInteger("255"), NumberUtils.createBigInteger("0377"), "createBigInteger(String) failed"); - assertEquals(new BigInteger("-255"), NumberUtils.createBigInteger("-0377"), "createBigInteger(String) failed"); - assertEquals(new BigInteger("-255"), NumberUtils.createBigInteger("-0377"), "createBigInteger(String) failed"); - assertEquals(new BigInteger("-0"), NumberUtils.createBigInteger("-0"), "createBigInteger(String) failed"); - assertEquals(new BigInteger("0"), NumberUtils.createBigInteger("0"), "createBigInteger(String) failed"); - testCreateBigIntegerFailure("#"); - testCreateBigIntegerFailure("-#"); - testCreateBigIntegerFailure("0x"); - testCreateBigIntegerFailure("-0x"); - } - - protected void testCreateBigIntegerFailure(final String str) { - assertThrows( - NumberFormatException.class, - () -> NumberUtils.createBigInteger(str), - "createBigInteger(\"" + str + "\") should have failed."); - } - - @Test - public void testCreateBigDecimal() { - assertEquals(new BigDecimal("1234.5"), NumberUtils.createBigDecimal("1234.5"), "createBigDecimal(String) failed"); - assertNull(NumberUtils.createBigDecimal(null), "createBigDecimal(null) failed"); - this.testCreateBigDecimalFailure(""); - this.testCreateBigDecimalFailure(" "); - this.testCreateBigDecimalFailure("\b\t\n\f\r"); - // Funky whitespaces - this.testCreateBigDecimalFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F"); - this.testCreateBigDecimalFailure("-"); // sign alone not valid - this.testCreateBigDecimalFailure("--"); // comment in NumberUtils suggests some implementations may incorrectly allow this - this.testCreateBigDecimalFailure("--0"); - this.testCreateBigDecimalFailure("+"); // sign alone not valid - this.testCreateBigDecimalFailure("++"); // in case this was also allowed by some JVMs - this.testCreateBigDecimalFailure("++0"); - } - - protected void testCreateBigDecimalFailure(final String str) { - assertThrows( - NumberFormatException.class, - () -> NumberUtils.createBigDecimal(str), - "createBigDecimal(\"" + str + "\") should have failed."); - } - - // min/max tests - // ---------------------------------------------------------------------- - @Test - public void testMinLong_nullArray() { - assertThrows(NullPointerException.class, () -> NumberUtils.min((long[]) null)); - } - - @Test - public void testMinLong_emptyArray() { - assertThrows(IllegalArgumentException.class, NumberUtils::min); - } - - @Test - public void testMinLong() { - assertEquals(5L, NumberUtils.min(5L), "min(long[]) failed for array length 1"); - assertEquals(6L, NumberUtils.min(6L, 9L), "min(long[]) failed for array length 2"); - - assertEquals(-10L, NumberUtils.min(-10L, -5L, 0L, 5L, 10L)); - assertEquals(-10L, NumberUtils.min(-5L, 0L, -10L, 5L, 10L)); - } - - @Test - public void testMinInt_nullArray() { - assertThrows(NullPointerException.class, () -> NumberUtils.min((int[]) null)); - } - - @Test - public void testMinInt_emptyArray() { - assertThrows(IllegalArgumentException.class, NumberUtils::min); - } - - @Test - public void testMinInt() { - assertEquals(5, NumberUtils.min(5), "min(int[]) failed for array length 1"); - assertEquals(6, NumberUtils.min(6, 9), "min(int[]) failed for array length 2"); - - assertEquals(-10, NumberUtils.min(-10, -5, 0, 5, 10)); - assertEquals(-10, NumberUtils.min(-5, 0, -10, 5, 10)); - } - - @Test - public void testMinShort_nullArray() { - assertThrows(NullPointerException.class, () -> NumberUtils.min((short[]) null)); - } - - @Test - public void testMinShort_emptyArray() { - assertThrows(IllegalArgumentException.class, NumberUtils::min); - } - - @Test - public void testMinShort() { - assertEquals((short) 5, NumberUtils.min((short) 5), "min(short[]) failed for array length 1"); - assertEquals((short) 6, NumberUtils.min((short) 6, (short) 9), "min(short[]) failed for array length 2"); - - assertEquals((short) -10, NumberUtils.min((short) -10, (short) -5, (short) 0, (short) 5, (short) 10)); - assertEquals((short) -10, NumberUtils.min((short) -5, (short) 0, (short) -10, (short) 5, (short) 10)); - } - - @Test - public void testMinByte_nullArray() { - assertThrows(NullPointerException.class, () -> NumberUtils.min((byte[]) null)); - } - - @Test - public void testMinByte_emptyArray() { - assertThrows(IllegalArgumentException.class, NumberUtils::min); - } - - @Test - public void testMinByte() { - assertEquals((byte) 5, NumberUtils.min((byte) 5), "min(byte[]) failed for array length 1"); - assertEquals((byte) 6, NumberUtils.min((byte) 6, (byte) 9), "min(byte[]) failed for array length 2"); - - assertEquals((byte) -10, NumberUtils.min((byte) -10, (byte) -5, (byte) 0, (byte) 5, (byte) 10)); - assertEquals((byte) -10, NumberUtils.min((byte) -5, (byte) 0, (byte) -10, (byte) 5, (byte) 10)); - } - - @Test - public void testMinDouble_nullArray() { - assertThrows(NullPointerException.class, () -> NumberUtils.min((double[]) null)); - } - - @Test - public void testMinDouble_emptyArray() { - assertThrows(IllegalArgumentException.class, NumberUtils::min); - } - - @Test - public void testMinDouble() { - assertEquals(5.12, NumberUtils.min(5.12), "min(double[]) failed for array length 1"); - assertEquals(6.23, NumberUtils.min(6.23, 9.34), "min(double[]) failed for array length 2"); - assertEquals(-10.45, NumberUtils.min(-10.45, -5.56, 0, 5.67, 10.78), "min(double[]) failed for array length 5"); - assertEquals(-10, NumberUtils.min(-10, -5, 0, 5, 10), 0.0001); - assertEquals(-10, NumberUtils.min(-5, 0, -10, 5, 10), 0.0001); - } - - @Test - public void testMinFloat_nullArray() { - assertThrows(NullPointerException.class, () -> NumberUtils.min((float[]) null)); - } - - @Test - public void testMinFloat_emptyArray() { - assertThrows(IllegalArgumentException.class, NumberUtils::min); - } - - @Test - public void testMinFloat() { - assertEquals(5.9f, NumberUtils.min(5.9f), "min(float[]) failed for array length 1"); - assertEquals(6.8f, NumberUtils.min(6.8f, 9.7f), "min(float[]) failed for array length 2"); - assertEquals(-10.6f, NumberUtils.min(-10.6f, -5.5f, 0, 5.4f, 10.3f), "min(float[]) failed for array length 5"); - assertEquals(-10, NumberUtils.min(-10, -5, 0, 5, 10), 0.0001f); - assertEquals(-10, NumberUtils.min(-5, 0, -10, 5, 10), 0.0001f); - } - - @Test - public void testMaxLong_nullArray() { - assertThrows(NullPointerException.class, () -> NumberUtils.max((long[]) null)); - } - - @Test - public void testMaxLong_emptyArray() { - assertThrows(IllegalArgumentException.class, NumberUtils::max); - } - - @Test - public void testMaxLong() { - assertEquals(5L, NumberUtils.max(5L), "max(long[]) failed for array length 1"); - assertEquals(9L, NumberUtils.max(6L, 9L), "max(long[]) failed for array length 2"); - assertEquals(10L, NumberUtils.max(-10L, -5L, 0L, 5L, 10L), "max(long[]) failed for array length 5"); - assertEquals(10L, NumberUtils.max(-10L, -5L, 0L, 5L, 10L)); - assertEquals(10L, NumberUtils.max(-5L, 0L, 10L, 5L, -10L)); - } - - @Test - public void testMaxInt_nullArray() { - assertThrows(NullPointerException.class, () -> NumberUtils.max((int[]) null)); - } - - @Test - public void testMaxInt_emptyArray() { - assertThrows(IllegalArgumentException.class, NumberUtils::max); - } - - @Test - public void testMaxInt() { - assertEquals(5, NumberUtils.max(5), "max(int[]) failed for array length 1"); - assertEquals(9, NumberUtils.max(6, 9), "max(int[]) failed for array length 2"); - assertEquals(10, NumberUtils.max(-10, -5, 0, 5, 10), "max(int[]) failed for array length 5"); - assertEquals(10, NumberUtils.max(-10, -5, 0, 5, 10)); - assertEquals(10, NumberUtils.max(-5, 0, 10, 5, -10)); - } - - @Test - public void testMaxShort_nullArray() { - assertThrows(NullPointerException.class, () -> NumberUtils.max((short[]) null)); - } - - @Test - public void testMaxShort_emptyArray() { - assertThrows(IllegalArgumentException.class, NumberUtils::max); - } - - @Test - public void testMaxShort() { - assertEquals((short) 5, NumberUtils.max((short) 5), "max(short[]) failed for array length 1"); - assertEquals((short) 9, NumberUtils.max((short) 6, (short) 9), "max(short[]) failed for array length 2"); - assertEquals((short) 10, NumberUtils.max((short) -10, (short) -5, (short) 0, (short) 5, (short) 10), "max(short[]) failed for array length 5"); - assertEquals((short) 10, NumberUtils.max((short) -10, (short) -5, (short) 0, (short) 5, (short) 10)); - assertEquals((short) 10, NumberUtils.max((short) -5, (short) 0, (short) 10, (short) 5, (short) -10)); - } - - @Test - public void testMaxByte_nullArray() { - assertThrows(NullPointerException.class, () -> NumberUtils.max((byte[]) null)); - } - - @Test - public void testMaxByte_emptyArray() { - assertThrows(IllegalArgumentException.class, NumberUtils::max); - } - - @Test - public void testMaxByte() { - assertEquals((byte) 5, NumberUtils.max((byte) 5), "max(byte[]) failed for array length 1"); - assertEquals((byte) 9, NumberUtils.max((byte) 6, (byte) 9), "max(byte[]) failed for array length 2"); - assertEquals((byte) 10, NumberUtils.max((byte) -10, (byte) -5, (byte) 0, (byte) 5, (byte) 10), "max(byte[]) failed for array length 5"); - assertEquals((byte) 10, NumberUtils.max((byte) -10, (byte) -5, (byte) 0, (byte) 5, (byte) 10)); - assertEquals((byte) 10, NumberUtils.max((byte) -5, (byte) 0, (byte) 10, (byte) 5, (byte) -10)); - } - - @Test - public void testMaxDouble_nullArray() { - assertThrows(NullPointerException.class, () -> NumberUtils.max((double[]) null)); - } - - @Test - public void testMaxDouble_emptyArray() { - assertThrows(IllegalArgumentException.class, NumberUtils::max); - } - - @Test - public void testMaxDouble() { - final double[] d = null; - assertThrows( - NullPointerException.class, () -> NumberUtils.max(d), "No exception was thrown for null input."); - - assertThrows( - IllegalArgumentException.class, - NumberUtils::max, - "No exception was thrown for empty input."); - - assertEquals(5.1f, NumberUtils.max(5.1f), "max(double[]) failed for array length 1"); - assertEquals(9.2f, NumberUtils.max(6.3f, 9.2f), "max(double[]) failed for array length 2"); - assertEquals(10.4f, NumberUtils.max(-10.5f, -5.6f, 0, 5.7f, 10.4f), "max(double[]) failed for float length 5"); - assertEquals(10, NumberUtils.max(-10, -5, 0, 5, 10), 0.0001); - assertEquals(10, NumberUtils.max(-5, 0, 10, 5, -10), 0.0001); - } - - @Test - public void testMaxFloat_nullArray() { - assertThrows(NullPointerException.class, () -> NumberUtils.max((float[]) null)); - } - - @Test - public void testMaxFloat_emptyArray() { - assertThrows(IllegalArgumentException.class, NumberUtils::max); - } - - @Test - public void testMaxFloat() { - assertEquals(5.1f, NumberUtils.max(5.1f), "max(float[]) failed for array length 1"); - assertEquals(9.2f, NumberUtils.max(6.3f, 9.2f), "max(float[]) failed for array length 2"); - assertEquals(10.4f, NumberUtils.max(-10.5f, -5.6f, 0, 5.7f, 10.4f), "max(float[]) failed for float length 5"); - assertEquals(10, NumberUtils.max(-10, -5, 0, 5, 10), 0.0001f); - assertEquals(10, NumberUtils.max(-5, 0, 10, 5, -10), 0.0001f); - } - - @Test - public void testMinimumLong() { - assertEquals(12345L, NumberUtils.min(12345L, 12345L + 1L, 12345L + 2L), "minimum(long, long, long) 1 failed"); - assertEquals(12345L, NumberUtils.min(12345L + 1L, 12345L, 12345 + 2L), "minimum(long, long, long) 2 failed"); - assertEquals(12345L, NumberUtils.min(12345L + 1L, 12345L + 2L, 12345L), "minimum(long, long, long) 3 failed"); - assertEquals(12345L, NumberUtils.min(12345L + 1L, 12345L, 12345L), "minimum(long, long, long) 4 failed"); - assertEquals(12345L, NumberUtils.min(12345L, 12345L, 12345L), "minimum(long, long, long) 5 failed"); - } - - @Test - public void testMinimumInt() { - assertEquals(12345, NumberUtils.min(12345, 12345 + 1, 12345 + 2), "minimum(int, int, int) 1 failed"); - assertEquals(12345, NumberUtils.min(12345 + 1, 12345, 12345 + 2), "minimum(int, int, int) 2 failed"); - assertEquals(12345, NumberUtils.min(12345 + 1, 12345 + 2, 12345), "minimum(int, int, int) 3 failed"); - assertEquals(12345, NumberUtils.min(12345 + 1, 12345, 12345), "minimum(int, int, int) 4 failed"); - assertEquals(12345, NumberUtils.min(12345, 12345, 12345), "minimum(int, int, int) 5 failed"); - } - - @Test - public void testMinimumShort() { - final short low = 1234; - final short mid = 1234 + 1; - final short high = 1234 + 2; - assertEquals(low, NumberUtils.min(low, mid, high), "minimum(short, short, short) 1 failed"); - assertEquals(low, NumberUtils.min(mid, low, high), "minimum(short, short, short) 2 failed"); - assertEquals(low, NumberUtils.min(mid, high, low), "minimum(short, short, short) 3 failed"); - assertEquals(low, NumberUtils.min(low, mid, low), "minimum(short, short, short) 4 failed"); - } - - @Test - public void testMinimumByte() { - final byte low = 123; - final byte mid = 123 + 1; - final byte high = 123 + 2; - assertEquals(low, NumberUtils.min(low, mid, high), "minimum(byte, byte, byte) 1 failed"); - assertEquals(low, NumberUtils.min(mid, low, high), "minimum(byte, byte, byte) 2 failed"); - assertEquals(low, NumberUtils.min(mid, high, low), "minimum(byte, byte, byte) 3 failed"); - assertEquals(low, NumberUtils.min(low, mid, low), "minimum(byte, byte, byte) 4 failed"); - } - - @Test - public void testMinimumDouble() { - final double low = 12.3; - final double mid = 12.3 + 1; - final double high = 12.3 + 2; - assertEquals(low, NumberUtils.min(low, mid, high), 0.0001); - assertEquals(low, NumberUtils.min(mid, low, high), 0.0001); - assertEquals(low, NumberUtils.min(mid, high, low), 0.0001); - assertEquals(low, NumberUtils.min(low, mid, low), 0.0001); - assertEquals(mid, NumberUtils.min(high, mid, high), 0.0001); - } - - @Test - public void testMinimumFloat() { - final float low = 12.3f; - final float mid = 12.3f + 1; - final float high = 12.3f + 2; - assertEquals(low, NumberUtils.min(low, mid, high), 0.0001f); - assertEquals(low, NumberUtils.min(mid, low, high), 0.0001f); - assertEquals(low, NumberUtils.min(mid, high, low), 0.0001f); - assertEquals(low, NumberUtils.min(low, mid, low), 0.0001f); - assertEquals(mid, NumberUtils.min(high, mid, high), 0.0001f); - } - - @Test - public void testMaximumLong() { - assertEquals(12345L, NumberUtils.max(12345L, 12345L - 1L, 12345L - 2L), "maximum(long, long, long) 1 failed"); - assertEquals(12345L, NumberUtils.max(12345L - 1L, 12345L, 12345L - 2L), "maximum(long, long, long) 2 failed"); - assertEquals(12345L, NumberUtils.max(12345L - 1L, 12345L - 2L, 12345L), "maximum(long, long, long) 3 failed"); - assertEquals(12345L, NumberUtils.max(12345L - 1L, 12345L, 12345L), "maximum(long, long, long) 4 failed"); - assertEquals(12345L, NumberUtils.max(12345L, 12345L, 12345L), "maximum(long, long, long) 5 failed"); - } - - @Test - public void testMaximumInt() { - assertEquals(12345, NumberUtils.max(12345, 12345 - 1, 12345 - 2), "maximum(int, int, int) 1 failed"); - assertEquals(12345, NumberUtils.max(12345 - 1, 12345, 12345 - 2), "maximum(int, int, int) 2 failed"); - assertEquals(12345, NumberUtils.max(12345 - 1, 12345 - 2, 12345), "maximum(int, int, int) 3 failed"); - assertEquals(12345, NumberUtils.max(12345 - 1, 12345, 12345), "maximum(int, int, int) 4 failed"); - assertEquals(12345, NumberUtils.max(12345, 12345, 12345), "maximum(int, int, int) 5 failed"); - } - - @Test - public void testMaximumShort() { - final short low = 1234; - final short mid = 1234 + 1; - final short high = 1234 + 2; - assertEquals(high, NumberUtils.max(low, mid, high), "maximum(short, short, short) 1 failed"); - assertEquals(high, NumberUtils.max(mid, low, high), "maximum(short, short, short) 2 failed"); - assertEquals(high, NumberUtils.max(mid, high, low), "maximum(short, short, short) 3 failed"); - assertEquals(high, NumberUtils.max(high, mid, high), "maximum(short, short, short) 4 failed"); - } - - @Test - public void testMaximumByte() { - final byte low = 123; - final byte mid = 123 + 1; - final byte high = 123 + 2; - assertEquals(high, NumberUtils.max(low, mid, high), "maximum(byte, byte, byte) 1 failed"); - assertEquals(high, NumberUtils.max(mid, low, high), "maximum(byte, byte, byte) 2 failed"); - assertEquals(high, NumberUtils.max(mid, high, low), "maximum(byte, byte, byte) 3 failed"); - assertEquals(high, NumberUtils.max(high, mid, high), "maximum(byte, byte, byte) 4 failed"); - } - - @Test - public void testMaximumDouble() { - final double low = 12.3; - final double mid = 12.3 + 1; - final double high = 12.3 + 2; - assertEquals(high, NumberUtils.max(low, mid, high), 0.0001); - assertEquals(high, NumberUtils.max(mid, low, high), 0.0001); - assertEquals(high, NumberUtils.max(mid, high, low), 0.0001); - assertEquals(mid, NumberUtils.max(low, mid, low), 0.0001); - assertEquals(high, NumberUtils.max(high, mid, high), 0.0001); - } - - @Test - public void testMaximumFloat() { - final float low = 12.3f; - final float mid = 12.3f + 1; - final float high = 12.3f + 2; - assertEquals(high, NumberUtils.max(low, mid, high), 0.0001f); - assertEquals(high, NumberUtils.max(mid, low, high), 0.0001f); - assertEquals(high, NumberUtils.max(mid, high, low), 0.0001f); - assertEquals(mid, NumberUtils.max(low, mid, low), 0.0001f); - assertEquals(high, NumberUtils.max(high, mid, high), 0.0001f); - } - // Testing JDK against old Lang functionality @Test public void testCompareDouble() { @@ -1236,19 +294,357 @@ public void testCompareFloat() { assertEquals(0, Float.compare(Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY)); } + @SuppressWarnings("cast") // suppress instanceof warning check @Test - public void testIsDigits() { - assertFalse(NumberUtils.isDigits(null), "isDigits(null) failed"); - assertFalse(NumberUtils.isDigits(""), "isDigits('') failed"); - assertTrue(NumberUtils.isDigits("12345"), "isDigits(String) failed"); - assertFalse(NumberUtils.isDigits("1234.5"), "isDigits(String) neg 1 failed"); - assertFalse(NumberUtils.isDigits("1ab"), "isDigits(String) neg 3 failed"); - assertFalse(NumberUtils.isDigits("abc"), "isDigits(String) neg 4 failed"); + public void testConstants() { + assertTrue(NumberUtils.LONG_ZERO instanceof Long); + assertTrue(NumberUtils.LONG_ONE instanceof Long); + assertTrue(NumberUtils.LONG_MINUS_ONE instanceof Long); + assertTrue(NumberUtils.INTEGER_ZERO instanceof Integer); + assertTrue(NumberUtils.INTEGER_ONE instanceof Integer); + assertTrue(NumberUtils.INTEGER_MINUS_ONE instanceof Integer); + assertTrue(NumberUtils.SHORT_ZERO instanceof Short); + assertTrue(NumberUtils.SHORT_ONE instanceof Short); + assertTrue(NumberUtils.SHORT_MINUS_ONE instanceof Short); + assertTrue(NumberUtils.BYTE_ZERO instanceof Byte); + assertTrue(NumberUtils.BYTE_ONE instanceof Byte); + assertTrue(NumberUtils.BYTE_MINUS_ONE instanceof Byte); + assertTrue(NumberUtils.DOUBLE_ZERO instanceof Double); + assertTrue(NumberUtils.DOUBLE_ONE instanceof Double); + assertTrue(NumberUtils.DOUBLE_MINUS_ONE instanceof Double); + assertTrue(NumberUtils.FLOAT_ZERO instanceof Float); + assertTrue(NumberUtils.FLOAT_ONE instanceof Float); + assertTrue(NumberUtils.FLOAT_MINUS_ONE instanceof Float); + + assertEquals(0, NumberUtils.LONG_ZERO.longValue()); + assertEquals(1, NumberUtils.LONG_ONE.longValue()); + assertEquals(NumberUtils.LONG_MINUS_ONE.longValue(), -1); + assertEquals(0, NumberUtils.INTEGER_ZERO.intValue()); + assertEquals(1, NumberUtils.INTEGER_ONE.intValue()); + assertEquals(NumberUtils.INTEGER_MINUS_ONE.intValue(), -1); + assertEquals(0, NumberUtils.SHORT_ZERO.shortValue()); + assertEquals(1, NumberUtils.SHORT_ONE.shortValue()); + assertEquals(NumberUtils.SHORT_MINUS_ONE.shortValue(), -1); + assertEquals(0, NumberUtils.BYTE_ZERO.byteValue()); + assertEquals(1, NumberUtils.BYTE_ONE.byteValue()); + assertEquals(NumberUtils.BYTE_MINUS_ONE.byteValue(), -1); + assertEquals(0.0d, NumberUtils.DOUBLE_ZERO.doubleValue()); + assertEquals(1.0d, NumberUtils.DOUBLE_ONE.doubleValue()); + assertEquals(NumberUtils.DOUBLE_MINUS_ONE.doubleValue(), -1.0d); + assertEquals(0.0f, NumberUtils.FLOAT_ZERO.floatValue()); + assertEquals(1.0f, NumberUtils.FLOAT_ONE.floatValue()); + assertEquals(NumberUtils.FLOAT_MINUS_ONE.floatValue(), -1.0f); + } + + // ----------------------------------------------------------------------- + @Test + public void testConstructor() { + assertNotNull(new NumberUtils()); + final Constructor[] cons = NumberUtils.class.getDeclaredConstructors(); + assertEquals(1, cons.length); + assertTrue(Modifier.isPublic(cons[0].getModifiers())); + assertTrue(Modifier.isPublic(NumberUtils.class.getModifiers())); + assertFalse(Modifier.isFinal(NumberUtils.class.getModifiers())); + } + + @Test + public void testCreateBigDecimal() { + assertEquals(new BigDecimal("1234.5"), NumberUtils.createBigDecimal("1234.5"), + "createBigDecimal(String) failed"); + assertNull(NumberUtils.createBigDecimal(null), "createBigDecimal(null) failed"); + this.testCreateBigDecimalFailure(""); + this.testCreateBigDecimalFailure(" "); + this.testCreateBigDecimalFailure("\b\t\n\f\r"); + // Funky whitespaces + this.testCreateBigDecimalFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F"); + // sign alone not valid + this.testCreateBigDecimalFailure("-"); + // comment in NumberUtils suggests some implementations may incorrectly allow this + this.testCreateBigDecimalFailure("--"); + this.testCreateBigDecimalFailure("--0"); + // sign alone not valid + this.testCreateBigDecimalFailure("+"); + // in case this was also allowed by some JVMs + this.testCreateBigDecimalFailure("++"); + this.testCreateBigDecimalFailure("++0"); + } + + protected void testCreateBigDecimalFailure(final String str) { + assertThrows(NumberFormatException.class, () -> NumberUtils.createBigDecimal(str), + "createBigDecimal(\"" + str + "\") should have failed."); + } + + @Test + public void testCreateBigInteger() { + assertEquals(new BigInteger("12345"), NumberUtils.createBigInteger("12345"), "createBigInteger(String) failed"); + assertNull(NumberUtils.createBigInteger(null), "createBigInteger(null) failed"); + this.testCreateBigIntegerFailure(""); + this.testCreateBigIntegerFailure(" "); + this.testCreateBigIntegerFailure("\b\t\n\f\r"); + // Funky whitespaces + this.testCreateBigIntegerFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F"); + assertEquals(new BigInteger("255"), NumberUtils.createBigInteger("0xff"), "createBigInteger(String) failed"); + assertEquals(new BigInteger("255"), NumberUtils.createBigInteger("0Xff"), "createBigInteger(String) failed"); + assertEquals(new BigInteger("255"), NumberUtils.createBigInteger("#ff"), "createBigInteger(String) failed"); + assertEquals(new BigInteger("-255"), NumberUtils.createBigInteger("-0xff"), "createBigInteger(String) failed"); + assertEquals(new BigInteger("255"), NumberUtils.createBigInteger("0377"), "createBigInteger(String) failed"); + assertEquals(new BigInteger("-255"), NumberUtils.createBigInteger("-0377"), "createBigInteger(String) failed"); + assertEquals(new BigInteger("-255"), NumberUtils.createBigInteger("-0377"), "createBigInteger(String) failed"); + assertEquals(new BigInteger("-0"), NumberUtils.createBigInteger("-0"), "createBigInteger(String) failed"); + assertEquals(new BigInteger("0"), NumberUtils.createBigInteger("0"), "createBigInteger(String) failed"); + testCreateBigIntegerFailure("#"); + testCreateBigIntegerFailure("-#"); + testCreateBigIntegerFailure("0x"); + testCreateBigIntegerFailure("-0x"); + } + + protected void testCreateBigIntegerFailure(final String str) { + assertThrows(NumberFormatException.class, () -> NumberUtils.createBigInteger(str), + "createBigInteger(\"" + str + "\") should have failed."); + } + + @Test + public void testCreateDouble() { + assertEquals(Double.valueOf("1234.5"), NumberUtils.createDouble("1234.5"), "createDouble(String) failed"); + assertNull(NumberUtils.createDouble(null), "createDouble(null) failed"); + this.testCreateDoubleFailure(""); + this.testCreateDoubleFailure(" "); + this.testCreateDoubleFailure("\b\t\n\f\r"); + // Funky whitespaces + this.testCreateDoubleFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F"); + } + + protected void testCreateDoubleFailure(final String str) { + assertThrows(NumberFormatException.class, () -> NumberUtils.createDouble(str), + "createDouble(\"" + str + "\") should have failed."); + } + + @Test + public void testCreateFloat() { + assertEquals(Float.valueOf("1234.5"), NumberUtils.createFloat("1234.5"), "createFloat(String) failed"); + assertNull(NumberUtils.createFloat(null), "createFloat(null) failed"); + this.testCreateFloatFailure(""); + this.testCreateFloatFailure(" "); + this.testCreateFloatFailure("\b\t\n\f\r"); + // Funky whitespaces + this.testCreateFloatFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F"); + } + + protected void testCreateFloatFailure(final String str) { + assertThrows(NumberFormatException.class, () -> NumberUtils.createFloat(str), + "createFloat(\"" + str + "\") should have failed."); + } + + @Test + public void testCreateInteger() { + assertEquals(Integer.valueOf("12345"), NumberUtils.createInteger("12345"), "createInteger(String) failed"); + assertNull(NumberUtils.createInteger(null), "createInteger(null) failed"); + this.testCreateIntegerFailure(""); + this.testCreateIntegerFailure(" "); + this.testCreateIntegerFailure("\b\t\n\f\r"); + // Funky whitespaces + this.testCreateIntegerFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F"); + } + + protected void testCreateIntegerFailure(final String str) { + assertThrows(NumberFormatException.class, () -> NumberUtils.createInteger(str), + "createInteger(\"" + str + "\") should have failed."); + } + + @Test + public void testCreateLong() { + assertEquals(Long.valueOf("12345"), NumberUtils.createLong("12345"), "createLong(String) failed"); + assertNull(NumberUtils.createLong(null), "createLong(null) failed"); + this.testCreateLongFailure(""); + this.testCreateLongFailure(" "); + this.testCreateLongFailure("\b\t\n\f\r"); + // Funky whitespaces + this.testCreateLongFailure("\u00A0\uFEFF\u000B\u000C\u001C\u001D\u001E\u001F"); + } + + protected void testCreateLongFailure(final String str) { + assertThrows(NumberFormatException.class, () -> NumberUtils.createLong(str), + "createLong(\"" + str + "\") should have failed."); + } + + @Test + public void testCreateNumber() { + // a lot of things can go wrong + assertEquals(Float.valueOf("1234.5"), NumberUtils.createNumber("1234.5"), "createNumber(String) 1 failed"); + assertEquals(Integer.valueOf("12345"), NumberUtils.createNumber("12345"), "createNumber(String) 2 failed"); + assertEquals(Double.valueOf("1234.5"), NumberUtils.createNumber("1234.5D"), "createNumber(String) 3 failed"); + assertEquals(Double.valueOf("1234.5"), NumberUtils.createNumber("1234.5d"), "createNumber(String) 3 failed"); + assertEquals(Float.valueOf("1234.5"), NumberUtils.createNumber("1234.5F"), "createNumber(String) 4 failed"); + assertEquals(Float.valueOf("1234.5"), NumberUtils.createNumber("1234.5f"), "createNumber(String) 4 failed"); + assertEquals(Long.valueOf(Integer.MAX_VALUE + 1L), NumberUtils.createNumber("" + (Integer.MAX_VALUE + 1L)), + "createNumber(String) 5 failed"); + assertEquals(Long.valueOf(12345), NumberUtils.createNumber("12345L"), "createNumber(String) 6 failed"); + assertEquals(Long.valueOf(12345), NumberUtils.createNumber("12345l"), "createNumber(String) 6 failed"); + assertEquals(Float.valueOf("-1234.5"), NumberUtils.createNumber("-1234.5"), "createNumber(String) 7 failed"); + assertEquals(Integer.valueOf("-12345"), NumberUtils.createNumber("-12345"), "createNumber(String) 8 failed"); + assertEquals(0xFADE, NumberUtils.createNumber("0xFADE").intValue(), "createNumber(String) 9a failed"); + assertEquals(0xFADE, NumberUtils.createNumber("0Xfade").intValue(), "createNumber(String) 9b failed"); + assertEquals(-0xFADE, NumberUtils.createNumber("-0xFADE").intValue(), "createNumber(String) 10a failed"); + assertEquals(-0xFADE, NumberUtils.createNumber("-0Xfade").intValue(), "createNumber(String) 10b failed"); + assertEquals(Double.valueOf("1.1E200"), NumberUtils.createNumber("1.1E200"), "createNumber(String) 11 failed"); + assertEquals(Float.valueOf("1.1E20"), NumberUtils.createNumber("1.1E20"), "createNumber(String) 12 failed"); + assertEquals(Double.valueOf("-1.1E200"), NumberUtils.createNumber("-1.1E200"), + "createNumber(String) 13 failed"); + assertEquals(Double.valueOf("1.1E-200"), NumberUtils.createNumber("1.1E-200"), + "createNumber(String) 14 failed"); + assertNull(NumberUtils.createNumber(null), "createNumber(null) failed"); + assertEquals(new BigInteger("12345678901234567890"), NumberUtils.createNumber("12345678901234567890L"), + "createNumber(String) failed"); + + assertEquals(new BigDecimal("1.1E-700"), NumberUtils.createNumber("1.1E-700F"), + "createNumber(String) 15 failed"); + + assertEquals(Long.valueOf("10" + Integer.MAX_VALUE), NumberUtils.createNumber("10" + Integer.MAX_VALUE + "L"), + "createNumber(String) 16 failed"); + assertEquals(Long.valueOf("10" + Integer.MAX_VALUE), NumberUtils.createNumber("10" + Integer.MAX_VALUE), + "createNumber(String) 17 failed"); + assertEquals(new BigInteger("10" + Long.MAX_VALUE), NumberUtils.createNumber("10" + Long.MAX_VALUE), + "createNumber(String) 18 failed"); + + // LANG-521 + assertEquals(Float.valueOf("2."), NumberUtils.createNumber("2."), "createNumber(String) LANG-521 failed"); + + // LANG-638 + assertFalse(checkCreateNumber("1eE"), "createNumber(String) succeeded"); + + // LANG-693 + assertEquals(Double.valueOf(Double.MAX_VALUE), NumberUtils.createNumber("" + Double.MAX_VALUE), + "createNumber(String) LANG-693 failed"); + + // LANG-822 + // ensure that the underlying negative number would create a BigDecimal + final Number bigNum = NumberUtils.createNumber("-1.1E-700F"); + assertNotNull(bigNum); + assertEquals(BigDecimal.class, bigNum.getClass()); + + // LANG-1018 + assertEquals(Double.valueOf("-160952.54"), NumberUtils.createNumber("-160952.54"), + "createNumber(String) LANG-1018 failed"); + // LANG-1187 + assertEquals(Double.valueOf("6264583.33"), NumberUtils.createNumber("6264583.33"), + "createNumber(String) LANG-1187 failed"); + // LANG-1215 + assertEquals(Double.valueOf("193343.82"), NumberUtils.createNumber("193343.82"), + "createNumber(String) LANG-1215 failed"); + // LANG-1060 + assertEquals(Double.valueOf("001234.5678"), NumberUtils.createNumber("001234.5678"), + "createNumber(String) LANG-1060a failed"); + assertEquals(Double.valueOf("+001234.5678"), NumberUtils.createNumber("+001234.5678"), + "createNumber(String) LANG-1060b failed"); + assertEquals(Double.valueOf("-001234.5678"), NumberUtils.createNumber("-001234.5678"), + "createNumber(String) LANG-1060c failed"); + assertEquals(Double.valueOf("0000.00000"), NumberUtils.createNumber("0000.00000d"), + "createNumber(String) LANG-1060d failed"); + assertEquals(Float.valueOf("001234.56"), NumberUtils.createNumber("001234.56"), + "createNumber(String) LANG-1060e failed"); + assertEquals(Float.valueOf("+001234.56"), NumberUtils.createNumber("+001234.56"), + "createNumber(String) LANG-1060f failed"); + assertEquals(Float.valueOf("-001234.56"), NumberUtils.createNumber("-001234.56"), + "createNumber(String) LANG-1060g failed"); + assertEquals(Float.valueOf("0000.10"), NumberUtils.createNumber("0000.10"), + "createNumber(String) LANG-1060h failed"); + assertEquals(Float.valueOf("001.1E20"), NumberUtils.createNumber("001.1E20"), + "createNumber(String) LANG-1060i failed"); + assertEquals(Float.valueOf("+001.1E20"), NumberUtils.createNumber("+001.1E20"), + "createNumber(String) LANG-1060j failed"); + assertEquals(Float.valueOf("-001.1E20"), NumberUtils.createNumber("-001.1E20"), + "createNumber(String) LANG-1060k failed"); + assertEquals(Double.valueOf("001.1E200"), NumberUtils.createNumber("001.1E200"), + "createNumber(String) LANG-1060l failed"); + assertEquals(Double.valueOf("+001.1E200"), NumberUtils.createNumber("+001.1E200"), + "createNumber(String) LANG-1060m failed"); + assertEquals(Double.valueOf("-001.1E200"), NumberUtils.createNumber("-001.1E200"), + "createNumber(String) LANG-1060n failed"); + } + + @Test + // Check that the code fails to create a valid number when preceded by -- rather than - + public void testCreateNumberFailure_1() { + assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("--1.1E-700F")); + } + + @Test + // Check that the code fails to create a valid number when both e and E are present (with decimal) + public void testCreateNumberFailure_2() { + assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("-1.1E+0-7e00")); + } + + @Test + // Check that the code fails to create a valid number when both e and E are present (no decimal) + public void testCreateNumberFailure_3() { + assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("-11E+0-7e00")); + } + + @Test + // Check that the code fails to create a valid number when both e and E are present (no decimal) + public void testCreateNumberFailure_4() { + assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("1eE+00001")); + } + + @Test + // Check that the code fails to create a valid number when there are multiple trailing 'f' characters (LANG-1205) + public void testCreateNumberFailure_5() { + assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("1234.5ff")); + } + + @Test + // Check that the code fails to create a valid number when there are multiple trailing 'F' characters (LANG-1205) + public void testCreateNumberFailure_6() { + assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("1234.5FF")); + } + + @Test + // Check that the code fails to create a valid number when there are multiple trailing 'd' characters (LANG-1205) + public void testCreateNumberFailure_7() { + assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("1234.5dd")); + } + + @Test + // Check that the code fails to create a valid number when there are multiple trailing 'D' characters (LANG-1205) + public void testCreateNumberFailure_8() { + assertThrows(NumberFormatException.class, () -> NumberUtils.createNumber("1234.5DD")); + } + + // Tests to show when magnitude causes switch to next Number type + // Will probably need to be adjusted if code is changed to check precision (LANG-693) + @Test + public void testCreateNumberMagnitude() { + // Test Float.MAX_VALUE, and same with +1 in final digit to check conversion changes to next Number type + assertEquals(Float.valueOf(Float.MAX_VALUE), NumberUtils.createNumber("3.4028235e+38")); + assertEquals(Double.valueOf(3.4028236e+38), NumberUtils.createNumber("3.4028236e+38")); + + // Test Double.MAX_VALUE + assertEquals(Double.valueOf(Double.MAX_VALUE), NumberUtils.createNumber("1.7976931348623157e+308")); + // Test with +2 in final digit (+1 does not cause roll-over to BigDecimal) + assertEquals(new BigDecimal("1.7976931348623159e+308"), NumberUtils.createNumber("1.7976931348623159e+308")); + + assertEquals(Integer.valueOf(0x12345678), NumberUtils.createNumber("0x12345678")); + assertEquals(Long.valueOf(0x123456789L), NumberUtils.createNumber("0x123456789")); + + assertEquals(Long.valueOf(0x7fffffffffffffffL), NumberUtils.createNumber("0x7fffffffffffffff")); + // Does not appear to be a way to create a literal BigInteger of this magnitude + assertEquals(new BigInteger("7fffffffffffffff0", 16), NumberUtils.createNumber("0x7fffffffffffffff0")); + + assertEquals(Long.valueOf(0x7fffffffffffffffL), NumberUtils.createNumber("#7fffffffffffffff")); + assertEquals(new BigInteger("7fffffffffffffff0", 16), NumberUtils.createNumber("#7fffffffffffffff0")); + + assertEquals(Integer.valueOf(017777777777), NumberUtils.createNumber("017777777777")); // 31 bits + assertEquals(Long.valueOf(037777777777L), NumberUtils.createNumber("037777777777")); // 32 bits + + // 63 bits + assertEquals(Long.valueOf(0777777777777777777777L), NumberUtils.createNumber("0777777777777777777777")); + // 64 bits + assertEquals(new BigInteger("1777777777777777777777", 8), NumberUtils.createNumber("01777777777777777777777")); } /** - * Tests isCreatable(String) and tests that createNumber(String) returns - * a valid number iff isCreatable(String) returns false. + * Tests isCreatable(String) and tests that createNumber(String) returns a valid number iff isCreatable(String) + * returns false. */ @Test public void testIsCreatable() { @@ -1306,43 +702,18 @@ public void testIsCreatable() { } @Test - public void testLANG971() { - compareIsCreatableWithCreateNumber("0085", false); - compareIsCreatableWithCreateNumber("085", false); - compareIsCreatableWithCreateNumber("08", false); - compareIsCreatableWithCreateNumber("07", true); - compareIsCreatableWithCreateNumber("00", true); - } - - @Test - public void testLANG992() { - compareIsCreatableWithCreateNumber("0.0", true); - compareIsCreatableWithCreateNumber("0.4790", true); - } - - @Test - public void testLANG972() { - compareIsCreatableWithCreateNumber("0xABCD", true); - compareIsCreatableWithCreateNumber("0XABCD", true); - } - - @Test - public void testLANG1252() { - compareIsCreatableWithCreateNumber("+2", true); - compareIsCreatableWithCreateNumber("+2.0", true); - } - - private void compareIsCreatableWithCreateNumber(final String val, final boolean expected) { - final boolean isValid = NumberUtils.isCreatable(val); - final boolean canCreate = checkCreateNumber(val); - assertTrue( - isValid == expected && canCreate == expected, - "Expecting " + expected + " for isCreatable/createNumber using \"" + val + "\" but got " + isValid + " and " + canCreate); + public void testIsDigits() { + assertFalse(NumberUtils.isDigits(null), "isDigits(null) failed"); + assertFalse(NumberUtils.isDigits(""), "isDigits('') failed"); + assertTrue(NumberUtils.isDigits("12345"), "isDigits(String) failed"); + assertFalse(NumberUtils.isDigits("1234.5"), "isDigits(String) neg 1 failed"); + assertFalse(NumberUtils.isDigits("1ab"), "isDigits(String) neg 3 failed"); + assertFalse(NumberUtils.isDigits("abc"), "isDigits(String) neg 4 failed"); } /** - * Tests isCreatable(String) and tests that createNumber(String) returns - * a valid number iff isCreatable(String) returns false. + * Tests isCreatable(String) and tests that createNumber(String) returns a valid number iff isCreatable(String) + * returns false. */ @Test public void testIsNumber() { @@ -1405,27 +776,6 @@ public void testIsNumber() { compareIsNumberWithCreateNumber("1.1L", false); // LANG-664 } - @Test - public void testIsNumberLANG971() { - compareIsNumberWithCreateNumber("0085", false); - compareIsNumberWithCreateNumber("085", false); - compareIsNumberWithCreateNumber("08", false); - compareIsNumberWithCreateNumber("07", true); - compareIsNumberWithCreateNumber("00", true); - } - - @Test - public void testIsNumberLANG992() { - compareIsNumberWithCreateNumber("0.0", true); - compareIsNumberWithCreateNumber("0.4790", true); - } - - @Test - public void testIsNumberLANG972() { - compareIsNumberWithCreateNumber("0xABCD", true); - compareIsNumberWithCreateNumber("0XABCD", true); - } - @Test public void testIsNumberLANG1252() { compareIsNumberWithCreateNumber("+2", true); @@ -1437,12 +787,25 @@ public void testIsNumberLANG1385() { compareIsNumberWithCreateNumber("L", false); } - private void compareIsNumberWithCreateNumber(final String val, final boolean expected) { - final boolean isValid = NumberUtils.isCreatable(val); - final boolean canCreate = checkCreateNumber(val); - assertTrue( - isValid == expected && canCreate == expected, - "Expecting "+ expected + " for isCreatable/createNumber using \"" + val + "\" but got " + isValid + " and " + canCreate); + @Test + public void testIsNumberLANG971() { + compareIsNumberWithCreateNumber("0085", false); + compareIsNumberWithCreateNumber("085", false); + compareIsNumberWithCreateNumber("08", false); + compareIsNumberWithCreateNumber("07", true); + compareIsNumberWithCreateNumber("00", true); + } + + @Test + public void testIsNumberLANG972() { + compareIsNumberWithCreateNumber("0xABCD", true); + compareIsNumberWithCreateNumber("0XABCD", true); + } + + @Test + public void testIsNumberLANG992() { + compareIsNumberWithCreateNumber("0.0", true); + compareIsNumberWithCreateNumber("0.4790", true); } @Test @@ -1468,55 +831,23 @@ public void testIsParsable() { assertTrue(NumberUtils.isParsable("-.236")); } - private boolean checkCreateNumber(final String val) { - try { - final Object obj = NumberUtils.createNumber(val); - return obj != null; - } catch (final NumberFormatException e) { - return false; - } + @Test + public void testLang1087() { + // no sign cases + assertEquals(Float.class, NumberUtils.createNumber("0.0").getClass()); + assertEquals(Float.valueOf("0.0"), NumberUtils.createNumber("0.0")); + // explicit positive sign cases + assertEquals(Float.class, NumberUtils.createNumber("+0.0").getClass()); + assertEquals(Float.valueOf("+0.0"), NumberUtils.createNumber("+0.0")); + // negative sign cases + assertEquals(Float.class, NumberUtils.createNumber("-0.0").getClass()); + assertEquals(Float.valueOf("-0.0"), NumberUtils.createNumber("-0.0")); } - @SuppressWarnings("cast") // suppress instanceof warning check @Test - public void testConstants() { - assertTrue(NumberUtils.LONG_ZERO instanceof Long); - assertTrue(NumberUtils.LONG_ONE instanceof Long); - assertTrue(NumberUtils.LONG_MINUS_ONE instanceof Long); - assertTrue(NumberUtils.INTEGER_ZERO instanceof Integer); - assertTrue(NumberUtils.INTEGER_ONE instanceof Integer); - assertTrue(NumberUtils.INTEGER_MINUS_ONE instanceof Integer); - assertTrue(NumberUtils.SHORT_ZERO instanceof Short); - assertTrue(NumberUtils.SHORT_ONE instanceof Short); - assertTrue(NumberUtils.SHORT_MINUS_ONE instanceof Short); - assertTrue(NumberUtils.BYTE_ZERO instanceof Byte); - assertTrue(NumberUtils.BYTE_ONE instanceof Byte); - assertTrue(NumberUtils.BYTE_MINUS_ONE instanceof Byte); - assertTrue(NumberUtils.DOUBLE_ZERO instanceof Double); - assertTrue(NumberUtils.DOUBLE_ONE instanceof Double); - assertTrue(NumberUtils.DOUBLE_MINUS_ONE instanceof Double); - assertTrue(NumberUtils.FLOAT_ZERO instanceof Float); - assertTrue(NumberUtils.FLOAT_ONE instanceof Float); - assertTrue(NumberUtils.FLOAT_MINUS_ONE instanceof Float); - - assertEquals(0, NumberUtils.LONG_ZERO.longValue()); - assertEquals(1, NumberUtils.LONG_ONE.longValue()); - assertEquals(NumberUtils.LONG_MINUS_ONE.longValue(), -1); - assertEquals(0, NumberUtils.INTEGER_ZERO.intValue()); - assertEquals(1, NumberUtils.INTEGER_ONE.intValue()); - assertEquals(NumberUtils.INTEGER_MINUS_ONE.intValue(), -1); - assertEquals(0, NumberUtils.SHORT_ZERO.shortValue()); - assertEquals(1, NumberUtils.SHORT_ONE.shortValue()); - assertEquals(NumberUtils.SHORT_MINUS_ONE.shortValue(), -1); - assertEquals(0, NumberUtils.BYTE_ZERO.byteValue()); - assertEquals(1, NumberUtils.BYTE_ONE.byteValue()); - assertEquals(NumberUtils.BYTE_MINUS_ONE.byteValue(), -1); - assertEquals(0.0d, NumberUtils.DOUBLE_ZERO.doubleValue()); - assertEquals(1.0d, NumberUtils.DOUBLE_ONE.doubleValue()); - assertEquals(NumberUtils.DOUBLE_MINUS_ONE.doubleValue(), -1.0d); - assertEquals(0.0f, NumberUtils.FLOAT_ZERO.floatValue()); - assertEquals(1.0f, NumberUtils.FLOAT_ONE.floatValue()); - assertEquals(NumberUtils.FLOAT_MINUS_ONE.floatValue(), -1.0f); + public void testLANG1252() { + compareIsCreatableWithCreateNumber("+2", true); + compareIsCreatableWithCreateNumber("+2.0", true); } @Test @@ -1533,46 +864,769 @@ public void testLang381() { assertTrue(Float.isNaN(NumberUtils.min(1.2f, 2.5f, Float.NaN))); assertTrue(Float.isNaN(NumberUtils.max(1.2f, 2.5f, Float.NaN))); - final double[] a = new double[] { 1.2, Double.NaN, 3.7, 27.0, 42.0, Double.NaN }; + final double[] a = new double[] {1.2, Double.NaN, 3.7, 27.0, 42.0, Double.NaN}; assertTrue(Double.isNaN(NumberUtils.max(a))); assertTrue(Double.isNaN(NumberUtils.min(a))); - final double[] b = new double[] { Double.NaN, 1.2, Double.NaN, 3.7, 27.0, 42.0, Double.NaN }; + final double[] b = new double[] {Double.NaN, 1.2, Double.NaN, 3.7, 27.0, 42.0, Double.NaN}; assertTrue(Double.isNaN(NumberUtils.max(b))); assertTrue(Double.isNaN(NumberUtils.min(b))); - final float[] aF = new float[] { 1.2f, Float.NaN, 3.7f, 27.0f, 42.0f, Float.NaN }; + final float[] aF = new float[] {1.2f, Float.NaN, 3.7f, 27.0f, 42.0f, Float.NaN}; assertTrue(Float.isNaN(NumberUtils.max(aF))); - final float[] bF = new float[] { Float.NaN, 1.2f, Float.NaN, 3.7f, 27.0f, 42.0f, Float.NaN }; + final float[] bF = new float[] {Float.NaN, 1.2f, Float.NaN, 3.7f, 27.0f, 42.0f, Float.NaN}; assertTrue(Float.isNaN(NumberUtils.max(bF))); } @Test - public void compareInt() { - assertTrue(NumberUtils.compare(-3, 0) < 0); - assertEquals(0, NumberUtils.compare(113, 113)); - assertTrue(NumberUtils.compare(213, 32) > 0); + public void TestLang747() { + assertEquals(Integer.valueOf(0x8000), NumberUtils.createNumber("0x8000")); + assertEquals(Integer.valueOf(0x80000), NumberUtils.createNumber("0x80000")); + assertEquals(Integer.valueOf(0x800000), NumberUtils.createNumber("0x800000")); + assertEquals(Integer.valueOf(0x8000000), NumberUtils.createNumber("0x8000000")); + assertEquals(Integer.valueOf(0x7FFFFFFF), NumberUtils.createNumber("0x7FFFFFFF")); + assertEquals(Long.valueOf(0x80000000L), NumberUtils.createNumber("0x80000000")); + assertEquals(Long.valueOf(0xFFFFFFFFL), NumberUtils.createNumber("0xFFFFFFFF")); + + // Leading zero tests + assertEquals(Integer.valueOf(0x8000000), NumberUtils.createNumber("0x08000000")); + assertEquals(Integer.valueOf(0x7FFFFFFF), NumberUtils.createNumber("0x007FFFFFFF")); + assertEquals(Long.valueOf(0x80000000L), NumberUtils.createNumber("0x080000000")); + assertEquals(Long.valueOf(0xFFFFFFFFL), NumberUtils.createNumber("0x00FFFFFFFF")); + + assertEquals(Long.valueOf(0x800000000L), NumberUtils.createNumber("0x800000000")); + assertEquals(Long.valueOf(0x8000000000L), NumberUtils.createNumber("0x8000000000")); + assertEquals(Long.valueOf(0x80000000000L), NumberUtils.createNumber("0x80000000000")); + assertEquals(Long.valueOf(0x800000000000L), NumberUtils.createNumber("0x800000000000")); + assertEquals(Long.valueOf(0x8000000000000L), NumberUtils.createNumber("0x8000000000000")); + assertEquals(Long.valueOf(0x80000000000000L), NumberUtils.createNumber("0x80000000000000")); + assertEquals(Long.valueOf(0x800000000000000L), NumberUtils.createNumber("0x800000000000000")); + assertEquals(Long.valueOf(0x7FFFFFFFFFFFFFFFL), NumberUtils.createNumber("0x7FFFFFFFFFFFFFFF")); + // N.B. Cannot use a hex constant such as 0x8000000000000000L here as that is interpreted as a negative long + assertEquals(new BigInteger("8000000000000000", 16), NumberUtils.createNumber("0x8000000000000000")); + assertEquals(new BigInteger("FFFFFFFFFFFFFFFF", 16), NumberUtils.createNumber("0xFFFFFFFFFFFFFFFF")); + + // Leading zero tests + assertEquals(Long.valueOf(0x80000000000000L), NumberUtils.createNumber("0x00080000000000000")); + assertEquals(Long.valueOf(0x800000000000000L), NumberUtils.createNumber("0x0800000000000000")); + assertEquals(Long.valueOf(0x7FFFFFFFFFFFFFFFL), NumberUtils.createNumber("0x07FFFFFFFFFFFFFFF")); + // N.B. Cannot use a hex constant such as 0x8000000000000000L here as that is interpreted as a negative long + assertEquals(new BigInteger("8000000000000000", 16), NumberUtils.createNumber("0x00008000000000000000")); + assertEquals(new BigInteger("FFFFFFFFFFFFFFFF", 16), NumberUtils.createNumber("0x0FFFFFFFFFFFFFFFF")); } @Test - public void compareLong() { - assertTrue(NumberUtils.compare(-3L, 0L) < 0); - assertEquals(0, NumberUtils.compare(113L, 113L)); - assertTrue(NumberUtils.compare(213L, 32L) > 0); + public void testLANG971() { + compareIsCreatableWithCreateNumber("0085", false); + compareIsCreatableWithCreateNumber("085", false); + compareIsCreatableWithCreateNumber("08", false); + compareIsCreatableWithCreateNumber("07", true); + compareIsCreatableWithCreateNumber("00", true); } @Test - public void compareShort() { - assertTrue(NumberUtils.compare((short) -3, (short) 0) < 0); - assertEquals(0, NumberUtils.compare((short) 113, (short) 113)); - assertTrue(NumberUtils.compare((short) 213, (short) 32) > 0); + public void testLANG972() { + compareIsCreatableWithCreateNumber("0xABCD", true); + compareIsCreatableWithCreateNumber("0XABCD", true); } @Test - public void compareByte() { - assertTrue(NumberUtils.compare((byte) -3, (byte) 0) < 0); - assertEquals(0, NumberUtils.compare((byte) 113, (byte) 113)); - assertTrue(NumberUtils.compare((byte) 123, (byte) 32) > 0); + public void testLANG992() { + compareIsCreatableWithCreateNumber("0.0", true); + compareIsCreatableWithCreateNumber("0.4790", true); + } + + @Test + public void testMaxByte() { + assertEquals((byte) 5, NumberUtils.max((byte) 5), "max(byte[]) failed for array length 1"); + assertEquals((byte) 9, NumberUtils.max((byte) 6, (byte) 9), "max(byte[]) failed for array length 2"); + assertEquals((byte) 10, NumberUtils.max((byte) -10, (byte) -5, (byte) 0, (byte) 5, (byte) 10), + "max(byte[]) failed for array length 5"); + assertEquals((byte) 10, NumberUtils.max((byte) -10, (byte) -5, (byte) 0, (byte) 5, (byte) 10)); + assertEquals((byte) 10, NumberUtils.max((byte) -5, (byte) 0, (byte) 10, (byte) 5, (byte) -10)); + } + + @Test + public void testMaxByte_emptyArray() { + assertThrows(IllegalArgumentException.class, NumberUtils::max); + } + + @Test + public void testMaxByte_nullArray() { + assertThrows(NullPointerException.class, () -> NumberUtils.max((byte[]) null)); + } + + @Test + public void testMaxDouble() { + final double[] d = null; + assertThrows(NullPointerException.class, () -> NumberUtils.max(d), "No exception was thrown for null input."); + + assertThrows(IllegalArgumentException.class, NumberUtils::max, "No exception was thrown for empty input."); + + assertEquals(5.1f, NumberUtils.max(5.1f), "max(double[]) failed for array length 1"); + assertEquals(9.2f, NumberUtils.max(6.3f, 9.2f), "max(double[]) failed for array length 2"); + assertEquals(10.4f, NumberUtils.max(-10.5f, -5.6f, 0, 5.7f, 10.4f), "max(double[]) failed for float length 5"); + assertEquals(10, NumberUtils.max(-10, -5, 0, 5, 10), 0.0001); + assertEquals(10, NumberUtils.max(-5, 0, 10, 5, -10), 0.0001); + } + + @Test + public void testMaxDouble_emptyArray() { + assertThrows(IllegalArgumentException.class, NumberUtils::max); + } + + @Test + public void testMaxDouble_nullArray() { + assertThrows(NullPointerException.class, () -> NumberUtils.max((double[]) null)); + } + + @Test + public void testMaxFloat() { + assertEquals(5.1f, NumberUtils.max(5.1f), "max(float[]) failed for array length 1"); + assertEquals(9.2f, NumberUtils.max(6.3f, 9.2f), "max(float[]) failed for array length 2"); + assertEquals(10.4f, NumberUtils.max(-10.5f, -5.6f, 0, 5.7f, 10.4f), "max(float[]) failed for float length 5"); + assertEquals(10, NumberUtils.max(-10, -5, 0, 5, 10), 0.0001f); + assertEquals(10, NumberUtils.max(-5, 0, 10, 5, -10), 0.0001f); + } + + @Test + public void testMaxFloat_emptyArray() { + assertThrows(IllegalArgumentException.class, NumberUtils::max); + } + + @Test + public void testMaxFloat_nullArray() { + assertThrows(NullPointerException.class, () -> NumberUtils.max((float[]) null)); + } + + @Test + public void testMaximumByte() { + final byte low = 123; + final byte mid = 123 + 1; + final byte high = 123 + 2; + assertEquals(high, NumberUtils.max(low, mid, high), "maximum(byte, byte, byte) 1 failed"); + assertEquals(high, NumberUtils.max(mid, low, high), "maximum(byte, byte, byte) 2 failed"); + assertEquals(high, NumberUtils.max(mid, high, low), "maximum(byte, byte, byte) 3 failed"); + assertEquals(high, NumberUtils.max(high, mid, high), "maximum(byte, byte, byte) 4 failed"); + } + + @Test + public void testMaximumDouble() { + final double low = 12.3; + final double mid = 12.3 + 1; + final double high = 12.3 + 2; + assertEquals(high, NumberUtils.max(low, mid, high), 0.0001); + assertEquals(high, NumberUtils.max(mid, low, high), 0.0001); + assertEquals(high, NumberUtils.max(mid, high, low), 0.0001); + assertEquals(mid, NumberUtils.max(low, mid, low), 0.0001); + assertEquals(high, NumberUtils.max(high, mid, high), 0.0001); + } + + @Test + public void testMaximumFloat() { + final float low = 12.3f; + final float mid = 12.3f + 1; + final float high = 12.3f + 2; + assertEquals(high, NumberUtils.max(low, mid, high), 0.0001f); + assertEquals(high, NumberUtils.max(mid, low, high), 0.0001f); + assertEquals(high, NumberUtils.max(mid, high, low), 0.0001f); + assertEquals(mid, NumberUtils.max(low, mid, low), 0.0001f); + assertEquals(high, NumberUtils.max(high, mid, high), 0.0001f); + } + + @Test + public void testMaximumInt() { + assertEquals(12345, NumberUtils.max(12345, 12345 - 1, 12345 - 2), "maximum(int, int, int) 1 failed"); + assertEquals(12345, NumberUtils.max(12345 - 1, 12345, 12345 - 2), "maximum(int, int, int) 2 failed"); + assertEquals(12345, NumberUtils.max(12345 - 1, 12345 - 2, 12345), "maximum(int, int, int) 3 failed"); + assertEquals(12345, NumberUtils.max(12345 - 1, 12345, 12345), "maximum(int, int, int) 4 failed"); + assertEquals(12345, NumberUtils.max(12345, 12345, 12345), "maximum(int, int, int) 5 failed"); + } + + @Test + public void testMaximumLong() { + assertEquals(12345L, NumberUtils.max(12345L, 12345L - 1L, 12345L - 2L), "maximum(long, long, long) 1 failed"); + assertEquals(12345L, NumberUtils.max(12345L - 1L, 12345L, 12345L - 2L), "maximum(long, long, long) 2 failed"); + assertEquals(12345L, NumberUtils.max(12345L - 1L, 12345L - 2L, 12345L), "maximum(long, long, long) 3 failed"); + assertEquals(12345L, NumberUtils.max(12345L - 1L, 12345L, 12345L), "maximum(long, long, long) 4 failed"); + assertEquals(12345L, NumberUtils.max(12345L, 12345L, 12345L), "maximum(long, long, long) 5 failed"); + } + + @Test + public void testMaximumShort() { + final short low = 1234; + final short mid = 1234 + 1; + final short high = 1234 + 2; + assertEquals(high, NumberUtils.max(low, mid, high), "maximum(short, short, short) 1 failed"); + assertEquals(high, NumberUtils.max(mid, low, high), "maximum(short, short, short) 2 failed"); + assertEquals(high, NumberUtils.max(mid, high, low), "maximum(short, short, short) 3 failed"); + assertEquals(high, NumberUtils.max(high, mid, high), "maximum(short, short, short) 4 failed"); + } + + @Test + public void testMaxInt() { + assertEquals(5, NumberUtils.max(5), "max(int[]) failed for array length 1"); + assertEquals(9, NumberUtils.max(6, 9), "max(int[]) failed for array length 2"); + assertEquals(10, NumberUtils.max(-10, -5, 0, 5, 10), "max(int[]) failed for array length 5"); + assertEquals(10, NumberUtils.max(-10, -5, 0, 5, 10)); + assertEquals(10, NumberUtils.max(-5, 0, 10, 5, -10)); + } + + @Test + public void testMaxInt_emptyArray() { + assertThrows(IllegalArgumentException.class, NumberUtils::max); + } + + @Test + public void testMaxInt_nullArray() { + assertThrows(NullPointerException.class, () -> NumberUtils.max((int[]) null)); + } + + @Test + public void testMaxLong() { + assertEquals(5L, NumberUtils.max(5L), "max(long[]) failed for array length 1"); + assertEquals(9L, NumberUtils.max(6L, 9L), "max(long[]) failed for array length 2"); + assertEquals(10L, NumberUtils.max(-10L, -5L, 0L, 5L, 10L), "max(long[]) failed for array length 5"); + assertEquals(10L, NumberUtils.max(-10L, -5L, 0L, 5L, 10L)); + assertEquals(10L, NumberUtils.max(-5L, 0L, 10L, 5L, -10L)); + } + + @Test + public void testMaxLong_emptyArray() { + assertThrows(IllegalArgumentException.class, NumberUtils::max); + } + + @Test + public void testMaxLong_nullArray() { + assertThrows(NullPointerException.class, () -> NumberUtils.max((long[]) null)); + } + + @Test + public void testMaxShort() { + assertEquals((short) 5, NumberUtils.max((short) 5), "max(short[]) failed for array length 1"); + assertEquals((short) 9, NumberUtils.max((short) 6, (short) 9), "max(short[]) failed for array length 2"); + assertEquals((short) 10, NumberUtils.max((short) -10, (short) -5, (short) 0, (short) 5, (short) 10), + "max(short[]) failed for array length 5"); + assertEquals((short) 10, NumberUtils.max((short) -10, (short) -5, (short) 0, (short) 5, (short) 10)); + assertEquals((short) 10, NumberUtils.max((short) -5, (short) 0, (short) 10, (short) 5, (short) -10)); + } + + @Test + public void testMaxShort_emptyArray() { + assertThrows(IllegalArgumentException.class, NumberUtils::max); + } + + @Test + public void testMaxShort_nullArray() { + assertThrows(NullPointerException.class, () -> NumberUtils.max((short[]) null)); + } + + @Test + public void testMinByte() { + assertEquals((byte) 5, NumberUtils.min((byte) 5), "min(byte[]) failed for array length 1"); + assertEquals((byte) 6, NumberUtils.min((byte) 6, (byte) 9), "min(byte[]) failed for array length 2"); + + assertEquals((byte) -10, NumberUtils.min((byte) -10, (byte) -5, (byte) 0, (byte) 5, (byte) 10)); + assertEquals((byte) -10, NumberUtils.min((byte) -5, (byte) 0, (byte) -10, (byte) 5, (byte) 10)); + } + + @Test + public void testMinByte_emptyArray() { + assertThrows(IllegalArgumentException.class, NumberUtils::min); + } + + @Test + public void testMinByte_nullArray() { + assertThrows(NullPointerException.class, () -> NumberUtils.min((byte[]) null)); + } + + @Test + public void testMinDouble() { + assertEquals(5.12, NumberUtils.min(5.12), "min(double[]) failed for array length 1"); + assertEquals(6.23, NumberUtils.min(6.23, 9.34), "min(double[]) failed for array length 2"); + assertEquals(-10.45, NumberUtils.min(-10.45, -5.56, 0, 5.67, 10.78), "min(double[]) failed for array length 5"); + assertEquals(-10, NumberUtils.min(-10, -5, 0, 5, 10), 0.0001); + assertEquals(-10, NumberUtils.min(-5, 0, -10, 5, 10), 0.0001); + } + + @Test + public void testMinDouble_emptyArray() { + assertThrows(IllegalArgumentException.class, NumberUtils::min); + } + + @Test + public void testMinDouble_nullArray() { + assertThrows(NullPointerException.class, () -> NumberUtils.min((double[]) null)); + } + + @Test + public void testMinFloat() { + assertEquals(5.9f, NumberUtils.min(5.9f), "min(float[]) failed for array length 1"); + assertEquals(6.8f, NumberUtils.min(6.8f, 9.7f), "min(float[]) failed for array length 2"); + assertEquals(-10.6f, NumberUtils.min(-10.6f, -5.5f, 0, 5.4f, 10.3f), "min(float[]) failed for array length 5"); + assertEquals(-10, NumberUtils.min(-10, -5, 0, 5, 10), 0.0001f); + assertEquals(-10, NumberUtils.min(-5, 0, -10, 5, 10), 0.0001f); + } + + @Test + public void testMinFloat_emptyArray() { + assertThrows(IllegalArgumentException.class, NumberUtils::min); + } + + @Test + public void testMinFloat_nullArray() { + assertThrows(NullPointerException.class, () -> NumberUtils.min((float[]) null)); + } + + @Test + public void testMinimumByte() { + final byte low = 123; + final byte mid = 123 + 1; + final byte high = 123 + 2; + assertEquals(low, NumberUtils.min(low, mid, high), "minimum(byte, byte, byte) 1 failed"); + assertEquals(low, NumberUtils.min(mid, low, high), "minimum(byte, byte, byte) 2 failed"); + assertEquals(low, NumberUtils.min(mid, high, low), "minimum(byte, byte, byte) 3 failed"); + assertEquals(low, NumberUtils.min(low, mid, low), "minimum(byte, byte, byte) 4 failed"); + } + + @Test + public void testMinimumDouble() { + final double low = 12.3; + final double mid = 12.3 + 1; + final double high = 12.3 + 2; + assertEquals(low, NumberUtils.min(low, mid, high), 0.0001); + assertEquals(low, NumberUtils.min(mid, low, high), 0.0001); + assertEquals(low, NumberUtils.min(mid, high, low), 0.0001); + assertEquals(low, NumberUtils.min(low, mid, low), 0.0001); + assertEquals(mid, NumberUtils.min(high, mid, high), 0.0001); + } + + @Test + public void testMinimumFloat() { + final float low = 12.3f; + final float mid = 12.3f + 1; + final float high = 12.3f + 2; + assertEquals(low, NumberUtils.min(low, mid, high), 0.0001f); + assertEquals(low, NumberUtils.min(mid, low, high), 0.0001f); + assertEquals(low, NumberUtils.min(mid, high, low), 0.0001f); + assertEquals(low, NumberUtils.min(low, mid, low), 0.0001f); + assertEquals(mid, NumberUtils.min(high, mid, high), 0.0001f); + } + + @Test + public void testMinimumInt() { + assertEquals(12345, NumberUtils.min(12345, 12345 + 1, 12345 + 2), "minimum(int, int, int) 1 failed"); + assertEquals(12345, NumberUtils.min(12345 + 1, 12345, 12345 + 2), "minimum(int, int, int) 2 failed"); + assertEquals(12345, NumberUtils.min(12345 + 1, 12345 + 2, 12345), "minimum(int, int, int) 3 failed"); + assertEquals(12345, NumberUtils.min(12345 + 1, 12345, 12345), "minimum(int, int, int) 4 failed"); + assertEquals(12345, NumberUtils.min(12345, 12345, 12345), "minimum(int, int, int) 5 failed"); + } + + @Test + public void testMinimumLong() { + assertEquals(12345L, NumberUtils.min(12345L, 12345L + 1L, 12345L + 2L), "minimum(long, long, long) 1 failed"); + assertEquals(12345L, NumberUtils.min(12345L + 1L, 12345L, 12345 + 2L), "minimum(long, long, long) 2 failed"); + assertEquals(12345L, NumberUtils.min(12345L + 1L, 12345L + 2L, 12345L), "minimum(long, long, long) 3 failed"); + assertEquals(12345L, NumberUtils.min(12345L + 1L, 12345L, 12345L), "minimum(long, long, long) 4 failed"); + assertEquals(12345L, NumberUtils.min(12345L, 12345L, 12345L), "minimum(long, long, long) 5 failed"); + } + + @Test + public void testMinimumShort() { + final short low = 1234; + final short mid = 1234 + 1; + final short high = 1234 + 2; + assertEquals(low, NumberUtils.min(low, mid, high), "minimum(short, short, short) 1 failed"); + assertEquals(low, NumberUtils.min(mid, low, high), "minimum(short, short, short) 2 failed"); + assertEquals(low, NumberUtils.min(mid, high, low), "minimum(short, short, short) 3 failed"); + assertEquals(low, NumberUtils.min(low, mid, low), "minimum(short, short, short) 4 failed"); + } + + @Test + public void testMinInt() { + assertEquals(5, NumberUtils.min(5), "min(int[]) failed for array length 1"); + assertEquals(6, NumberUtils.min(6, 9), "min(int[]) failed for array length 2"); + + assertEquals(-10, NumberUtils.min(-10, -5, 0, 5, 10)); + assertEquals(-10, NumberUtils.min(-5, 0, -10, 5, 10)); + } + + @Test + public void testMinInt_emptyArray() { + assertThrows(IllegalArgumentException.class, NumberUtils::min); + } + + @Test + public void testMinInt_nullArray() { + assertThrows(NullPointerException.class, () -> NumberUtils.min((int[]) null)); + } + + @Test + public void testMinLong() { + assertEquals(5L, NumberUtils.min(5L), "min(long[]) failed for array length 1"); + assertEquals(6L, NumberUtils.min(6L, 9L), "min(long[]) failed for array length 2"); + + assertEquals(-10L, NumberUtils.min(-10L, -5L, 0L, 5L, 10L)); + assertEquals(-10L, NumberUtils.min(-5L, 0L, -10L, 5L, 10L)); + } + + @Test + public void testMinLong_emptyArray() { + assertThrows(IllegalArgumentException.class, NumberUtils::min); + } + + // min/max tests + // ---------------------------------------------------------------------- + @Test + public void testMinLong_nullArray() { + assertThrows(NullPointerException.class, () -> NumberUtils.min((long[]) null)); + } + + @Test + public void testMinShort() { + assertEquals((short) 5, NumberUtils.min((short) 5), "min(short[]) failed for array length 1"); + assertEquals((short) 6, NumberUtils.min((short) 6, (short) 9), "min(short[]) failed for array length 2"); + + assertEquals((short) -10, NumberUtils.min((short) -10, (short) -5, (short) 0, (short) 5, (short) 10)); + assertEquals((short) -10, NumberUtils.min((short) -5, (short) 0, (short) -10, (short) 5, (short) 10)); + } + + @Test + public void testMinShort_emptyArray() { + assertThrows(IllegalArgumentException.class, NumberUtils::min); + } + + @Test + public void testMinShort_nullArray() { + assertThrows(NullPointerException.class, () -> NumberUtils.min((short[]) null)); + } + + /** + * Test for {(@link NumberUtils#createNumber(String)} + */ + @Test + public void testStringCreateNumberEnsureNoPrecisionLoss() { + final String shouldBeFloat = "1.23"; + final String shouldBeDouble = "3.40282354e+38"; + final String shouldBeBigDecimal = "1.797693134862315759e+308"; + assertTrue(NumberUtils.createNumber(shouldBeFloat) instanceof Float); + assertTrue(NumberUtils.createNumber(shouldBeDouble) instanceof Double); + assertTrue(NumberUtils.createNumber(shouldBeBigDecimal) instanceof BigDecimal); + // LANG-1060 + assertTrue(NumberUtils.createNumber("001.12") instanceof Float); + assertTrue(NumberUtils.createNumber("-001.12") instanceof Float); + assertTrue(NumberUtils.createNumber("+001.12") instanceof Float); + assertTrue(NumberUtils.createNumber("003.40282354e+38") instanceof Double); + assertTrue(NumberUtils.createNumber("-003.40282354e+38") instanceof Double); + assertTrue(NumberUtils.createNumber("+003.40282354e+38") instanceof Double); + assertTrue(NumberUtils.createNumber("0001.797693134862315759e+308") instanceof BigDecimal); + assertTrue(NumberUtils.createNumber("-001.797693134862315759e+308") instanceof BigDecimal); + assertTrue(NumberUtils.createNumber("+001.797693134862315759e+308") instanceof BigDecimal); + } + + /** + * Test for {@link NumberUtils#toDouble(String)}. + */ + @Test + public void testStringToDoubleString() { + assertEquals(NumberUtils.toDouble("-1.2345"), -1.2345d, "toDouble(String) 1 failed"); + assertEquals(1.2345d, NumberUtils.toDouble("1.2345"), "toDouble(String) 2 failed"); + assertEquals(0.0d, NumberUtils.toDouble("abc"), "toDouble(String) 3 failed"); + // LANG-1060 + assertEquals(NumberUtils.toDouble("-001.2345"), -1.2345d, "toDouble(String) 4 failed"); + assertEquals(1.2345d, NumberUtils.toDouble("+001.2345"), "toDouble(String) 5 failed"); + assertEquals(1.2345d, NumberUtils.toDouble("001.2345"), "toDouble(String) 6 failed"); + assertEquals(0d, NumberUtils.toDouble("000.00000"), "toDouble(String) 7 failed"); + + assertEquals(NumberUtils.toDouble(Double.MAX_VALUE + ""), Double.MAX_VALUE, + "toDouble(Double.MAX_VALUE) failed"); + assertEquals(NumberUtils.toDouble(Double.MIN_VALUE + ""), Double.MIN_VALUE, + "toDouble(Double.MIN_VALUE) failed"); + assertEquals(0.0d, NumberUtils.toDouble(""), "toDouble(empty) failed"); + assertEquals(0.0d, NumberUtils.toDouble((String) null), "toDouble(null) failed"); + } + + /** + * Test for {@link NumberUtils#toDouble(String, double)}. + */ + @Test + public void testStringToDoubleStringD() { + assertEquals(1.2345d, NumberUtils.toDouble("1.2345", 5.1d), "toDouble(String, int) 1 failed"); + assertEquals(5.0d, NumberUtils.toDouble("a", 5.0d), "toDouble(String, int) 2 failed"); + // LANG-1060 + assertEquals(1.2345d, NumberUtils.toDouble("001.2345", 5.1d), "toDouble(String, int) 3 failed"); + assertEquals(NumberUtils.toDouble("-001.2345", 5.1d), -1.2345d, "toDouble(String, int) 4 failed"); + assertEquals(1.2345d, NumberUtils.toDouble("+001.2345", 5.1d), "toDouble(String, int) 5 failed"); + assertEquals(0d, NumberUtils.toDouble("000.00", 5.1d), "toDouble(String, int) 7 failed"); + } + + /** + * Test for {@link NumberUtils#toByte(String)}. + */ + @Test + public void testToByteString() { + assertEquals(123, NumberUtils.toByte("123"), "toByte(String) 1 failed"); + assertEquals(0, NumberUtils.toByte("abc"), "toByte(String) 2 failed"); + assertEquals(0, NumberUtils.toByte(""), "toByte(empty) failed"); + assertEquals(0, NumberUtils.toByte(null), "toByte(null) failed"); + } + + /** + * Test for {@link NumberUtils#toByte(String, byte)}. + */ + @Test + public void testToByteStringI() { + assertEquals(123, NumberUtils.toByte("123", (byte) 5), "toByte(String, byte) 1 failed"); + assertEquals(5, NumberUtils.toByte("12.3", (byte) 5), "toByte(String, byte) 2 failed"); + } + + /** + * Test for {@link NumberUtils#toFloat(String)}. + */ + @Test + public void testToFloatString() { + assertEquals(NumberUtils.toFloat("-1.2345"), -1.2345f, "toFloat(String) 1 failed"); + assertEquals(1.2345f, NumberUtils.toFloat("1.2345"), "toFloat(String) 2 failed"); + assertEquals(0.0f, NumberUtils.toFloat("abc"), "toFloat(String) 3 failed"); + // LANG-1060 + assertEquals(NumberUtils.toFloat("-001.2345"), -1.2345f, "toFloat(String) 4 failed"); + assertEquals(1.2345f, NumberUtils.toFloat("+001.2345"), "toFloat(String) 5 failed"); + assertEquals(1.2345f, NumberUtils.toFloat("001.2345"), "toFloat(String) 6 failed"); + assertEquals(0f, NumberUtils.toFloat("000.00"), "toFloat(String) 7 failed"); + + assertEquals(NumberUtils.toFloat(Float.MAX_VALUE + ""), Float.MAX_VALUE, "toFloat(Float.MAX_VALUE) failed"); + assertEquals(NumberUtils.toFloat(Float.MIN_VALUE + ""), Float.MIN_VALUE, "toFloat(Float.MIN_VALUE) failed"); + assertEquals(0.0f, NumberUtils.toFloat(""), "toFloat(empty) failed"); + assertEquals(0.0f, NumberUtils.toFloat(null), "toFloat(null) failed"); + } + + /** + * Test for {@link NumberUtils#toFloat(String, float)}. + */ + @Test + public void testToFloatStringF() { + assertEquals(1.2345f, NumberUtils.toFloat("1.2345", 5.1f), "toFloat(String, int) 1 failed"); + assertEquals(5.0f, NumberUtils.toFloat("a", 5.0f), "toFloat(String, int) 2 failed"); + // LANG-1060 + assertEquals(5.0f, NumberUtils.toFloat("-001Z.2345", 5.0f), "toFloat(String, int) 3 failed"); + assertEquals(5.0f, NumberUtils.toFloat("+001AB.2345", 5.0f), "toFloat(String, int) 4 failed"); + assertEquals(5.0f, NumberUtils.toFloat("001Z.2345", 5.0f), "toFloat(String, int) 5 failed"); + } + + /** + * Test for {@link NumberUtils#toInt(String)}. + */ + @Test + public void testToIntString() { + assertEquals(12345, NumberUtils.toInt("12345"), "toInt(String) 1 failed"); + assertEquals(0, NumberUtils.toInt("abc"), "toInt(String) 2 failed"); + assertEquals(0, NumberUtils.toInt(""), "toInt(empty) failed"); + assertEquals(0, NumberUtils.toInt(null), "toInt(null) failed"); + } + + /** + * Test for {@link NumberUtils#toInt(String, int)}. + */ + @Test + public void testToIntStringI() { + assertEquals(12345, NumberUtils.toInt("12345", 5), "toInt(String, int) 1 failed"); + assertEquals(5, NumberUtils.toInt("1234.5", 5), "toInt(String, int) 2 failed"); + } + + /** + * Test for {@link NumberUtils#toLong(String)}. + */ + @Test + public void testToLongString() { + assertEquals(12345L, NumberUtils.toLong("12345"), "toLong(String) 1 failed"); + assertEquals(0L, NumberUtils.toLong("abc"), "toLong(String) 2 failed"); + assertEquals(0L, NumberUtils.toLong("1L"), "toLong(String) 3 failed"); + assertEquals(0L, NumberUtils.toLong("1l"), "toLong(String) 4 failed"); + assertEquals(NumberUtils.toLong(Long.MAX_VALUE + ""), Long.MAX_VALUE, "toLong(Long.MAX_VALUE) failed"); + assertEquals(NumberUtils.toLong(Long.MIN_VALUE + ""), Long.MIN_VALUE, "toLong(Long.MIN_VALUE) failed"); + assertEquals(0L, NumberUtils.toLong(""), "toLong(empty) failed"); + assertEquals(0L, NumberUtils.toLong(null), "toLong(null) failed"); + } + + /** + * Test for {@link NumberUtils#toLong(String, long)}. + */ + @Test + public void testToLongStringL() { + assertEquals(12345L, NumberUtils.toLong("12345", 5L), "toLong(String, long) 1 failed"); + assertEquals(5L, NumberUtils.toLong("1234.5", 5L), "toLong(String, long) 2 failed"); + } + + /** + * Test for {@link NumberUtils#toScaledBigDecimal(BigDecimal)}. + */ + @Test + public void testToScaledBigDecimalBigDecimal() { + assertEquals(NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(123.456)), BigDecimal.valueOf(123.46), + "toScaledBigDecimal(BigDecimal) 1 failed"); + // Test RoudingMode.HALF_EVEN default rounding. + assertEquals(NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(23.515)), BigDecimal.valueOf(23.52), + "toScaledBigDecimal(BigDecimal) 2 failed"); + assertEquals(NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(23.525)), BigDecimal.valueOf(23.52), + "toScaledBigDecimal(BigDecimal) 3 failed"); + assertEquals("2352.00", + NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(23.525)).multiply(BigDecimal.valueOf(100)).toString(), + "toScaledBigDecimal(BigDecimal) 4 failed"); + assertEquals(NumberUtils.toScaledBigDecimal((BigDecimal) null), BigDecimal.ZERO, + "toScaledBigDecimal(BigDecimal) 5 failed"); + } + + /** + * Test for {@link NumberUtils#toScaledBigDecimal(BigDecimal, int, RoundingMode)}. + */ + @Test + public void testToScaledBigDecimalBigDecimalIRM() { + assertEquals(NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(123.456), 1, RoundingMode.CEILING), + BigDecimal.valueOf(123.5), "toScaledBigDecimal(BigDecimal, int, RoudingMode) 1 failed"); + assertEquals(NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(23.5159), 3, RoundingMode.FLOOR), + BigDecimal.valueOf(23.515), "toScaledBigDecimal(BigDecimal, int, RoudingMode) 2 failed"); + assertEquals(NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(23.525), 2, RoundingMode.HALF_UP), + BigDecimal.valueOf(23.53), "toScaledBigDecimal(BigDecimal, int, RoudingMode) 3 failed"); + assertEquals("23521.0000", + NumberUtils.toScaledBigDecimal(BigDecimal.valueOf(23.521), 4, RoundingMode.HALF_EVEN) + .multiply(BigDecimal.valueOf(1000)).toString(), + "toScaledBigDecimal(BigDecimal, int, RoudingMode) 4 failed"); + assertEquals(NumberUtils.toScaledBigDecimal((BigDecimal) null, 2, RoundingMode.HALF_UP), BigDecimal.ZERO, + "toScaledBigDecimal(BigDecimal, int, RoudingMode) 5 failed"); + } + + /** + * Test for {@link NumberUtils#toScaledBigDecimal(Double)}. + */ + @Test + public void testToScaledBigDecimalDouble() { + assertEquals(NumberUtils.toScaledBigDecimal(Double.valueOf(123.456d)), BigDecimal.valueOf(123.46), + "toScaledBigDecimal(Double) 1 failed"); + // Test RoudingMode.HALF_EVEN default rounding. + assertEquals(NumberUtils.toScaledBigDecimal(Double.valueOf(23.515d)), BigDecimal.valueOf(23.52), + "toScaledBigDecimal(Double) 2 failed"); + assertEquals(NumberUtils.toScaledBigDecimal(Double.valueOf(23.525d)), BigDecimal.valueOf(23.52), + "toScaledBigDecimal(Double) 3 failed"); + assertEquals("2352.00", + NumberUtils.toScaledBigDecimal(Double.valueOf(23.525d)).multiply(BigDecimal.valueOf(100)).toString(), + "toScaledBigDecimal(Double) 4 failed"); + assertEquals(NumberUtils.toScaledBigDecimal((Double) null), BigDecimal.ZERO, + "toScaledBigDecimal(Double) 5 failed"); + } + + /** + * Test for {@link NumberUtils#toScaledBigDecimal(Double, int, RoundingMode)}. + */ + @Test + public void testToScaledBigDecimalDoubleIRM() { + assertEquals(NumberUtils.toScaledBigDecimal(Double.valueOf(123.456d), 1, RoundingMode.CEILING), + BigDecimal.valueOf(123.5), "toScaledBigDecimal(Double, int, RoudingMode) 1 failed"); + assertEquals(NumberUtils.toScaledBigDecimal(Double.valueOf(23.5159d), 3, RoundingMode.FLOOR), + BigDecimal.valueOf(23.515), "toScaledBigDecimal(Double, int, RoudingMode) 2 failed"); + assertEquals(NumberUtils.toScaledBigDecimal(Double.valueOf(23.525d), 2, RoundingMode.HALF_UP), + BigDecimal.valueOf(23.53), "toScaledBigDecimal(Double, int, RoudingMode) 3 failed"); + assertEquals("23521.0000", + NumberUtils.toScaledBigDecimal(Double.valueOf(23.521d), 4, RoundingMode.HALF_EVEN) + .multiply(BigDecimal.valueOf(1000)).toString(), + "toScaledBigDecimal(Double, int, RoudingMode) 4 failed"); + assertEquals(NumberUtils.toScaledBigDecimal((Double) null, 2, RoundingMode.HALF_UP), BigDecimal.ZERO, + "toScaledBigDecimal(Double, int, RoudingMode) 5 failed"); + } + + /** + * Test for {@link NumberUtils#toScaledBigDecimal(Float)}. + */ + @Test + public void testToScaledBigDecimalFloat() { + assertEquals(NumberUtils.toScaledBigDecimal(Float.valueOf(123.456f)), BigDecimal.valueOf(123.46), + "toScaledBigDecimal(Float) 1 failed"); + // Test RoudingMode.HALF_EVEN default rounding. + assertEquals(NumberUtils.toScaledBigDecimal(Float.valueOf(23.515f)), BigDecimal.valueOf(23.51), + "toScaledBigDecimal(Float) 2 failed"); + // Note. NumberUtils.toScaledBigDecimal(Float.valueOf(23.515f)).equals(BigDecimal.valueOf(23.51)) + // because of roundoff error. It is ok. + assertEquals(NumberUtils.toScaledBigDecimal(Float.valueOf(23.525f)), BigDecimal.valueOf(23.52), + "toScaledBigDecimal(Float) 3 failed"); + assertEquals("2352.00", + NumberUtils.toScaledBigDecimal(Float.valueOf(23.525f)).multiply(BigDecimal.valueOf(100)).toString(), + "toScaledBigDecimal(Float) 4 failed"); + assertEquals(NumberUtils.toScaledBigDecimal((Float) null), BigDecimal.ZERO, + "toScaledBigDecimal(Float) 5 failed"); + } + + /** + * Test for {@link NumberUtils#toScaledBigDecimal(Float, int, RoundingMode)}. + */ + @Test + public void testToScaledBigDecimalFloatIRM() { + assertEquals(NumberUtils.toScaledBigDecimal(Float.valueOf(123.456f), 1, RoundingMode.CEILING), + BigDecimal.valueOf(123.5), "toScaledBigDecimal(Float, int, RoudingMode) 1 failed"); + assertEquals(NumberUtils.toScaledBigDecimal(Float.valueOf(23.5159f), 3, RoundingMode.FLOOR), + BigDecimal.valueOf(23.515), "toScaledBigDecimal(Float, int, RoudingMode) 2 failed"); + // The following happens due to roundoff error. We're ok with this. + assertEquals(NumberUtils.toScaledBigDecimal(Float.valueOf(23.525f), 2, RoundingMode.HALF_UP), + BigDecimal.valueOf(23.52), "toScaledBigDecimal(Float, int, RoudingMode) 3 failed"); + assertEquals("23521.0000", NumberUtils.toScaledBigDecimal(Float.valueOf(23.521f), 4, RoundingMode.HALF_EVEN) + .multiply(BigDecimal.valueOf(1000)).toString(), "toScaledBigDecimal(Float, int, RoudingMode) 4 failed"); + assertEquals(NumberUtils.toScaledBigDecimal((Float) null, 2, RoundingMode.HALF_UP), BigDecimal.ZERO, + "toScaledBigDecimal(Float, int, RoudingMode) 5 failed"); + } + + /** + * Test for {@link NumberUtils#toScaledBigDecimal(Double)}. + */ + @Test + public void testToScaledBigDecimalString() { + assertEquals(NumberUtils.toScaledBigDecimal("123.456"), BigDecimal.valueOf(123.46), + "toScaledBigDecimal(String) 1 failed"); + // Test RoudingMode.HALF_EVEN default rounding. + assertEquals(NumberUtils.toScaledBigDecimal("23.515"), BigDecimal.valueOf(23.52), + "toScaledBigDecimal(String) 2 failed"); + assertEquals(NumberUtils.toScaledBigDecimal("23.525"), BigDecimal.valueOf(23.52), + "toScaledBigDecimal(String) 3 failed"); + assertEquals("2352.00", NumberUtils.toScaledBigDecimal("23.525").multiply(BigDecimal.valueOf(100)).toString(), + "toScaledBigDecimal(String) 4 failed"); + assertEquals(NumberUtils.toScaledBigDecimal((String) null), BigDecimal.ZERO, + "toScaledBigDecimal(String) 5 failed"); + } + + /** + * Test for {@link NumberUtils#toScaledBigDecimal(Double, int, RoundingMode)}. + */ + @Test + public void testToScaledBigDecimalStringIRM() { + assertEquals(NumberUtils.toScaledBigDecimal("123.456", 1, RoundingMode.CEILING), BigDecimal.valueOf(123.5), + "toScaledBigDecimal(String, int, RoudingMode) 1 failed"); + assertEquals(NumberUtils.toScaledBigDecimal("23.5159", 3, RoundingMode.FLOOR), BigDecimal.valueOf(23.515), + "toScaledBigDecimal(String, int, RoudingMode) 2 failed"); + assertEquals(NumberUtils.toScaledBigDecimal("23.525", 2, RoundingMode.HALF_UP), BigDecimal.valueOf(23.53), + "toScaledBigDecimal(String, int, RoudingMode) 3 failed"); + assertEquals( + "23521.0000", NumberUtils.toScaledBigDecimal("23.521", 4, RoundingMode.HALF_EVEN) + .multiply(BigDecimal.valueOf(1000)).toString(), + "toScaledBigDecimal(String, int, RoudingMode) 4 failed"); + assertEquals(NumberUtils.toScaledBigDecimal((String) null, 2, RoundingMode.HALF_UP), BigDecimal.ZERO, + "toScaledBigDecimal(String, int, RoudingMode) 5 failed"); + } + + /** + * Test for {@link NumberUtils#toShort(String)}. + */ + @Test + public void testToShortString() { + assertEquals(12345, NumberUtils.toShort("12345"), "toShort(String) 1 failed"); + assertEquals(0, NumberUtils.toShort("abc"), "toShort(String) 2 failed"); + assertEquals(0, NumberUtils.toShort(""), "toShort(empty) failed"); + assertEquals(0, NumberUtils.toShort(null), "toShort(null) failed"); + } + + /** + * Test for {@link NumberUtils#toShort(String, short)}. + */ + @Test + public void testToShortStringI() { + assertEquals(12345, NumberUtils.toShort("12345", (short) 5), "toShort(String, short) 1 failed"); + assertEquals(5, NumberUtils.toShort("1234.5", (short) 5), "toShort(String, short) 2 failed"); } }