/** * Copyright 2010 JBoss Inc * * 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.drools.base; import java.util.HashSet; import junit.framework.TestCase; import org.drools.Cheese; import org.drools.FirstClass; import org.drools.SecondClass; /** * @author fburlet * */ public class ClassTypeResolverTest extends TestCase { public void testResolvePrimtiveTypes() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver(new HashSet(), Thread.currentThread().getContextClassLoader()); assertEquals( boolean.class, resolver.resolveType( "boolean" ) ); assertEquals( double.class, resolver.resolveType( "double" ) ); assertEquals( float.class, resolver.resolveType( "float" ) ); assertEquals( int.class, resolver.resolveType( "int" ) ); assertEquals( char.class, resolver.resolveType( "char" ) ); assertEquals( long.class, resolver.resolveType( "long" ) ); assertEquals( byte.class, resolver.resolveType( "byte" ) ); assertEquals( short.class, resolver.resolveType( "short" ) ); } public void testResolveArrayOfPrimitiveTypes() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver(new HashSet(), Thread.currentThread().getContextClassLoader()); assertEquals( boolean[].class, resolver.resolveType( "boolean[]" ) ); assertEquals( double[].class, resolver.resolveType( "double[]" ) ); assertEquals( float[].class, resolver.resolveType( "float[]" ) ); assertEquals( int[].class, resolver.resolveType( "int[]" ) ); assertEquals( char[].class, resolver.resolveType( "char[]" ) ); assertEquals( long[].class, resolver.resolveType( "long[]" ) ); assertEquals( byte[].class, resolver.resolveType( "byte[]" ) ); assertEquals( short[].class, resolver.resolveType( "short[]" ) ); } public void testResolveMultidimensionnalArrayOfPrimitiveTypes() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver(new HashSet(), Thread.currentThread().getContextClassLoader()); assertEquals( int[][].class, resolver.resolveType( "int[][]" ) ); assertEquals( int[][][].class, resolver.resolveType( "int[][][]" ) ); assertEquals( int[][][][].class, resolver.resolveType( "int[][][][]" ) ); } public void testResolveObjectNotFromImport() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver(new HashSet(), Thread.currentThread().getContextClassLoader()); assertEquals( String.class, resolver.resolveType( "String" ) ); assertEquals( String.class, resolver.resolveType( "java.lang.String" ) ); try { assertEquals( Cheese.class, resolver.resolveType( "Cheese" ) ); fail( "Should raise a ClassNotFoundException" ); } catch ( final ClassNotFoundException e ) { // success } assertEquals( Cheese.class, resolver.resolveType( "org.drools.Cheese" ) ); } public void testResolveObjectFromImport() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "org.drools.Cheese" ); resolver.addImport( "org.drools.FirstClass" ); resolver.addImport( "org.drools.FirstClass.AlternativeKey" ); resolver.addImport( "org.drools.SecondClass" ); resolver.addImport( "org.drools.SecondClass.AlternativeKey" ); assertEquals( String.class, resolver.resolveType( "String" ) ); assertEquals( String.class, resolver.resolveType( "java.lang.String" ) ); assertEquals( Cheese.class, resolver.resolveType( "Cheese" ) ); assertEquals( Cheese.class, resolver.resolveType( "org.drools.Cheese" ) ); assertEquals( FirstClass.class, resolver.resolveType( "org.drools.FirstClass" ) ); assertEquals( FirstClass.AlternativeKey.class, resolver.resolveType( "org.drools.FirstClass.AlternativeKey" ) ); assertEquals( SecondClass.class, resolver.resolveType( "org.drools.SecondClass" ) ); assertEquals( SecondClass.AlternativeKey.class, resolver.resolveType( "org.drools.SecondClass.AlternativeKey" ) ); } public void testResolveObjectFromImportNested() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "org.drools.FirstClass" ); assertEquals( FirstClass.AlternativeKey.class, resolver.resolveType( "FirstClass.AlternativeKey" ) ); } public void testResolveFullTypeName() throws Exception { final TypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "org.drools.Cheese" ); resolver.addImport( "org.drools.FirstClass" ); assertEquals("org.drools.Cheese", resolver.getFullTypeName("Cheese")); assertEquals("org.drools.FirstClass", resolver.getFullTypeName("FirstClass")); } public void testResolveObjectFromImportMultipleClassesDifferentPackages() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "org.drools.Cheese" ); assertEquals( String.class, resolver.resolveType( "String" ) ); assertEquals( String.class, resolver.resolveType( "java.lang.String" ) ); assertEquals( Cheese.class, resolver.resolveType( "Cheese" ) ); assertEquals( Cheese.class, resolver.resolveType( "org.drools.Cheese" ) ); } public void testResolveArrayOfObjectsNotFromImport() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver(new HashSet(), Thread.currentThread().getContextClassLoader()); assertEquals( String[].class, resolver.resolveType( "String[]" ) ); assertEquals( String[].class, resolver.resolveType( "java.lang.String[]" ) ); try { assertEquals( Cheese[].class, resolver.resolveType( "Cheese[]" ) ); fail( "Should raise a ClassNotFoundException" ); } catch ( final ClassNotFoundException e ) { // success } assertEquals( Cheese[].class, resolver.resolveType( "org.drools.Cheese[]" ) ); } public void testResolveArrayOfObjectsFromImport() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "org.drools.Cheese" ); assertEquals( String[].class, resolver.resolveType( "String[]" ) ); assertEquals( String[].class, resolver.resolveType( "java.lang.String[]" ) ); assertEquals( Cheese[].class, resolver.resolveType( "Cheese[]" ) ); assertEquals( Cheese[].class, resolver.resolveType( "org.drools.Cheese[]" ) ); } public void testResolveMultidimensionnalArrayOfObjectsNotFromImport() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver(new HashSet(), Thread.currentThread().getContextClassLoader()); assertEquals( String[][].class, resolver.resolveType( "String[][]" ) ); assertEquals( String[][].class, resolver.resolveType( "java.lang.String[][]" ) ); try { assertEquals( Cheese[][].class, resolver.resolveType( "Cheese[][]" ) ); fail( "Should raise a ClassNotFoundException" ); } catch ( final ClassNotFoundException e ) { // success } assertEquals( Cheese[][].class, resolver.resolveType( "org.drools.Cheese[][]" ) ); } public void testResolveMultidimensionnalArrayOfObjectsFromImport() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "org.drools.Cheese" ); assertEquals( String[][].class, resolver.resolveType( "String[][]" ) ); assertEquals( String[][].class, resolver.resolveType( "java.lang.String[][]" ) ); assertEquals( Cheese[][].class, resolver.resolveType( "Cheese[][]" ) ); assertEquals( Cheese[][].class, resolver.resolveType( "org.drools.Cheese[][]" ) ); } public void testDefaultPackageImport() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "Goo" ); try { resolver.resolveType( "Goo" ); fail( "Can't import default namespace classes"); } catch ( ClassNotFoundException e) { // swallow as this should be thrown } } public void testNestedClassResolving() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); // single nesting resolver.addImport( "org.drools.Person.Nested1" ); assertEquals( org.drools.Person.Nested1.class, resolver.resolveType( "Nested1" ) ); // double nesting resolver.addImport( "org.drools.Person.Nested1.Nested2" ); assertEquals( org.drools.Person.Nested1.Nested2.class, resolver.resolveType( "Nested2" ) ); // triple nesting resolver.addImport( "org.drools.Person.Nested1.Nested2.Nested3" ); assertEquals( org.drools.Person.Nested1.Nested2.Nested3.class, resolver.resolveType( "Nested3" ) ); } }