View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.renderkit.html;
20  
21  import java.io.StringWriter;
22  import java.util.ArrayList;
23  import java.util.List;
24  
25  import javax.faces.component.UISelectItem;
26  import javax.faces.component.UISelectItems;
27  import javax.faces.component.behavior.AjaxBehavior;
28  import javax.faces.component.html.HtmlSelectManyMenu;
29  import javax.faces.component.html.HtmlSelectOneMenu;
30  import javax.faces.model.SelectItem;
31  
32  import junit.framework.Test;
33  import junit.framework.TestSuite;
34  
35  import org.apache.myfaces.test.utils.HtmlCheckAttributesUtil;
36  import org.apache.myfaces.test.utils.HtmlRenderedAttr;
37  import org.apache.myfaces.test.base.AbstractJsfTestCase;
38  import org.apache.myfaces.test.mock.MockRenderKitFactory;
39  import org.apache.myfaces.test.mock.MockResponseWriter;
40  
41  /**
42   * @author Bruno Aranda (latest modification by $Author: lu4242 $)
43   * @version $Revision: 942849 $ $Date: 2010-05-10 14:10:01 -0500 (Mon, 10 May 2010) $
44   */
45  public class HtmlMenuRendererTest extends AbstractJsfTestCase
46  {
47      private MockResponseWriter writer ;
48      private HtmlSelectOneMenu selectOneMenu;
49      private HtmlSelectManyMenu selectManyMenu;
50  
51      public HtmlMenuRendererTest(String name)
52      {
53          super(name);
54      }
55      
56      public static Test suite() {
57          return new TestSuite(HtmlMenuRendererTest.class);
58      }
59  
60      public void setUp() throws Exception
61      {
62          super.setUp();
63  
64          selectOneMenu = new HtmlSelectOneMenu();
65          selectManyMenu = new HtmlSelectManyMenu();
66  
67          writer = new MockResponseWriter(new StringWriter(), null, null);
68          facesContext.setResponseWriter(writer);
69  
70          facesContext.getViewRoot().setRenderKitId(MockRenderKitFactory.HTML_BASIC_RENDER_KIT);
71          facesContext.getRenderKit().addRenderer(
72                  selectOneMenu.getFamily(),
73                  selectOneMenu.getRendererType(),
74                  new HtmlMenuRenderer());
75          facesContext.getRenderKit().addRenderer(
76                  selectManyMenu.getFamily(),
77                  selectManyMenu.getRendererType(),
78                  new HtmlMenuRenderer());
79          facesContext.getAttributes().put("org.apache.myfaces.RENDERED_JSF_JS", Boolean.TRUE);
80      }
81  
82      public void tearDown() throws Exception
83      {
84          super.tearDown();
85          selectOneMenu = null;
86          selectManyMenu = null;
87          writer = null;
88      }
89  
90      public void testSelectOneHtmlPropertyPassTru() throws Exception
91      {
92          HtmlRenderedAttr[] attrs = HtmlCheckAttributesUtil.generateBasicAttrs();
93          
94          List items = new ArrayList();
95          items.add(new SelectItem("mars"));
96  
97          UISelectItems selectItems = new UISelectItems();
98          selectItems.setValue(items);
99  
100         selectOneMenu.getChildren().add(selectItems);
101         
102         HtmlCheckAttributesUtil.checkRenderedAttributes(
103                 selectOneMenu, facesContext, writer, attrs);
104         if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs)) {
105             fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
106         }
107     }
108     
109     public void testSelectManyHtmlPropertyPassTru() throws Exception
110     {
111         HtmlRenderedAttr[] attrs = HtmlCheckAttributesUtil.generateBasicAttrs();
112         
113         List items = new ArrayList();
114         items.add(new SelectItem("mars"));
115 
116         UISelectItems selectItems = new UISelectItems();
117         selectItems.setValue(items);
118 
119         selectManyMenu.getChildren().add(selectItems);
120         
121         HtmlCheckAttributesUtil.checkRenderedAttributes(
122                 selectManyMenu, facesContext, writer, attrs);
123         if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs)) {
124             fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
125         }
126     }
127     
128     /**
129      * Components that render client behaviors should always render "id" and "name" attribute
130      */
131     public void testClientBehaviorHolderRendersIdAndNameSelectOneMenu() 
132     {
133         UISelectItem item1 = new UISelectItem();
134         item1.setItemLabel("#1");
135         item1.setItemValue("#1");
136         
137         UISelectItem item2 = new UISelectItem();
138         item2.setItemLabel("#2");
139         item2.setItemValue("#2");
140         
141         selectOneMenu.addClientBehavior("keypress", new AjaxBehavior());
142         try 
143         {
144             selectOneMenu.getChildren().add(item1);
145             selectOneMenu.getChildren().add(item2);
146             selectOneMenu.encodeAll(facesContext);
147             String output = ((StringWriter) writer.getWriter()).getBuffer().toString();
148             assertTrue(output.matches(".+id=\".+\".+"));
149             assertTrue(output.matches(".+name=\".+\".+"));
150         }
151         catch (Exception e)
152         {
153             fail(e.getMessage());
154         }
155         
156     }
157     
158     /**
159      * Components that render client behaviors should always render "id" and "name" attribute
160      */
161     public void testClientBehaviorHolderRendersIdAndNameSelectManyMenu() 
162     {
163         UISelectItem item1 = new UISelectItem();
164         item1.setItemLabel("#1");
165         item1.setItemValue("#1");
166         
167         UISelectItem item2 = new UISelectItem();
168         item2.setItemLabel("#2");
169         item2.setItemValue("#2");
170         
171         selectManyMenu.addClientBehavior("keypress", new AjaxBehavior());
172         try 
173         {
174             selectManyMenu.getChildren().add(item1);
175             selectManyMenu.getChildren().add(item2);
176             selectManyMenu.encodeAll(facesContext);
177             String output = ((StringWriter) writer.getWriter()).getBuffer().toString();
178             assertTrue(output.matches(".+id=\".+\".+"));
179             assertTrue(output.matches(".+name=\".+\".+"));
180         }
181         catch (Exception e)
182         {
183             fail(e.getMessage());
184         }
185         
186     }
187 }