/*
* JBoss, Home of Professional Open Source
* Copyright 2013, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.richfaces.context;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.faces.application.ViewHandler;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewDeclarationLanguage;
import org.jboss.test.faces.FacesEnvironment;
import org.jboss.test.faces.FacesEnvironment.FacesRequest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.richfaces.component.MetaComponentResolver;
import org.richfaces.renderkit.AjaxConstants;
/**
* @author Nick Belaevski
*
*/
public class ComponentIdResolverTest {
static final String META_COMPONENT_ID = "testId";
static final String META_COMPONENT_ID_SUBSTITUTION = "@substitutedTestId";
private static final String META_CLIENT_ID = MetaComponentResolver.META_COMPONENT_SEPARATOR_CHAR + META_COMPONENT_ID;
private FacesEnvironment environment;
private FacesRequest facesRequest;
private FacesContext facesContext;
private UIViewRoot viewRoot;
@Before
public void setUp() throws Exception {
ComponentIdResolver.setMetaComponentSubstitutions(Collections.singletonMap(META_COMPONENT_ID,
META_COMPONENT_ID_SUBSTITUTION));
environment = FacesEnvironment.createEnvironment();
environment.withResource("/test.xhtml", getClass().getResource("/org/richfaces/context/ComponentIdResolver.xhtml"));
environment.withResource("/WEB-INF/faces-config.xml",
getClass().getResource("/org/richfaces/context/ComponentIdResolver.config.xml"));
environment.start();
facesRequest = environment.createFacesRequest();
facesRequest.start();
facesContext = FacesContext.getCurrentInstance();
viewRoot = facesContext.getViewRoot();
facesContext.getExternalContext().getRequestMap().put("one", Arrays.asList(1));
ViewHandler viewHandler = facesContext.getApplication().getViewHandler();
ViewDeclarationLanguage vdl = viewHandler.getViewDeclarationLanguage(facesContext, viewRoot.getViewId());
vdl.buildView(facesContext, viewRoot);
}
@After
public void tearDown() throws Exception {
viewRoot = null;
facesContext = null;
facesRequest.release();
facesRequest = null;
environment.release();
environment = null;
}
private <T> Set<T> asSet(T... elements) {
Set<T> set = new HashSet<T>();
for (T element : elements) {
set.add(element);
}
return set;
}
private ComponentIdResolver createComponentIdResolver() {
return new ComponentIdResolver(facesContext);
}
private UIComponent evaluateComponentExpression(String expression) {
return (UIComponent) facesContext.getApplication().evaluateExpressionGet(facesContext, expression, UIComponent.class);
}
@Test
public void testFindBySimpleId() throws Exception {
ComponentIdResolver resolver = createComponentIdResolver();
resolver.addId("input");
resolver.addId("column");
resolver.addId("header");
resolver.resolve(viewRoot);
Set<String> resolvedIds = resolver.getResolvedIds();
assertEquals(asSet("form:table:input", "form:table:header", "form:table:column"), resolvedIds);
}
@Test
public void testFindBySimpleIdInContext() throws Exception {
ComponentIdResolver resolver = createComponentIdResolver();
resolver.addId("input");
resolver.addId("column");
resolver.addId("header");
resolver.resolve(evaluateComponentExpression("#{testBean.table}"));
Set<String> resolvedIds = resolver.getResolvedIds();
assertEquals(asSet("form:table:input", "form:table:header", "form:table:column"), resolvedIds);
}
@Test
public void testFindByRowsId() throws Exception {
ComponentIdResolver resolver = createComponentIdResolver();
resolver.addId("table:@rows(one):input");
resolver.resolve(evaluateComponentExpression("#{testBean.table}"));
Set<String> resolvedIds = resolver.getResolvedIds();
assertEquals(asSet("form:table:1:input"), resolvedIds);
}
@Test
public void testFindByMetaComponentId() throws Exception {
ComponentIdResolver resolver = createComponentIdResolver();
resolver.addId("input@text");
resolver.addId("table:@rows(one):header@head");
resolver.addId("table:@rows(one):header@footer");
resolver.resolve(viewRoot);
Set<String> resolvedIds = resolver.getResolvedIds();
assertEquals(asSet("form:table:1:header@footer", "form:table:1:header@head", "form:table:input@text"), resolvedIds);
}
@Test
public void testFindWithNoParentContainer() throws Exception {
ComponentIdResolver resolver = createComponentIdResolver();
resolver.addId("form:table:@rows(one):column");
resolver.resolve(evaluateComponentExpression("#{testBean.table}"));
Set<String> resolvedIds = resolver.getResolvedIds();
assertEquals(asSet("form:table:1:column"), resolvedIds);
}
@Test
public void testFindNonExistent() throws Exception {
ComponentIdResolver resolver = createComponentIdResolver();
resolver.addId("nonExistentId");
resolver.addId("xForm:nonExistentId");
resolver.addId(":ySubview:nonExistentId");
resolver.resolve(viewRoot);
Set<String> resolvedIds = resolver.getResolvedIds();
assertEquals(asSet("nonExistentId", "xForm:nonExistentId", "ySubview:nonExistentId"), resolvedIds);
}
@Test
public void testFindNonExistentWithContext() throws Exception {
ComponentIdResolver resolver = createComponentIdResolver();
resolver.addId("nonExistentId");
resolver.addId("xForm:nonExistentId");
resolver.addId(":ySubview:nonExistentId");
resolver.resolve(evaluateComponentExpression("#{testBean.table}"));
Set<String> resolvedIds = resolver.getResolvedIds();
assertEquals(asSet("nonExistentId", "xForm:nonExistentId", "ySubview:nonExistentId"), resolvedIds);
}
@Test
public void testFindViaMetadataResolverInContext() throws Exception {
ComponentIdResolver resolver = createComponentIdResolver();
resolver.addId(META_CLIENT_ID);
resolver.resolve(evaluateComponentExpression("#{testBean.outputInRegion}"));
Set<String> resolvedIds = resolver.getResolvedIds();
assertEquals(asSet("firstRegion"), resolvedIds);
}
@Test
public void testFindViaMetadataResolverOutContext() throws Exception {
ComponentIdResolver resolver = createComponentIdResolver();
resolver.addId(META_CLIENT_ID);
resolver.resolve(evaluateComponentExpression("#{testBean.outputOutRegion}"));
Set<String> resolvedIds = resolver.getResolvedIds();
assertEquals(asSet(META_COMPONENT_ID_SUBSTITUTION), resolvedIds);
}
@Test
public void testAbsoluteIds() throws Exception {
ComponentIdResolver resolver = createComponentIdResolver();
resolver.addId(":form:table:input");
resolver.addId(":form:table:column@head");
resolver.addId(":form:table:@rows(one):column");
resolver.resolve(viewRoot);
Set<String> resolvedIds = resolver.getResolvedIds();
assertEquals(asSet("form:table:input", "form:table:column@head", "form:table:1:column"), resolvedIds);
}
@Test
public void testUnresolvedMetaComponentSubstitutionCompatibility() throws Exception {
ComponentIdResolver resolver = createComponentIdResolver();
resolver.addId(META_CLIENT_ID);
resolver.resolve(evaluateComponentExpression("#{testBean.linkInRegion}"));
Set<String> resolvedIds = resolver.getResolvedIds();
assertEquals(asSet("firstRegion"), resolvedIds);
}
@Test
public void testUnresolvedMetaComponentSubstitution() throws Exception {
ComponentIdResolver resolver = createComponentIdResolver();
resolver.addId(META_CLIENT_ID);
resolver.resolve(evaluateComponentExpression("#{testBean.linkOutRegion}"));
Set<String> resolvedIds = resolver.getResolvedIds();
assertEquals(asSet(AjaxConstants.ALL), resolvedIds);
}
}