/** * Copyright Alex Objelean */ package ro.isdc.wro.model.group.processor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.util.concurrent.Callable; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import ro.isdc.wro.WroRuntimeException; import ro.isdc.wro.config.Context; import ro.isdc.wro.config.ReadOnlyContext; import ro.isdc.wro.config.jmx.WroConfiguration; import ro.isdc.wro.config.support.ContextPropagatingCallable; import ro.isdc.wro.manager.callback.LifecycleCallbackRegistry; import ro.isdc.wro.manager.factory.BaseWroManagerFactory; import ro.isdc.wro.model.group.Inject; import ro.isdc.wro.model.resource.Resource; import ro.isdc.wro.model.resource.locator.factory.UriLocatorFactory; import ro.isdc.wro.model.resource.processor.ResourcePreProcessor; import ro.isdc.wro.model.resource.processor.decorator.CopyrightKeeperProcessorDecorator; import ro.isdc.wro.model.resource.processor.impl.js.JSMinProcessor; import ro.isdc.wro.util.WroTestUtils; /** * @author Alex Objelean * @created 12 Dec 2011 */ public class TestInjector { private Injector victim; @Before public void setUp() { Context.set(Context.standaloneContext()); initializeValidInjector(); } @Test(expected = NullPointerException.class) public void cannotAcceptNullMap() { victim = new Injector(null); } @Test public void shouldAcceptInjectInitializedManager() { initializeValidInjector(); } private void initializeValidInjector() { victim = InjectorBuilder.create(new BaseWroManagerFactory()).build(); } @Test(expected = WroRuntimeException.class) public void cannotInjectUnsupportedAndUnitializedType() { initializeValidInjector(); final Object inner = new Object() { @Inject private Object object; }; victim.inject(inner); } @Test public void shouldBeThreadSafe() throws Exception { initializeValidInjector(); WroTestUtils.runConcurrently(new ContextPropagatingCallable<Void>(new Callable<Void>() { public Void call() throws Exception { victim.inject(new GroupsProcessor()); return null; } })); } @Test public void shouldInjectSupportedType() throws Exception { initializeValidInjector(); final Callable<?> inner = new Callable<Void>() { @Inject private LifecycleCallbackRegistry object; public Void call() throws Exception { Assert.assertNotNull(object); return null; } }; victim.inject(inner); inner.call(); } @Test public void shouldInjectContext() throws Exception { // Cannot reuse this part, because generic type is not inferred correctly at runtime final Callable<?> inner = new Callable<Void>() { @Inject private ReadOnlyContext object; public Void call() throws Exception { assertNotNull(object); return null; } }; victim.inject(inner); inner.call(); } @Test(expected = WroRuntimeException.class) public void canInjectContextOutsideOfContextScope() throws Exception { // remove the context explicitly Context.unset(); shouldInjectContext(); } @Test public void shouldInjectWroConfiguration() throws Exception { final Callable<?> inner = new Callable<Void>() { @Inject private WroConfiguration object; public Void call() throws Exception { Assert.assertNotNull(object); return null; } }; victim.inject(inner); inner.call(); } private class TestProcessor extends JSMinProcessor { @Inject private ReadOnlyContext context; } @Test public void shouldInjectDecoratedProcessor() { final TestProcessor testProcessor = new TestProcessor(); final ResourcePreProcessor processor = CopyrightKeeperProcessorDecorator.decorate(testProcessor); final Injector injector = InjectorBuilder.create(new BaseWroManagerFactory()).build(); injector.inject(processor); assertNotNull(testProcessor.context); } @Test(expected = WroRuntimeException.class) public void shouldNotInjectUnsupportedAndInitializedTypes() { final String initialValue = "initial"; final Callable<?> object = new Callable<Void>() { @Inject String unsupportedInitializedType = initialValue; public Void call() throws Exception { assertEquals(initialValue, unsupportedInitializedType); return null; } }; victim.inject(object); } @Test public void shouldNotChangeAfterInjectionSupportedNotNullObject() throws Exception { new Callable<Void>() { @Inject private final ResourcePreProcessor inner = new ResourcePreProcessor() { public void process(final Resource resource, final Reader reader, final Writer writer) throws IOException { } }; public Void call() throws Exception { Assert.assertNotNull(inner); return null; } }.call(); } @Test(expected = WroRuntimeException.class) public void cannotInjectUnsupportedInnerObject() throws Exception { final Callable<?> outer = new Callable<Void>() { @Inject private final Callable<?> inner = new Callable<Void>() { @Inject UriLocatorFactory locatorFactory; public Void call() throws Exception { Assert.assertNotNull(locatorFactory); return null; } }; public Void call() throws Exception { inner.call(); return null; } }; victim.inject(outer); outer.call(); } @Test(expected = WroRuntimeException.class) public void cannotInjectOutsideOfContext() { Context.unset(); victim.inject(new TestProcessor()); } @After public void tearDown() { Context.unset(); } }