/******************************************************************************* * Copyright (c) 2010-present Sonatype, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Stuart McCulloch (Sonatype, Inc.) - initial API and implementation *******************************************************************************/ package org.eclipse.sisu.space; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import org.eclipse.sisu.inject.DeferredClass; import org.eclipse.sisu.inject.DeferredProvider; import junit.framework.TestCase; public class DeferredClassTest extends TestCase { URLClassLoader testLoader; @Override protected void setUp() throws MalformedURLException { testLoader = URLClassLoader.newInstance( new URL[] { new File( "target/classes" ).toURI().toURL() }, null ); } private static class Dummy { } public void testStrongDeferredClass() { final String clazzName = Dummy.class.getName(); final ClassSpace space = new URLClassSpace( testLoader ); final DeferredClass<?> clazz = space.deferLoadClass( clazzName ); assertEquals( clazzName, clazz.getName() ); assertEquals( clazzName, clazz.load().getName() ); assertFalse( Dummy.class.equals( clazz.load() ) ); assertEquals( ( 17 * 31 + clazzName.hashCode() ) * 31 + space.hashCode(), clazz.hashCode() ); assertEquals( clazz, clazz ); assertEquals( new NamedClass<Object>( space, clazzName ), clazz ); assertFalse( clazz.equals( new DeferredClass<Object>() { @SuppressWarnings( "unchecked" ) public Class<Object> load() throws TypeNotPresentException { return (Class<Object>) clazz.load(); } public String getName() { return clazz.getName(); } public DeferredProvider<Object> asProvider() { throw new UnsupportedOperationException(); } } ) ); final String clazzName2 = clazzName + "$1"; final ClassSpace space2 = new URLClassSpace( ClassLoader.getSystemClassLoader(), null ); assertFalse( clazz.equals( new NamedClass<Object>( space, clazzName2 ) ) ); assertFalse( clazz.equals( new NamedClass<Object>( space2, clazzName ) ) ); assertTrue( clazz.toString().contains( clazzName ) ); assertTrue( clazz.toString().contains( space.toString() ) ); } public void testLoadedClass() { final DeferredClass<?> dummyClazz = new LoadedClass<Dummy>( Dummy.class ); final DeferredClass<?> stringClazz = new LoadedClass<String>( String.class ); assertEquals( String.class.getName(), stringClazz.getName() ); assertEquals( String.class.getName(), stringClazz.load().getName() ); assertSame( String.class, stringClazz.load() ); assertEquals( stringClazz, stringClazz ); assertFalse( stringClazz.equals( dummyClazz ) ); assertFalse( stringClazz.equals( String.class ) ); assertEquals( String.class.hashCode(), stringClazz.hashCode() ); assertEquals( "Loaded " + String.class, stringClazz.toString() ); assertEquals( "Loaded " + Dummy.class + " from " + Dummy.class.getClassLoader(), dummyClazz.toString() ); } public void testMissingStrongDeferredClass() { try { final ClassSpace space = new URLClassSpace( testLoader ); System.out.println( new NamedClass<Object>( space, "unknown-class" ) ); System.out.println( new LoadedClass<Object>( getClass() ) ); new NamedClass<Object>( space, "unknown-class" ).load(); fail( "Expected TypeNotPresentException" ); } catch ( final TypeNotPresentException e ) { } } }