package org.jboss.test.faces.mock.component;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Iterator;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import org.jboss.test.faces.mock.FacesMock;
import org.junit.Before;
import org.junit.Test;
public class TreeBuilderImplTest {
private static final String FACET = "facet";
private TreeBuilderImpl<UIComponent> builder;
private UIComponent component;
@Before
public void setUp(){
component = FacesMock.createMock(UIComponent.class);
builder = new TreeBuilderImpl<UIComponent>(component);
}
@Test
public void testAddChild() {
TreeBuilder<UIComponent> child = ViewBuilder.component();
builder.children(child);
UIComponent uiComponent = child.getComponent();
verifySingleChild(uiComponent);
}
private void verifySingleChild(UIComponent uiComponent) {
FacesMock.replay(component,uiComponent);
assertEquals(1, component.getChildCount());
assertEquals(0, component.getFacetCount());
assertEquals(1, component.getChildren().size());
assertSame(uiComponent,component.getChildren().get(0));
assertSame(component,uiComponent.getParent());
Iterator<UIComponent> facetsAndChildren = component.getFacetsAndChildren();
assertTrue(facetsAndChildren.hasNext());
assertSame(uiComponent,facetsAndChildren.next());
assertFalse(facetsAndChildren.hasNext());
FacesMock.verify(component,uiComponent);
}
@Test
public void testAddChildClassOfT() {
TreeBuilder<UIInput> child = ViewBuilder.component(UIInput.class);
builder.children(child);
UIInput uiComponent = child.getComponent();
verifySingleChild(uiComponent);
}
@Test
public void testAddChildT() {
UIInput uiComponent = FacesMock.createMock(UIInput.class);
TreeBuilder<UIInput> child = ViewBuilder.component(uiComponent);
builder.children(child);
assertSame(uiComponent, child.getComponent());
verifySingleChild(uiComponent);
}
@Test
public void testAddFacetString() {
Facet<UIComponent> treeBuilder = ViewBuilder.facet(FACET);
builder.facets(treeBuilder);
UIComponent uiComponent = treeBuilder.getBuilder().getComponent();
verifySingleFacet(uiComponent);
}
@Test
public void testAddFacetStringClassOfT() {
Facet<UIComponent> treeBuilder = ViewBuilder.facet(FACET,UIComponent.class);
builder.facets(treeBuilder);
UIComponent uiComponent = treeBuilder.getBuilder().getComponent();
verifySingleFacet(uiComponent);
}
@Test
public void testAddFacetStringT() {
UIComponent uiComponent = FacesMock.createMock(UIComponent.class);
Facet<UIComponent> treeBuilder = ViewBuilder.facet(FACET,uiComponent);
builder.facets(treeBuilder);
verifySingleFacet(uiComponent);
}
private void verifySingleFacet(UIComponent uiComponent) {
FacesMock.replay(component,uiComponent);
assertEquals(0, component.getChildCount());
assertEquals(1, component.getFacetCount());
assertEquals(0, component.getChildren().size());
assertEquals(1, component.getFacets().size());
assertSame(uiComponent,component.getFacets().get(FACET));
assertSame(uiComponent,component.getFacet(FACET));
assertSame(component,uiComponent.getParent());
Iterator<UIComponent> facetsAndChildren = component.getFacetsAndChildren();
assertTrue(facetsAndChildren.hasNext());
assertSame(uiComponent,facetsAndChildren.next());
assertFalse(facetsAndChildren.hasNext());
FacesMock.verify(component,uiComponent);
}
@Test
public void testSetId() {
builder.id(FACET);
FacesMock.replay(component);
assertEquals(FACET, component.getId());
FacesMock.verify(component);
}
@Test
public void testVerify() {
FacesMock.replay(component);
assertEquals(0, component.getChildren().size());
builder.verify();
}
@Test
public void testReplay() {
builder.replay();
assertEquals(0, component.getChildren().size());
FacesMock.verify(component);
}
@Test
public void testVisitTree() {
final ArrayList<TreeBuilder<?>> builders = new ArrayList<TreeBuilder<?>>();
TreeBuilder<UIComponent> child = ViewBuilder.component();
builder.children(child);
builder.visitTree(new TreeVisitor() {
public void visit(TreeBuilder<?> toVisit) {
builders.add(toVisit);
}
});
assertEquals(2, builders.size());
assertSame(builder, builders.get(0));
assertSame(child, builders.get(1));
}
}