package org.simpleflatmapper.reflect.test.meta;
import org.junit.Test;
import org.simpleflatmapper.reflect.meta.AliasProvider;
import org.simpleflatmapper.reflect.meta.AliasProviderService;
import org.simpleflatmapper.reflect.meta.ArrayAliasProvider;
import org.simpleflatmapper.reflect.meta.DefaultAliasProvider;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import static org.junit.Assert.*;
public class AliasProviderServiceTest {
@Test
public void testServiceLoader() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, MalformedURLException {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
try {
Method findAliasProviders = AliasProviderService.class.getDeclaredMethod("findAliasProviders");
findAliasProviders.setAccessible(true);
Thread.currentThread().setContextClassLoader(new URLClassLoader(new URL[0], getClass().getClassLoader()));
AliasProvider defaultAliasProvider = (AliasProvider) findAliasProviders.invoke(null);
assertTrue(defaultAliasProvider instanceof DefaultAliasProvider);
URLClassLoader loader = new URLClassLoader(new URL[]{new URL("file:src/test/resources/sl1/")}, getClass().getClassLoader());
Thread.currentThread().setContextClassLoader(loader);
AliasProvider oneALiasProvider = (AliasProvider) findAliasProviders.invoke(null);
assertTrue(oneALiasProvider instanceof AliasProviderFactory1.AliasProvider1);
loader = new URLClassLoader(new URL[]{new URL("file:src/test/resources/sl2/")}, getClass().getClassLoader());
Thread.currentThread().setContextClassLoader(loader);
AliasProvider multipleAliasProvider = (AliasProvider) findAliasProviders.invoke(null);
assertTrue(multipleAliasProvider instanceof ArrayAliasProvider);
ArrayAliasProvider arrayAliasProvider = (ArrayAliasProvider) multipleAliasProvider;
AliasProvider[] providers = arrayAliasProvider.providers();
assertEquals(2, providers.length);
assertTrue(providers[0] instanceof AliasProviderFactory1.AliasProvider1);
assertTrue(providers[1] instanceof AliasProviderFactory2.AliasProvider2);
} finally {
Thread.currentThread().setContextClassLoader(contextClassLoader);
}
}
}