/* * Hibernate Validator, declare and validate application constraints * * License: Apache License, Version 2.0 * See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>. */ package org.hibernate.validator.test.internal.util; import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeSet; import org.hibernate.validator.internal.util.ReflectionHelper; import org.hibernate.validator.testutil.TestForIssue; import org.testng.annotations.Test; /** * Tests for the {@code ReflectionHelper}. * * @author Hardy Ferentschik * @author Guillaume Smet */ public class ReflectionHelperTest { @Test public void testIsIterable() throws Exception { Type type = TestTypes.class.getField( "stringList" ).getGenericType(); assertTrue( ReflectionHelper.isIterable( type ) ); assertTrue( ReflectionHelper.isIterable( TreeSet.class ) ); assertTrue( ReflectionHelper.isIterable( List.class ) ); assertTrue( ReflectionHelper.isIterable( HashSet.class ) ); assertTrue( ReflectionHelper.isIterable( Iterable.class ) ); assertTrue( ReflectionHelper.isIterable( Collection.class ) ); assertFalse( ReflectionHelper.isIterable( null ) ); assertFalse( ReflectionHelper.isIterable( Object.class ) ); } @Test public void testIsCollection() throws Exception { assertTrue( ReflectionHelper.isCollection( Iterable.class ) ); assertTrue( ReflectionHelper.isCollection( Collection.class ) ); assertTrue( ReflectionHelper.isCollection( List.class ) ); Type type = TestTypes.class.getField( "stringList" ).getGenericType(); assertTrue( ReflectionHelper.isCollection( type ) ); assertTrue( ReflectionHelper.isCollection( TreeSet.class ) ); assertTrue( ReflectionHelper.isCollection( HashSet.class ) ); type = TestTypes.class.getField( "floatSet" ).getGenericType(); assertTrue( ReflectionHelper.isCollection( type ) ); assertTrue( ReflectionHelper.isCollection( Map.class ) ); assertTrue( ReflectionHelper.isCollection( SortedMap.class ) ); type = TestTypes.class.getField( "objectMap" ).getGenericType(); assertTrue( ReflectionHelper.isCollection( type ) ); assertTrue( ReflectionHelper.isCollection( int[].class ) ); assertTrue( ReflectionHelper.isCollection( String[].class ) ); type = TestTypes.class.getField( "stringArray" ).getGenericType(); assertTrue( ReflectionHelper.isCollection( type ) ); type = TestTypes.class.getField( "intArray" ).getGenericType(); assertTrue( ReflectionHelper.isCollection( type ) ); assertFalse( ReflectionHelper.isCollection( null ) ); assertFalse( ReflectionHelper.isCollection( Object.class ) ); } @Test public void testGetCollectionElementType() throws Exception { Type type = TestTypes.class.getField( "stringList" ).getGenericType(); assertThat( ReflectionHelper.getCollectionElementType( type ) ).isEqualTo( String.class ); type = TestTypes.class.getField( "floatSet" ).getGenericType(); assertThat( ReflectionHelper.getCollectionElementType( type ) ).isEqualTo( Float.class ); type = TestTypes.class.getField( "stringArray" ).getGenericType(); assertThat( ReflectionHelper.getCollectionElementType( type ) ).isEqualTo( String.class ); type = TestTypes.class.getField( "objectMap" ).getGenericType(); assertThat( ReflectionHelper.getCollectionElementType( type ) ).isEqualTo( Object.class ); type = TestTypes.class.getField( "intArray" ).getGenericType(); assertThat( ReflectionHelper.getCollectionElementType( type ) ).isEqualTo( int.class ); } @Test public void testIsMap() throws Exception { assertTrue( ReflectionHelper.isMap( Map.class ) ); assertTrue( ReflectionHelper.isMap( SortedMap.class ) ); Type type = TestTypes.class.getField( "objectMap" ).getGenericType(); assertTrue( ReflectionHelper.isMap( type ) ); assertFalse( ReflectionHelper.isMap( null ) ); assertFalse( ReflectionHelper.isMap( Object.class ) ); } @Test public void testGetIndexedValueForMap() { Map<String, Object> map = new HashMap<String, Object>(); Object testObject = new Object(); String key = "key"; map.put( key, testObject ); Object value = ReflectionHelper.getMappedValue( map, key ); assertEquals( value, testObject, "We should be able to retrieve the indexed object" ); value = ReflectionHelper.getMappedValue( map, "foo" ); assertNull( value, "A non existent index should return the null value" ); value = ReflectionHelper.getMappedValue( map, "2" ); assertNull( value, "A non existent index should return the null value" ); } @Test public void testGetIndexedValueForList() { List<Object> list = new ArrayList<Object>(); Object testObject = new Object(); list.add( testObject ); Object value = ReflectionHelper.getIndexedValue( list, 0 ); assertEquals( value, testObject, "We should be able to retrieve the indexed object" ); value = ReflectionHelper.getIndexedValue( list, 2 ); assertNull( value, "A non existent index should return the null value" ); } @Test public void testGetIndexedValueForArray() { doTestGetIndexedValueForArray( new String[]{ "value1", "value2" }, "value1", "value2" ); doTestGetIndexedValueForArray( new int[]{ 7, 4 }, 7, 4 ); doTestGetIndexedValueForArray( new long[]{ 7L, 4L }, 7L, 4L ); doTestGetIndexedValueForArray( new double[]{ 7d, 4d }, 7d, 4d ); doTestGetIndexedValueForArray( new float[]{ 7f, 4f }, 7f, 4f ); doTestGetIndexedValueForArray( new short[]{ (short) 7, (short) 4 }, (short) 7, (short) 4 ); doTestGetIndexedValueForArray( new byte[]{ (byte) 7, (byte) 4 }, (byte) 7, (byte) 4 ); doTestGetIndexedValueForArray( new char[]{ (char) 7, (char) 4 }, (char) 7, (char) 4 ); doTestGetIndexedValueForArray( new boolean[]{ true, false }, true, false ); } @Test public void testGetIndexedValueForNull() { Object value = ReflectionHelper.getIndexedValue( null, 0 ); assertNull( value ); } @Test @TestForIssue(jiraKey = "HV-622") public void testIsGetterMethod() throws Exception { Method method = Bar.class.getMethod( "getBar" ); assertTrue( ReflectionHelper.isGetterMethod( method ) ); method = Bar.class.getMethod( "getBar", String.class ); assertFalse( ReflectionHelper.isGetterMethod( method ) ); } private void doTestGetIndexedValueForArray(Object array, Object firstValue, Object secondValue) { Object value = ReflectionHelper.getIndexedValue( array, 0 ); assertEquals( value, firstValue, "We should be able to retrieve the indexed object" ); value = ReflectionHelper.getIndexedValue( array, 1 ); assertEquals( value, secondValue, "We should be able to retrieve the indexed object" ); value = ReflectionHelper.getIndexedValue( array, 2 ); assertNull( value, "A non existent index should return the null value" ); } @SuppressWarnings("unused") private static class TestTypes { public List<String> stringList; public Set<Float> floatSet; public Map<String, Object> objectMap; public String[] stringArray; public int[] intArray; } @SuppressWarnings("unused") private static class Bar { public String getBar() { return null; } public String getBar(String param) { return null; } } }