/* * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.util; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; import java.io.IOException; import java.sql.SQLException; import junit.framework.TestCase; import org.springframework.android.test.Assert; import android.util.AndroidRuntimeException; /** * @author Rod Johnson * @author Juergen Hoeller * @author Rick Evans * @author Roy Clarkson */ public class ObjectUtilsTests extends TestCase { public void testIsCheckedException() { assertTrue(ObjectUtils.isCheckedException(new Exception())); assertTrue(ObjectUtils.isCheckedException(new SQLException())); assertFalse(ObjectUtils.isCheckedException(new RuntimeException())); assertFalse(ObjectUtils.isCheckedException(new AndroidRuntimeException())); // Any Throwable other than RuntimeException and Error // has to be considered checked according to the JLS. assertTrue(ObjectUtils.isCheckedException(new Throwable())); } public void testIsCompatibleWithThrowsClause() { Class<?>[] empty = new Class[0]; Class<?>[] exception = new Class[] { Exception.class }; Class<?>[] sqlAndIO = new Class[] { SQLException.class, IOException.class }; Class<?>[] throwable = new Class[] { Throwable.class }; assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new RuntimeException())); assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new RuntimeException(), empty)); assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new RuntimeException(), exception)); assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new RuntimeException(), sqlAndIO)); assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new RuntimeException(), throwable)); assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Exception())); assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Exception(), empty)); assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new Exception(), exception)); assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Exception(), sqlAndIO)); assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new Exception(), throwable)); assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new SQLException())); assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new SQLException(), empty)); assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new SQLException(), exception)); assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new SQLException(), sqlAndIO)); assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new SQLException(), throwable)); assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Throwable())); assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Throwable(), empty)); assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Throwable(), exception)); assertFalse(ObjectUtils.isCompatibleWithThrowsClause(new Throwable(), sqlAndIO)); assertTrue(ObjectUtils.isCompatibleWithThrowsClause(new Throwable(), throwable)); } public void testToObjectArray() { int[] a = new int[] { 1, 2, 3, 4, 5 }; Integer[] wrapper = (Integer[]) ObjectUtils.toObjectArray(a); assertTrue(wrapper.length == 5); for (int i = 0; i < wrapper.length; i++) { assertEquals(a[i], wrapper[i].intValue()); } } public void testToObjectArrayWithNull() { Object[] objects = ObjectUtils.toObjectArray(null); assertNotNull(objects); assertEquals(0, objects.length); } public void testToObjectArrayWithEmptyPrimitiveArray() { Object[] objects = ObjectUtils.toObjectArray(new byte[] {}); assertNotNull(objects); assertEquals(0, objects.length); } public void testToObjectArrayWithNonArrayType() { try { ObjectUtils.toObjectArray("Not an []"); fail("Must have thrown an IllegalArgumentException by this point."); } catch (IllegalArgumentException expected) { } } public void testToObjectArrayWithNonPrimitiveArray() { String[] source = new String[] { "Bingo" }; Assert.assertArrayEquals(source, ObjectUtils.toObjectArray(source)); } public void testAddObjectToArraySunnyDay() { String[] array = new String[] { "foo", "bar" }; String newElement = "baz"; Object[] newArray = ObjectUtils.addObjectToArray(array, newElement); assertEquals(3, newArray.length); assertEquals(newElement, newArray[2]); } public void testAddObjectToArrayWhenEmpty() { String[] array = new String[0]; String newElement = "foo"; String[] newArray = ObjectUtils.addObjectToArray(array, newElement); assertEquals(1, newArray.length); assertEquals(newElement, newArray[0]); } public void testAddObjectToSingleNonNullElementArray() { String existingElement = "foo"; String[] array = new String[] { existingElement }; String newElement = "bar"; String[] newArray = ObjectUtils.addObjectToArray(array, newElement); assertEquals(2, newArray.length); assertEquals(existingElement, newArray[0]); assertEquals(newElement, newArray[1]); } public void testAddObjectToSingleNullElementArray() { String[] array = new String[] { null }; String newElement = "bar"; String[] newArray = ObjectUtils.addObjectToArray(array, newElement); assertEquals(2, newArray.length); assertEquals(null, newArray[0]); assertEquals(newElement, newArray[1]); } public void testAddObjectToNullArray() throws Exception { String newElement = "foo"; String[] newArray = ObjectUtils.addObjectToArray(null, newElement); assertEquals(1, newArray.length); assertEquals(newElement, newArray[0]); } public void testAddNullObjectToNullArray() throws Exception { Object[] newArray = ObjectUtils.addObjectToArray(null, null); assertEquals(1, newArray.length); assertEquals(null, newArray[0]); } public void testNullSafeEqualsWithArrays() throws Exception { assertTrue(ObjectUtils.nullSafeEquals(new String[] { "a", "b", "c" }, new String[] { "a", "b", "c" })); assertTrue(ObjectUtils.nullSafeEquals(new int[] { 1, 2, 3 }, new int[] { 1, 2, 3 })); } public void testHashCodeWithBooleanFalse() { int expected = Boolean.FALSE.hashCode(); assertEquals(expected, ObjectUtils.hashCode(false)); } public void testHashCodeWithBooleanTrue() { int expected = Boolean.TRUE.hashCode(); assertEquals(expected, ObjectUtils.hashCode(true)); } public void testHashCodeWithDouble() { double dbl = 9830.43; int expected = (new Double(dbl)).hashCode(); assertEquals(expected, ObjectUtils.hashCode(dbl)); } public void testHashCodeWithFloat() { float flt = 34.8f; int expected = (new Float(flt)).hashCode(); assertEquals(expected, ObjectUtils.hashCode(flt)); } public void testHashCodeWithLong() { long lng = 883l; int expected = (new Long(lng)).hashCode(); assertEquals(expected, ObjectUtils.hashCode(lng)); } public void testIdentityToString() { Object obj = new Object(); String expected = obj.getClass().getName() + "@" + ObjectUtils.getIdentityHexString(obj); String actual = ObjectUtils.identityToString(obj); assertEquals(expected, actual); } public void testIdentityToStringWithNullObject() { assertEquals("", ObjectUtils.identityToString(null)); } public void testIsArrayOfPrimitivesWithBooleanArray() { assertTrue(ClassUtils.isPrimitiveArray(boolean[].class)); } public void testIsArrayOfPrimitivesWithObjectArray() { assertFalse(ClassUtils.isPrimitiveArray(Object[].class)); } public void testIsArrayOfPrimitivesWithNonArray() { assertFalse(ClassUtils.isPrimitiveArray(String.class)); } public void testIsPrimitiveOrWrapperWithBooleanPrimitiveClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(boolean.class)); } public void testIsPrimitiveOrWrapperWithBooleanWrapperClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(Boolean.class)); } public void testIsPrimitiveOrWrapperWithBytePrimitiveClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(byte.class)); } public void testIsPrimitiveOrWrapperWithByteWrapperClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(Byte.class)); } public void testIsPrimitiveOrWrapperWithCharacterClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(Character.class)); } public void testIsPrimitiveOrWrapperWithCharClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(char.class)); } public void testIsPrimitiveOrWrapperWithDoublePrimitiveClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(double.class)); } public void testIsPrimitiveOrWrapperWithDoubleWrapperClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(Double.class)); } public void testIsPrimitiveOrWrapperWithFloatPrimitiveClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(float.class)); } public void testIsPrimitiveOrWrapperWithFloatWrapperClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(Float.class)); } public void testIsPrimitiveOrWrapperWithIntClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(int.class)); } public void testIsPrimitiveOrWrapperWithIntegerClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(Integer.class)); } public void testIsPrimitiveOrWrapperWithLongPrimitiveClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(long.class)); } public void testIsPrimitiveOrWrapperWithLongWrapperClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(Long.class)); } public void testIsPrimitiveOrWrapperWithNonPrimitiveOrWrapperClass() { assertFalse(ClassUtils.isPrimitiveOrWrapper(Object.class)); } public void testIsPrimitiveOrWrapperWithShortPrimitiveClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(short.class)); } public void testIsPrimitiveOrWrapperWithShortWrapperClass() { assertTrue(ClassUtils.isPrimitiveOrWrapper(Short.class)); } public void testNullSafeHashCodeWithBooleanArray() { int expected = 31 * 7 + Boolean.TRUE.hashCode(); expected = 31 * expected + Boolean.FALSE.hashCode(); boolean[] array = { true, false }; int actual = ObjectUtils.nullSafeHashCode(array); assertEquals(expected, actual); } public void testNullSafeHashCodeWithBooleanArrayEqualToNull() { assertEquals(0, ObjectUtils.nullSafeHashCode((boolean[]) null)); } public void testNullSafeHashCodeWithByteArray() { int expected = 31 * 7 + 8; expected = 31 * expected + 10; byte[] array = { 8, 10 }; int actual = ObjectUtils.nullSafeHashCode(array); assertEquals(expected, actual); } public void testNullSafeHashCodeWithByteArrayEqualToNull() { assertEquals(0, ObjectUtils.nullSafeHashCode((byte[]) null)); } public void testNullSafeHashCodeWithCharArray() { int expected = 31 * 7 + 'a'; expected = 31 * expected + 'E'; char[] array = { 'a', 'E' }; int actual = ObjectUtils.nullSafeHashCode(array); assertEquals(expected, actual); } public void testNullSafeHashCodeWithCharArrayEqualToNull() { assertEquals(0, ObjectUtils.nullSafeHashCode((char[]) null)); } public void testNullSafeHashCodeWithDoubleArray() { long bits = Double.doubleToLongBits(8449.65); int expected = 31 * 7 + (int) (bits ^ (bits >>> 32)); bits = Double.doubleToLongBits(9944.923); expected = 31 * expected + (int) (bits ^ (bits >>> 32)); double[] array = { 8449.65, 9944.923 }; int actual = ObjectUtils.nullSafeHashCode(array); assertEquals(expected, actual); } public void testNullSafeHashCodeWithDoubleArrayEqualToNull() { assertEquals(0, ObjectUtils.nullSafeHashCode((double[]) null)); } public void testNullSafeHashCodeWithFloatArray() { int expected = 31 * 7 + Float.floatToIntBits(9.6f); expected = 31 * expected + Float.floatToIntBits(7.4f); float[] array = { 9.6f, 7.4f }; int actual = ObjectUtils.nullSafeHashCode(array); assertEquals(expected, actual); } public void testNullSafeHashCodeWithFloatArrayEqualToNull() { assertEquals(0, ObjectUtils.nullSafeHashCode((float[]) null)); } public void testNullSafeHashCodeWithIntArray() { int expected = 31 * 7 + 884; expected = 31 * expected + 340; int[] array = { 884, 340 }; int actual = ObjectUtils.nullSafeHashCode(array); assertEquals(expected, actual); } public void testNullSafeHashCodeWithIntArrayEqualToNull() { assertEquals(0, ObjectUtils.nullSafeHashCode((int[]) null)); } public void testNullSafeHashCodeWithLongArray() { long lng = 7993l; int expected = 31 * 7 + (int) (lng ^ (lng >>> 32)); lng = 84320l; expected = 31 * expected + (int) (lng ^ (lng >>> 32)); long[] array = { 7993l, 84320l }; int actual = ObjectUtils.nullSafeHashCode(array); assertEquals(expected, actual); } public void testNullSafeHashCodeWithLongArrayEqualToNull() { assertEquals(0, ObjectUtils.nullSafeHashCode((long[]) null)); } public void testNullSafeHashCodeWithObject() { String str = "Luke"; assertEquals(str.hashCode(), ObjectUtils.nullSafeHashCode(str)); } public void testNullSafeHashCodeWithObjectArray() { int expected = 31 * 7 + "Leia".hashCode(); expected = 31 * expected + "Han".hashCode(); Object[] array = { "Leia", "Han" }; int actual = ObjectUtils.nullSafeHashCode(array); assertEquals(expected, actual); } public void testNullSafeHashCodeWithObjectArrayEqualToNull() { assertEquals(0, ObjectUtils.nullSafeHashCode((Object[]) null)); } public void testNullSafeHashCodeWithObjectBeingBooleanArray() { Object array = new boolean[] { true, false }; int expected = ObjectUtils.nullSafeHashCode((boolean[]) array); assertEqualHashCodes(expected, array); } public void testNullSafeHashCodeWithObjectBeingByteArray() { Object array = new byte[] { 6, 39 }; int expected = ObjectUtils.nullSafeHashCode((byte[]) array); assertEqualHashCodes(expected, array); } public void testNullSafeHashCodeWithObjectBeingCharArray() { Object array = new char[] { 'l', 'M' }; int expected = ObjectUtils.nullSafeHashCode((char[]) array); assertEqualHashCodes(expected, array); } public void testNullSafeHashCodeWithObjectBeingDoubleArray() { Object array = new double[] { 68930.993, 9022.009 }; int expected = ObjectUtils.nullSafeHashCode((double[]) array); assertEqualHashCodes(expected, array); } public void testNullSafeHashCodeWithObjectBeingFloatArray() { Object array = new float[] { 9.9f, 9.54f }; int expected = ObjectUtils.nullSafeHashCode((float[]) array); assertEqualHashCodes(expected, array); } public void testNullSafeHashCodeWithObjectBeingIntArray() { Object array = new int[] { 89, 32 }; int expected = ObjectUtils.nullSafeHashCode((int[]) array); assertEqualHashCodes(expected, array); } public void testNullSafeHashCodeWithObjectBeingLongArray() { Object array = new long[] { 4389, 320 }; int expected = ObjectUtils.nullSafeHashCode((long[]) array); assertEqualHashCodes(expected, array); } public void testNullSafeHashCodeWithObjectBeingObjectArray() { Object array = new Object[] { "Luke", "Anakin" }; int expected = ObjectUtils.nullSafeHashCode((Object[]) array); assertEqualHashCodes(expected, array); } public void testNullSafeHashCodeWithObjectBeingShortArray() { Object array = new short[] { 5, 3 }; int expected = ObjectUtils.nullSafeHashCode((short[]) array); assertEqualHashCodes(expected, array); } public void testNullSafeHashCodeWithObjectEqualToNull() { assertEquals(0, ObjectUtils.nullSafeHashCode((Object) null)); } public void testNullSafeHashCodeWithShortArray() { int expected = 31 * 7 + 70; expected = 31 * expected + 8; short[] array = { 70, 8 }; int actual = ObjectUtils.nullSafeHashCode(array); assertEquals(expected, actual); } public void testNullSafeHashCodeWithShortArrayEqualToNull() { assertEquals(0, ObjectUtils.nullSafeHashCode((short[]) null)); } public void testNullSafeToStringWithBooleanArray() { boolean[] array = { true, false }; assertEquals("{true, false}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithBooleanArrayBeingEmpty() { boolean[] array = {}; assertEquals("{}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithBooleanArrayEqualToNull() { assertEquals("null", ObjectUtils.nullSafeToString((boolean[]) null)); } public void testNullSafeToStringWithByteArray() { byte[] array = { 5, 8 }; assertEquals("{5, 8}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithByteArrayBeingEmpty() { byte[] array = {}; assertEquals("{}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithByteArrayEqualToNull() { assertEquals("null", ObjectUtils.nullSafeToString((byte[]) null)); } public void testNullSafeToStringWithCharArray() { char[] array = { 'A', 'B' }; assertEquals("{'A', 'B'}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithCharArrayBeingEmpty() { char[] array = {}; assertEquals("{}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithCharArrayEqualToNull() { assertEquals("null", ObjectUtils.nullSafeToString((char[]) null)); } public void testNullSafeToStringWithDoubleArray() { double[] array = { 8594.93, 8594023.95 }; assertEquals("{8594.93, 8594023.95}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithDoubleArrayBeingEmpty() { double[] array = {}; assertEquals("{}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithDoubleArrayEqualToNull() { assertEquals("null", ObjectUtils.nullSafeToString((double[]) null)); } public void testNullSafeToStringWithFloatArray() { float[] array = { 8.6f, 43.8f }; assertEquals("{8.6, 43.8}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithFloatArrayBeingEmpty() { float[] array = {}; assertEquals("{}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithFloatArrayEqualToNull() { assertEquals("null", ObjectUtils.nullSafeToString((float[]) null)); } public void testNullSafeToStringWithIntArray() { int[] array = { 9, 64 }; assertEquals("{9, 64}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithIntArrayBeingEmpty() { int[] array = {}; assertEquals("{}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithIntArrayEqualToNull() { assertEquals("null", ObjectUtils.nullSafeToString((int[]) null)); } public void testNullSafeToStringWithLongArray() { long[] array = { 434l, 23423l }; assertEquals("{434, 23423}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithLongArrayBeingEmpty() { long[] array = {}; assertEquals("{}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithLongArrayEqualToNull() { assertEquals("null", ObjectUtils.nullSafeToString((long[]) null)); } public void testNullSafeToStringWithPlainOldString() { assertEquals("I shoh love tha taste of mangoes", ObjectUtils.nullSafeToString("I shoh love tha taste of mangoes")); } public void testNullSafeToStringWithObjectArray() { Object[] array = { "Han", new Long(43) }; assertEquals("{Han, 43}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithObjectArrayBeingEmpty() { Object[] array = {}; assertEquals("{}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithObjectArrayEqualToNull() { assertEquals("null", ObjectUtils.nullSafeToString((Object[]) null)); } public void testNullSafeToStringWithShortArray() { short[] array = { 7, 9 }; assertEquals("{7, 9}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithShortArrayBeingEmpty() { short[] array = {}; assertEquals("{}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithShortArrayEqualToNull() { assertEquals("null", ObjectUtils.nullSafeToString((short[]) null)); } public void testNullSafeToStringWithStringArray() { String[] array = { "Luke", "Anakin" }; assertEquals("{Luke, Anakin}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithStringArrayBeingEmpty() { String[] array = {}; assertEquals("{}", ObjectUtils.nullSafeToString(array)); } public void testNullSafeToStringWithStringArrayEqualToNull() { assertEquals("null", ObjectUtils.nullSafeToString((String[]) null)); } public void testContainsConstant() { assertThat(ObjectUtils.containsConstant(Tropes.values(), "FOO"), is(true)); assertThat(ObjectUtils.containsConstant(Tropes.values(), "foo"), is(true)); assertThat(ObjectUtils.containsConstant(Tropes.values(), "BaR"), is(true)); assertThat(ObjectUtils.containsConstant(Tropes.values(), "bar"), is(true)); assertThat(ObjectUtils.containsConstant(Tropes.values(), "BAZ"), is(true)); assertThat(ObjectUtils.containsConstant(Tropes.values(), "baz"), is(true)); assertThat(ObjectUtils.containsConstant(Tropes.values(), "BOGUS"), is(false)); assertThat(ObjectUtils.containsConstant(Tropes.values(), "FOO", true), is(true)); assertThat(ObjectUtils.containsConstant(Tropes.values(), "foo", true), is(false)); } public void testCaseInsensitiveValueOf() { assertThat(ObjectUtils.caseInsensitiveValueOf(Tropes.values(), "foo"), is(Tropes.FOO)); assertThat(ObjectUtils.caseInsensitiveValueOf(Tropes.values(), "BAR"), is(Tropes.BAR)); try { ObjectUtils.caseInsensitiveValueOf(Tropes.values(), "bogus"); fail("expected IllegalArgumentException"); } catch (IllegalArgumentException ex) { assertThat(ex.getMessage(), is("constant [bogus] does not exist in enum type " + "org.springframework.util.ObjectUtilsTests$Tropes")); } } private void assertEqualHashCodes(int expected, Object array) { int actual = ObjectUtils.nullSafeHashCode(array); assertEquals(expected, actual); assertTrue(array.hashCode() != actual); } enum Tropes { FOO, BAR, baz } }