package org.fluentlenium.core.inject;
import org.assertj.core.api.Assertions;
import org.fluentlenium.adapter.FluentAdapter;
import org.fluentlenium.core.FluentContainer;
import org.fluentlenium.core.FluentControl;
import org.fluentlenium.core.annotation.Page;
import org.fluentlenium.core.components.ComponentsManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.openqa.selenium.WebDriver;
@RunWith(MockitoJUnitRunner.class)
public class FluentInjectorContainerTest {
@Mock
private WebDriver webDriver;
private FluentAdapter fluentAdapter;
private FluentInjector injector;
@Before
public void before() {
fluentAdapter = new FluentAdapter();
fluentAdapter.initFluent(webDriver);
injector = new FluentInjector(fluentAdapter, null, new ComponentsManager(fluentAdapter),
new DefaultContainerInstanciator(fluentAdapter));
}
public static class ChildContainer {
}
public static class ParentContainer {
@Page
private ChildContainer childContainer;
}
@Test
public void testInjectChildContainer() {
ParentContainer parentContainer = new ParentContainer();
Assertions.assertThat(parentContainer.childContainer).isNull();
injector.inject(parentContainer);
Assertions.assertThat(parentContainer.childContainer).isExactlyInstanceOf(ChildContainer.class);
}
public static class ChildContainerRecurse {
@Page
private ParentContainerRecurse parentContainer;
}
public static class ParentContainerRecurse {
@Page
private ChildContainerRecurse childContainer;
}
@Test
public void testInjectRecursiveContainers() {
ParentContainerRecurse parentContainer = new ParentContainerRecurse();
Assertions.assertThat(parentContainer.childContainer).isNull();
injector.inject(parentContainer);
Assertions.assertThat(parentContainer.childContainer).isExactlyInstanceOf(ChildContainerRecurse.class);
Assertions.assertThat(parentContainer.childContainer.parentContainer).isExactlyInstanceOf(ParentContainerRecurse.class);
}
public static class ChildContainerInit implements FluentContainer {
@Page
private ParentContainerRecurse parentContainer;
private FluentControl control;
@Override
public void initFluent(FluentControl control) {
this.control = control;
}
}
public static class ParentContainerInit implements FluentContainer {
private FluentControl control;
@Page
private ChildContainerInit childContainer;
@Override
public void initFluent(FluentControl control) {
this.control = control;
}
}
@Test
public void testInjectInitialise() {
ParentContainerInit parentContainer = new ParentContainerInit();
Assertions.assertThat(parentContainer.childContainer).isNull();
injector.inject(parentContainer);
Assertions.assertThat(parentContainer.control).isInstanceOf(ContainerFluentControl.class);
Assertions.assertThat(((ContainerFluentControl) parentContainer.control).getAdapterControl()).isSameAs(fluentAdapter);
Assertions.assertThat(parentContainer.childContainer.control).isInstanceOf(ContainerFluentControl.class);
Assertions.assertThat(((ContainerFluentControl) parentContainer.childContainer.control).getAdapterControl())
.isSameAs(fluentAdapter);
}
public static class ChildContainerConstructorInit {
@Page
private ParentContainerConstructorInit parentContainer;
private final FluentControl control;
public ChildContainerConstructorInit(FluentControl control) {
this.control = control;
}
}
public static class ParentContainerConstructorInit {
private final FluentControl control;
@Page
private ChildContainerConstructorInit childContainer;
public ParentContainerConstructorInit(FluentControl control) {
this.control = control;
}
}
@Test
public void testInjectConstructorInitialise() {
ParentContainerConstructorInit parentContainer = new ParentContainerConstructorInit(fluentAdapter);
Assertions.assertThat(parentContainer.childContainer).isNull();
injector.inject(parentContainer);
Assertions.assertThat(parentContainer.control).isSameAs(fluentAdapter);
Assertions.assertThat(parentContainer.childContainer.control).isInstanceOf(ContainerFluentControl.class);
Assertions.assertThat(((ContainerFluentControl) parentContainer.childContainer.control).getAdapterControl())
.isSameAs(fluentAdapter);
}
}