/* * JBoss, Home of Professional Open Source * Copyright 2010, 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.component; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.richfaces.renderkit.AjaxConstants.AJAX_COMPONENT_ID_PARAMETER; import static org.richfaces.renderkit.AjaxConstants.ALL; import static org.richfaces.renderkit.AjaxConstants.THIS; import java.util.Collection; import java.util.Iterator; import javax.el.ELContext; import javax.el.ValueExpression; import javax.faces.application.Application; import javax.faces.component.UICommand; import javax.faces.component.UIComponent; import javax.faces.component.UIForm; import javax.faces.component.UIViewRoot; import javax.faces.context.FacesContext; 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; /** * Test page pseudo-code: * * <pre> * <h:form id="form"> * <a4j:testCommandComponent id="testCommand" * binding="#{testCommand}" * execute="#{testCommandExecute}" /> * * <a4j:region id="region"> * <a4j:testCommandComponent id="testCommandRegion" * binding="#{testCommandRegion}" * execute="#{testCommandRegionExecute}" /> * * </a4j:region> * </h:form> * </pre> * * TestCommandComponent is assumed to have execute=@this by default * * @author Nick Belaevski * */ public class RegionTest { private FacesEnvironment environment; private FacesRequest request; private FacesContext facesContext; private UIComponent testCommand; private String testCommandExecute; private UIComponent testCommandRegion; private String testCommandRegionExecute; private String testCommandClientId; private String testCommandRegionClientId; private String regionClientId; @SuppressWarnings("serial") private abstract static class StringFieldValueExpression extends ValueExpression { @Override public Class<?> getExpectedType() { return String.class; } @Override public Class<?> getType(ELContext context) { return String.class; } @Override public boolean isReadOnly(ELContext context) { return false; } @Override public boolean equals(Object obj) { return obj == this; } @Override public String getExpressionString() { return null; } @Override public int hashCode() { return 0; } @Override public boolean isLiteralText() { return false; } } @SuppressWarnings("serial") private ValueExpression createFirstLinkExecuteExpression() { return new StringFieldValueExpression() { @Override public void setValue(ELContext context, Object value) { testCommandExecute = (String) value; } @Override public Object getValue(ELContext context) { return testCommandExecute; } }; } @SuppressWarnings("serial") private ValueExpression createNestedFirstLinkExecuteExpression() { return new StringFieldValueExpression() { @Override public void setValue(ELContext context, Object value) { testCommandRegionExecute = (String) value; } @Override public Object getValue(ELContext context) { return testCommandRegionExecute; } }; } private void createView() { Application application = facesContext.getApplication(); UIViewRoot viewRoot = facesContext.getViewRoot(); UIComponent form = application.createComponent(UIForm.COMPONENT_TYPE); form.setId("form"); viewRoot.getChildren().add(form); testCommand = createTestLink(); testCommand.setId("testCommand"); testCommand.setValueExpression("execute", createFirstLinkExecuteExpression()); form.getChildren().add(testCommand); testCommandClientId = testCommand.getClientId(facesContext); UIComponent region = application.createComponent(AbstractRegion.COMPONENT_TYPE); region.setId("region"); form.getChildren().add(region); regionClientId = region.getClientId(facesContext); testCommandRegion = createTestLink(); testCommandRegion.setId("testCommandRegion"); testCommandRegion.setValueExpression("execute", createNestedFirstLinkExecuteExpression()); region.getChildren().add(testCommandRegion); testCommandRegionClientId = testCommandRegion.getClientId(facesContext); } private UIComponent createTestLink() { return facesContext.getApplication().createComponent(UICommand.COMPONENT_TYPE); } private void setActivatorComponentId(String clientId) { request.withParameter(AJAX_COMPONENT_ID_PARAMETER, clientId); } private <T> void assertSingleElementCollection(T expected, Collection<T> actual) { Iterator<T> iterator = actual.iterator(); assertTrue(iterator.hasNext()); assertEquals(expected, iterator.next()); assertFalse(iterator.hasNext()); } @Before public void setUp() throws Exception { environment = FacesEnvironment.createEnvironment(); environment.start(); request = environment.createFacesRequest(); request.start(); facesContext = FacesContext.getCurrentInstance(); createView(); } @After public void tearDown() throws Exception { testCommandClientId = null; testCommandRegionClientId = null; testCommand = null; testCommandRegion = null; testCommandExecute = null; testCommandRegionExecute = null; facesContext = null; request.release(); request = null; environment.release(); environment = null; } @Test public void testDefaults() throws Exception { setActivatorComponentId(testCommandClientId); Collection<String> executeIds = facesContext.getPartialViewContext().getExecuteIds(); assertSingleElementCollection(testCommandClientId, executeIds); } @Test public void testDefaultsInRegion() throws Exception { setActivatorComponentId(testCommandRegionClientId); Collection<String> executeIds = facesContext.getPartialViewContext().getExecuteIds(); assertSingleElementCollection(regionClientId, executeIds); } @Test public void testExecuteThis() throws Exception { testCommandExecute = THIS; setActivatorComponentId(testCommandClientId); Collection<String> executeIds = facesContext.getPartialViewContext().getExecuteIds(); assertSingleElementCollection(testCommandClientId, executeIds); } @Test public void testExecuteThisInRegion() throws Exception { testCommandRegionExecute = THIS; setActivatorComponentId(testCommandRegionClientId); Collection<String> executeIds = facesContext.getPartialViewContext().getExecuteIds(); assertSingleElementCollection(testCommandRegionClientId, executeIds); } @Test public void testExecuteAll() throws Exception { testCommandExecute = ALL; setActivatorComponentId(testCommandClientId); Collection<String> executeIds = facesContext.getPartialViewContext().getExecuteIds(); assertSingleElementCollection(ALL, executeIds); } @Test public void testExecuteAllInRegion() throws Exception { testCommandRegionExecute = ALL; setActivatorComponentId(testCommandRegionClientId); Collection<String> executeIds = facesContext.getPartialViewContext().getExecuteIds(); assertSingleElementCollection(ALL, executeIds); } @Test public void testExecuteRegion() throws Exception { testCommandExecute = AjaxContainer.META_CLIENT_ID; setActivatorComponentId(testCommandClientId); Collection<String> executeIds = facesContext.getPartialViewContext().getExecuteIds(); assertSingleElementCollection(testCommandClientId, executeIds); } @Test public void testExecuteRegionInRegion() throws Exception { testCommandRegionExecute = AjaxContainer.META_CLIENT_ID; setActivatorComponentId(testCommandRegionClientId); Collection<String> executeIds = facesContext.getPartialViewContext().getExecuteIds(); assertSingleElementCollection(regionClientId, executeIds); } }