/*
* Copyright (C) 2012 The Cat Hive Developers.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.cathive.fx.guice;
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;
import com.cathive.fx.guice.lookupexample.OuterLookupController;
import com.google.inject.Inject;
import com.google.inject.Module;
import com.google.inject.ProvisionException;
public class ControllerLookupApplicationTest {
static class ControllerLookupGuiceApplication extends GuiceApplication {
@Override
public void start(Stage primaryStage) throws Exception {
// Do nothing...
}
@Override
public void init(List<Module> modules) throws Exception {
// Intentionally left empty
}
}
private ControllerLookupGuiceApplication app;
private GuiceFXMLLoader loader;
private GuiceFXMLLoader.Result result;
@BeforeMethod
public void setup() throws Exception {
app = new ControllerLookupGuiceApplication();
app.init();
loader = app.getInjector().getInstance(GuiceFXMLLoader.class);
result = loader.load(
getClass().getResource("/OuterLookupPane.fxml"),
ResourceBundle.getBundle("ExamplePane", Locale.ENGLISH)
);
}
/**
* In JavaFX 8 it seems that you can't overwrite the fx:id in an fx:include tag (which was possible in JavaFX 2).
* That's the reason why this test was failing on JDK8 while it was running without problems on JDK7.
*/
@Test(enabled = false)
public void parentControllerCanLookupNestedControllers() throws Exception {
OuterLookupController controller = result.getController();
InnerLookupController controllerForPane1 = controller.getControllerForPane1();
InnerLookupController controllerForPane2 = controller.getControllerForPane2();
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;
}
}