// Path: src/main/java/com/cathive/fx/guice/controllerlookup/ControllerLookup.java
// public final class ControllerLookup {
//     
//     private final Collection<IdentifiableController> identifiables;
// 
//     public ControllerLookup(Collection<IdentifiableController> identifiables) {
//         super();
//         this.identifiables = identifiables;
//     }
//     
//     /**
//      * Returns a controller instance with the given ID.
//      * 
//      * @param id
//      *     The string ID of the controller as returned by
//      *     {@link IdentifiableController#getId()}
//      * @return
//      *     The controller with the given ID that has just been
//      *     looked up.
//      * @throws IllegalArgumentException
//      *     thrown if a controller cannot be found with the given ID.
//      */
//     @SuppressWarnings("unchecked")
//     public <T> T lookup(final String id) {
//         for (final IdentifiableController controller : identifiables) {
//             if(controller.getId().equals(id)) {
//                 return (T) controller;
//             }
//         }
//         throw new IllegalArgumentException("Could not find a controller with the ID '" + id + "'");
//     }
// }
// 
// Path: src/test/java/com/cathive/fx/guice/lookupexample/InnerLookupController.java
// @FXMLController
// public class InnerLookupController implements IdentifiableController {
// 
//     @FXML
//     private Parent root;
//     
//     @Override
//     public String getId() {
//         return ParentIDFinder.getParentId(root);
//     }
// }
// 
// Path: src/test/java/com/cathive/fx/guice/lookupexample/OuterLookupController.java
// @FXMLController
// public class OuterLookupController {
// 
//     @Inject
//     private ControllerLookup controllerLookup;
// 
//     public InnerLookupController getControllerForPane1() {
//         return controllerLookup.lookup("examplePane1");
//     }
//     
//     public InnerLookupController getControllerForPane2() {
//         return controllerLookup.lookup("examplePane2");
//     }
//     
//     public IdentifiableController getAnyController(String id) {
//         return controllerLookup.lookup(id);
//     }
// }


import com.cathive.fx.guice.lookupexample.OuterLookupController;
import com.google.inject.Inject;
import com.google.inject.Module;
import com.google.inject.ProvisionException;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javafx.stage.Stage;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.cathive.fx.guice.controllerlookup.ControllerLookup;
import com.cathive.fx.guice.lookupexample.InnerLookupController;
        
        assertNotNull(controllerForPane1);
        assertNotNull(controllerForPane2);
    }
    
    @Test(expectedExceptions={IllegalArgumentException.class})
    public void illegalArgumentExceptionThrownWhenNoControllerExistsWithMatchingID() throws Exception {
        
        OuterLookupController controller = result.getController();
        
        controller.getAnyController("Frederick");
    }
    
    @Test
    public void provisionExceptionThrownInjectingAControllerLookupOutsideOfScope() throws Exception {
        boolean threw = false;
        try {
            app.getInjector().getInstance(HasControllerLookup.class);
        } catch (ProvisionException e) {
            // a provision exception is thrown by Guice, the cause is the
            // IllegalStateException thrown by the module because a
            // ControllerLookup cannot be injected while not loading an FXML control.
            assertTrue(e.getCause() instanceof IllegalStateException);
            threw = true;
        }
        assertTrue(threw);
    }
    
    static class HasControllerLookup {
        @Inject
// Path: src/main/java/com/cathive/fx/guice/controllerlookup/ControllerLookup.java
// public final class ControllerLookup {
//     
//     private final Collection<IdentifiableController> identifiables;
// 
//     public ControllerLookup(Collection<IdentifiableController> identifiables) {
//         super();
//         this.identifiables = identifiables;
//     }
//     
//     /**
//      * Returns a controller instance with the given ID.
//      * 
//      * @param id
//      *     The string ID of the controller as returned by
//      *     {@link IdentifiableController#getId()}
//      * @return
//      *     The controller with the given ID that has just been
//      *     looked up.
//      * @throws IllegalArgumentException
//      *     thrown if a controller cannot be found with the given ID.
//      */
//     @SuppressWarnings("unchecked")
//     public <T> T lookup(final String id) {
//         for (final IdentifiableController controller : identifiables) {
//             if(controller.getId().equals(id)) {
//                 return (T) controller;
//             }
//         }
//         throw new IllegalArgumentException("Could not find a controller with the ID '" + id + "'");
//     }
// }
// 
// Path: src/test/java/com/cathive/fx/guice/lookupexample/InnerLookupController.java
// @FXMLController
// public class InnerLookupController implements IdentifiableController {
// 
//     @FXML
//     private Parent root;
//     
//     @Override
//     public String getId() {
//         return ParentIDFinder.getParentId(root);
//     }
// }
// 
// Path: src/test/java/com/cathive/fx/guice/lookupexample/OuterLookupController.java
// @FXMLController
// public class OuterLookupController {
// 
//     @Inject
//     private ControllerLookup controllerLookup;
// 
//     public InnerLookupController getControllerForPane1() {
//         return controllerLookup.lookup("examplePane1");
//     }
//     
//     public InnerLookupController getControllerForPane2() {
//         return controllerLookup.lookup("examplePane2");
//     }
//     
//     public IdentifiableController getAnyController(String id) {
//         return controllerLookup.lookup(id);
//     }
// }


// Path: src/test/java/com/cathive/fx/guice/ControllerLookupApplicationTest.java
import com.cathive.fx.guice.lookupexample.OuterLookupController;
import com.google.inject.Inject;
import com.google.inject.Module;
import com.google.inject.ProvisionException;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javafx.stage.Stage;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.cathive.fx.guice.controllerlookup.ControllerLookup;
import com.cathive.fx.guice.lookupexample.InnerLookupController;

        
        assertNotNull(controllerForPane1);
        assertNotNull(controllerForPane2);
    }
    
    @Test(expectedExceptions={IllegalArgumentException.class})
    public void illegalArgumentExceptionThrownWhenNoControllerExistsWithMatchingID() throws Exception {
        
        OuterLookupController controller = result.getController();
        
        controller.getAnyController("Frederick");
    }
    
    @Test
    public void provisionExceptionThrownInjectingAControllerLookupOutsideOfScope() throws Exception {
        boolean threw = false;
        try {
            app.getInjector().getInstance(HasControllerLookup.class);
        } catch (ProvisionException e) {
            // a provision exception is thrown by Guice, the cause is the
            // IllegalStateException thrown by the module because a
            // ControllerLookup cannot be injected while not loading an FXML control.
            assertTrue(e.getCause() instanceof IllegalStateException);
            threw = true;
        }
        assertTrue(threw);
    }
    
    static class HasControllerLookup {
        @Inject
        ControllerLookup controllerLookup;