/* * Copyright 2010 Red Hat, Inc. and/or its affiliates. * * 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.core.base; import org.drools.core.test.model.Cheese; import org.drools.core.test.model.FirstClass; import org.drools.core.test.model.SecondClass; import org.junit.Test; import java.util.HashSet; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; public class ClassTypeResolverTest { @Test 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" ) ); } @Test 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[]" ) ); } @Test 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[][][][]" ) ); } @Test 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.core.test.model.Cheese" ) ); } @Test public void testResolveObjectFromImport() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "org.drools.core.test.model.Cheese" ); resolver.addImport( "org.drools.core.test.model.FirstClass" ); resolver.addImport( "org.drools.core.test.model.FirstClass.AlternativeKey" ); resolver.addImport( "org.drools.core.test.model.SecondClass" ); resolver.addImport( "org.drools.core.test.model.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.core.test.model.Cheese" ) ); assertEquals( FirstClass.class, resolver.resolveType( "org.drools.core.test.model.FirstClass" ) ); assertEquals( FirstClass.AlternativeKey.class, resolver.resolveType( "org.drools.core.test.model.FirstClass.AlternativeKey" ) ); assertEquals( SecondClass.class, resolver.resolveType( "org.drools.core.test.model.SecondClass" ) ); assertEquals( SecondClass.AlternativeKey.class, resolver.resolveType( "org.drools.core.test.model.SecondClass.AlternativeKey" ) ); } @Test public void testResolveObjectFromImportNested() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "org.drools.core.test.model.FirstClass" ); assertEquals( FirstClass.AlternativeKey.class, resolver.resolveType( "FirstClass.AlternativeKey" ) ); } @Test public void testResolveFullTypeName() throws Exception { final TypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "org.drools.core.test.model.Cheese" ); resolver.addImport( "org.drools.core.test.model.FirstClass" ); assertEquals("org.drools.core.test.model.Cheese", resolver.getFullTypeName("Cheese")); assertEquals("org.drools.core.test.model.FirstClass", resolver.getFullTypeName("FirstClass")); } @Test public void testResolveObjectFromImportMultipleClassesDifferentPackages() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "org.drools.core.test.model.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.core.test.model.Cheese" ) ); } @Test 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.core.test.model.Cheese[]" ) ); } @Test public void testResolveArrayOfObjectsFromImport() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "org.drools.core.test.model.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.core.test.model.Cheese[]" ) ); } @Test 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.core.test.model.Cheese[][]" ) ); } @Test public void testResolveMultidimensionnalArrayOfObjectsFromImport() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); resolver.addImport( "org.drools.core.test.model.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.core.test.model.Cheese[][]" ) ); } @Test 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 } } @Test public void testNestedClassResolving() throws Exception { final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), Thread.currentThread().getContextClassLoader() ); // single nesting resolver.addImport( "org.drools.core.test.model.Person.Nested1" ); assertEquals( org.drools.core.test.model.Person.Nested1.class, resolver.resolveType( "Nested1" ) ); // double nesting resolver.addImport( "org.drools.core.test.model.Person.Nested1.Nested2" ); assertEquals( org.drools.core.test.model.Person.Nested1.Nested2.class, resolver.resolveType( "Nested2" ) ); // triple nesting resolver.addImport( "org.drools.core.test.model.Person.Nested1.Nested2.Nested3" ); assertEquals( org.drools.core.test.model.Person.Nested1.Nested2.Nested3.class, resolver.resolveType( "Nested3" ) ); } @Test public void testMacOSXClassLoaderBehavior() throws Exception { SimulateMacOSXClassLoader simulatedMacOSXClassLoader = new SimulateMacOSXClassLoader( Thread.currentThread().getContextClassLoader(), new HashSet() ); simulatedMacOSXClassLoader.addClassInScope( org.drools.core.test.model.Cheese.class ); final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), simulatedMacOSXClassLoader ); resolver.addImport("org.drools.core.test.model.*"); assertEquals( org.drools.core.test.model.Cheese.class, resolver.resolveType( "Cheese" ) ); try { resolver.resolveType( "cheese" ); // <<- on Mac/OSX throws NoClassDefFoundError which escapes the try/catch and fail the test. // while on say Linux, it passes the test (catched as ClassNotFoundException) fail( "the type cheese (lower-case c) should not exists at all" ); } catch ( ClassNotFoundException e) { // swallow as this should be thrown } } @Test public void testMacOSXClassLoaderBehaviorNested() throws Exception { SimulateMacOSXClassLoader simulatedMacOSXClassLoader = new SimulateMacOSXClassLoader( Thread.currentThread().getContextClassLoader(), new HashSet() ); simulatedMacOSXClassLoader.addClassInScope( org.drools.core.test.model.Person.Nested1.Nested2.class ); final ClassTypeResolver resolver = new ClassTypeResolver( new HashSet(), simulatedMacOSXClassLoader ); resolver.addImport("org.drools.core.test.model.*"); assertEquals( org.drools.core.test.model.Person.Nested1.Nested2.class, resolver.resolveType( "Person.Nested1.Nested2" ) ); try { resolver.resolveType( "Person.nested1.nested2" ); // <<- on Mac/OSX throws NoClassDefFoundError which escapes the try/catch and fail the test. // while on say Linux, it passes the test (catched as ClassNotFoundException) fail( "should have resolved nothing." ); } catch ( ClassNotFoundException e) { // swallow as this should be thrown } } }