@Test
  public void testCircularDependenciesThrowsCircularDependencyException() {
    final String moduleA =
        ""
            + "import org.picocontainer.testmodel.*;\n"
            + "import org.picocontainer.modules.*;\n"
            + "import static org.picocontainer.modules.Importer.importModule;\n"
            + "\n"
            + "importModule(\"moduleC\");\n"
            + "\n"
            + "pico = parent.makeChildContainer();\n"
            + "pico.addComponent(Touchable, SimpleTouchable);\n"
            + "\n"
            + "def publisher = new Publisher(pico, parent)\n"
            + "publisher.publish(Touchable)";

    final String moduleB =
        ""
            + "import org.picocontainer.testmodel.*;\n"
            + "import org.picocontainer.modules.*;\n"
            + "import static org.picocontainer.modules.Importer.importModule;\n"
            + "pico = parent.makeChildContainer();\n"
            + "\n"
            + "importModule(\"moduleA\");\n"
            + "\n"
            + "pico.addComponent(DependsOnTouchable);\n"
            + "\n"
            + "def publisher = new Publisher(pico, parent)\n"
            + "publisher.publish(DependsOnTouchable)";

    final String moduleC =
        ""
            + "import org.picocontainer.testmodel.*;\n"
            + "import org.picocontainer.modules.*;\n"
            + "import static org.picocontainer.modules.Importer.importModule;\n"
            + "pico = parent.makeChildContainer();\n"
            + "\n"
            + "importModule(\"moduleB\");\n"
            + "\n"
            + "pico.addComponent(DependsOnTouchable);\n"
            + "\n"
            + "def publisher = new Publisher(pico, parent)\n"
            + "publisher.publish(DependsOnTouchable)";

    moduleFolder.addModule("moduleA", moduleA);
    moduleFolder.addModule("moduleB", moduleB);
    moduleFolder.addModule("moduleC", moduleB);

    try {
      PicoContainer pico = moduleSystem.deploy().getPico();
      fail("Should have thrown CircularDependencyException, instead got: " + pico);
    } catch (CircularDependencyException e) {
      assertNotNull(e.getMessage());
    }
  }
  @Test
  public void testCrossModuleDependenciesArePossibleWithImports() {
    final String moduleA =
        ""
            + "import org.picocontainer.testmodel.*;\n"
            + "import org.picocontainer.modules.*;\n"
            + "pico = parent.makeChildContainer();\n"
            + "pico.addComponent(Touchable, SimpleTouchable);\n"
            + "\n"
            + "def publisher = new Publisher(pico, parent)\n"
            + "publisher.publish(Touchable)";

    final String moduleB =
        ""
            + "import org.picocontainer.testmodel.*;\n"
            + "import org.picocontainer.modules.*;\n"
            + "import static org.picocontainer.modules.Importer.importModule;\n"
            + "pico = parent.makeChildContainer();\n"
            + "\n"
            + "importModule(\"moduleA\");\n"
            + "\n"
            + "pico.addComponent(DependsOnTouchable);\n"
            + "\n"
            + "def publisher = new Publisher(pico, parent)\n"
            + "publisher.publish(DependsOnTouchable)";

    moduleFolder.addModule("moduleA", moduleA);
    moduleFolder.addModule("moduleB", moduleB);

    PicoContainer pico = moduleSystem.deploy().getPico();
    DependsOnTouchable depends = pico.getComponent(DependsOnTouchable.class);
    assertNotNull(depends);
  }
  @Before
  public void setUp() throws Exception {
    moduleFolder = new InMemoryModuleFolder(VFS.getManager());

    moduleSystem =
        new ModuleBuilder().withAutoDeployFolder(moduleFolder.getModuleDirectory()).build();
  }
 @After
 public void tearDown() throws Exception {
   moduleSystem = null;
   moduleFolder.tearDown();
 }