/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.test.bridge; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.lang.reflect.Modifier; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import org.junit.Test; import org.junit.experimental.categories.Category; import org.hibernate.search.bridge.TwoWayFieldBridge; import org.hibernate.search.bridge.builtin.NumericFieldBridge; import org.hibernate.search.testsupport.TestForIssue; import org.hibernate.search.testsupport.junit.SkipOnElasticsearch; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * @author Hardy Ferentschik */ @TestForIssue(jiraKey = "HSEARCH-1744") @Category(SkipOnElasticsearch.class) // There's no need to re-execute this test with Elasticsearch, and it fails anyway due to the filesystem magic in #getClasses public class TwoWayFieldBridgeTest { @Test public void testTwoWayFieldBridgeCanHandleNullInObjectToString() throws Exception { List<Class<?>> classes = getClasses( "org.hibernate.search.bridge.builtin" ); assertTrue( "Guarding against a package refactoring", classes.size() > 0 ); for ( Class<?> clazz : classes ) { // not interested in abstract classes if ( Modifier.isAbstract( clazz.getModifiers() ) ) { continue; } // neither in non TwoWayFieldBridge if ( !TwoWayFieldBridge.class.isAssignableFrom( clazz ) ) { continue; } // the NumericFieldBridge is an emum (go figure) - we need special massaging here if ( Enum.class.isAssignableFrom( clazz ) ) { assertTrue( "Unexpected enum class" + clazz, NumericFieldBridge.class.isAssignableFrom( clazz ) ); Class<?> enclosingClass = clazz.getEnclosingClass(); if ( enclosingClass != null ) { for ( Object o : enclosingClass.getEnumConstants() ) { TwoWayFieldBridge bridge = (TwoWayFieldBridge) o; assertEquals( "All TwoWayFieldBridgeTest should return 'null' for 'null' passed to 'objectToString", null, bridge.objectToString( null ) ); } } } else { TwoWayFieldBridge bridge = (TwoWayFieldBridge) clazz.newInstance(); assertEquals( "All TwoWayFieldBridgeTest should return 'null' for 'null' passed to 'objectToString", null, bridge.objectToString( null ) ); } } } private List<Class<?>> getClasses(String packageName) throws ClassNotFoundException, IOException { String path = packageName.replace( '.', '/' ); Enumeration<URL> resources = TwoWayFieldBridgeTest.class.getClassLoader().getResources( path ); List<File> directories = new ArrayList<>(); while ( resources.hasMoreElements() ) { URL resource = resources.nextElement(); directories.add( new File( resource.getFile() ) ); } ArrayList<Class<?>> classes = new ArrayList<>(); for ( File directory : directories ) { for ( String classFileName : directory.list( new ClassFilenameFilter() ) ) { classes.add( Class.forName( packageName + '.' + classFileName.substring( 0, classFileName.length() - 6 ) ) ); } } return classes; } public static class ClassFilenameFilter implements FilenameFilter { @Override public boolean accept(File dir, String name) { return name.endsWith( ".class" ); } } }