package com.google.inject.spi; import com.google.inject.AbstractModule; import com.google.inject.Binder; import com.google.inject.Module; import junit.framework.TestCase; /** Tests for {@link ModuleSource}. */ public class ModuleSourceTest extends TestCase { private static final StackTraceElement BINDER_INSTALL = new StackTraceElement( "com.google.inject.spi.Elements$RecordingBinder", "install", "Unknown Source", 235 /* line number*/); public void testOneModule() { ModuleSource moduleSource = createWithSizeOne(); checkSizeOne(moduleSource); } public void testTwoModules() { ModuleSource moduleSource = createWithSizeTwo(); checkSizeTwo(moduleSource); moduleSource = moduleSource.getParent(); checkSizeOne(moduleSource); } public void testThreeModules() { ModuleSource moduleSource = createWithSizeThree(); checkSizeThree(moduleSource); moduleSource = moduleSource.getParent(); checkSizeTwo(moduleSource); moduleSource = moduleSource.getParent(); checkSizeOne(moduleSource); } private void checkSizeOne(ModuleSource moduleSource) { assertEquals(1, moduleSource.size()); assertEquals(1, moduleSource.getStackTraceSize()); // Check call stack StackTraceElement[] callStack = moduleSource.getStackTrace(); assertEquals(BINDER_INSTALL, callStack[0]); } private void checkSizeTwo(ModuleSource moduleSource) { assertEquals(2, moduleSource.size()); assertEquals(3, moduleSource.getStackTraceSize()); // Check call stack StackTraceElement[] callStack = moduleSource.getStackTrace(); assertEquals(BINDER_INSTALL, callStack[0]); assertEquals( new StackTraceElement( "com.google.inject.spi.moduleSourceTest$A", "configure", "Unknown Source", 100), callStack[1]); assertEquals(BINDER_INSTALL, callStack[2]); } private void checkSizeThree(ModuleSource moduleSource) { assertEquals(3, moduleSource.size()); assertEquals(7, moduleSource.getStackTraceSize()); // Check call stack StackTraceElement[] callStack = moduleSource.getStackTrace(); assertEquals(BINDER_INSTALL, callStack[0]); assertEquals(new StackTraceElement("class1", "method1", "Unknown Source", 1), callStack[1]); assertEquals(new StackTraceElement("class2", "method2", "Unknown Source", 2), callStack[2]); assertEquals( new StackTraceElement( "com.google.inject.spi.moduleSourceTest$B", "configure", "Unknown Source", 200), callStack[3]); assertEquals(BINDER_INSTALL, callStack[4]); assertEquals( new StackTraceElement( "com.google.inject.spi.moduleSourceTest$A", "configure", "Unknown Source", 100), callStack[5]); assertEquals(BINDER_INSTALL, callStack[6]); } private ModuleSource createWithSizeOne() { StackTraceElement[] partialCallStack = new StackTraceElement[1]; partialCallStack[0] = BINDER_INSTALL; return new ModuleSource(new A(), partialCallStack); } private ModuleSource createWithSizeTwo() { ModuleSource moduleSource = createWithSizeOne(); StackTraceElement[] partialCallStack = new StackTraceElement[2]; partialCallStack[0] = BINDER_INSTALL; partialCallStack[1] = new StackTraceElement( "com.google.inject.spi.moduleSourceTest$A", "configure", "moduleSourceTest.java", 100); return moduleSource.createChild(new B(), partialCallStack); } private ModuleSource createWithSizeThree() { ModuleSource moduleSource = createWithSizeTwo(); StackTraceElement[] partialCallStack = new StackTraceElement[4]; partialCallStack[0] = BINDER_INSTALL; partialCallStack[1] = new StackTraceElement("class1", "method1", "Class1.java", 1); partialCallStack[2] = new StackTraceElement("class2", "method2", "Class2.java", 2); partialCallStack[3] = new StackTraceElement( "com.google.inject.spi.moduleSourceTest$B", "configure", "moduleSourceTest.java", 200); return moduleSource.createChild(new C(), partialCallStack); } private static class A extends AbstractModule { @Override public void configure() { install(new B()); } } private static class B implements Module { @Override public void configure(Binder binder) { binder.install(new C()); } } private static class C extends AbstractModule { @Override public void configure() {} } }