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.UIColumn;
26  import javax.faces.component.behavior.AjaxBehavior;
27  import javax.faces.component.html.HtmlDataTable;
28  import javax.faces.component.html.HtmlOutputText;
29  import javax.faces.model.ListDataModel;
30  
31  import junit.framework.Test;
32  import junit.framework.TestSuite;
33  
34  import org.apache.myfaces.test.base.AbstractJsfTestCase;
35  import org.apache.myfaces.test.mock.MockRenderKitFactory;
36  import org.apache.myfaces.test.mock.MockResponseWriter;
37  import org.apache.myfaces.test.utils.HtmlCheckAttributesUtil;
38  import org.apache.myfaces.test.utils.HtmlRenderedAttr;
39  
40  /**
41   * @author Bruno Aranda (latest modification by $Author$)
42   * @version $Revision$ $Date$
43   */
44  public class HtmlTableRendererTest extends AbstractJsfTestCase
45  {
46      private MockResponseWriter writer ;
47      private HtmlDataTable dataTable;
48  
49      public HtmlTableRendererTest(String name)
50      {
51          super(name);
52      }
53      
54      public static Test suite() {
55          return new TestSuite(HtmlTableRendererTest.class);
56      }
57  
58      public void setUp() throws Exception
59      {
60          super.setUp();
61  
62          dataTable = new HtmlDataTable();
63  
64          writer = new MockResponseWriter(new StringWriter(), null, null);
65          facesContext.setResponseWriter(writer);
66  
67          facesContext.getViewRoot().setRenderKitId(MockRenderKitFactory.HTML_BASIC_RENDER_KIT);
68          facesContext.getRenderKit().addRenderer(
69                  dataTable.getFamily(),
70                  dataTable.getRendererType(),
71                  new HtmlTableRenderer());
72  
73          HtmlOutputText text = new HtmlOutputText();
74          facesContext.getRenderKit().addRenderer(
75                  text.getFamily(),
76                  text.getRendererType(),
77                  new HtmlTextRenderer());
78  
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          dataTable = null;
86          writer = null;
87      }
88  
89      public void testHtmlPropertyPassTru() throws Exception
90      {
91          HtmlRenderedAttr[] attrs = HtmlCheckAttributesUtil.generateBasicReadOnlyAttrs();
92          
93          HtmlCheckAttributesUtil.checkRenderedAttributes(
94                  dataTable, facesContext, writer, attrs);
95          if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs)) {
96              fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
97          }
98      }
99      
100     public void testHtmlPropertyPassTruNotRendered() throws Exception
101     {
102         HtmlRenderedAttr[] attrs = HtmlCheckAttributesUtil.generateAttrsNotRenderedForReadOnly();
103         
104         HtmlCheckAttributesUtil.checkRenderedAttributes(
105                 dataTable, facesContext, writer, attrs);
106         if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs)) {
107             fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
108         }
109     }
110     
111     /**
112      * Components that render client behaviors should always render "id" and "name" attribute
113      */
114     public void testClientBehaviorHolderRendersIdAndName() 
115     {
116         dataTable.addClientBehavior("keypress", new AjaxBehavior());
117         try 
118         {
119             dataTable.encodeAll(facesContext);
120             String output = ((StringWriter) writer.getWriter()).getBuffer().toString();
121             assertTrue(output.matches("(?s).+id=\".+\".+"));
122             assertTrue(output.matches("(?s).+name=\".+\".+"));
123         }
124         catch (Exception e)
125         {
126             fail(e.getMessage());
127         }
128         
129     }
130     
131     /**
132      * Check table renderer behavior when DataModel returns -1 from getRowCount(). It should
133      * render the same as if that value is provided. Note t:dataTable newspaper mode requires
134      * row count to calculate newspaperRows and newspaperColumns. 
135      */
136     public void testNoRowCountRender()
137     {
138         List<Person> list = new ArrayList<Person>();
139         list.add(new Person("John"  , "Smith"));
140         list.add(new Person("Pepito", "Perez"));
141         list.add(new Person("Kurt",   "Kobain"));
142         
143         dataTable.setId("data");
144         dataTable.setRowClasses("class1, class2");
145         dataTable.setVar("person");
146         
147         UIColumn column1 = new UIColumn();
148         HtmlOutputText text = new HtmlOutputText();
149         text.setValueExpression("value", 
150                 facesContext.getApplication().getExpressionFactory().createValueExpression(
151                         facesContext.getELContext(), "#{person.firstName}", String.class));
152         column1.getChildren().add(text);
153         
154         dataTable.getChildren().add(column1);
155         UIColumn column2 = new UIColumn();
156         HtmlOutputText text2 = new HtmlOutputText();
157         text2.setValueExpression("value", 
158                 facesContext.getApplication().getExpressionFactory().createValueExpression(
159                         facesContext.getELContext(), "#{person.lastName}", String.class));
160         column2.getChildren().add(text2);
161         dataTable.getChildren().add(column2);
162 
163         dataTable.setValue(new UnknownRowCountDemoDataModel<Person>(list));
164 
165         String output1 = null;
166         try 
167         {
168             dataTable.encodeAll(facesContext);
169             output1 = ((StringWriter) writer.getWriter()).getBuffer().toString();
170         }
171         catch (Exception e)
172         {
173             fail(e.getMessage());
174         }
175         
176         dataTable.setValue(new ListDataModel<Person>(list));
177         ((StringWriter) writer.getWriter()).getBuffer().setLength(0);
178         
179         String output2 = null;
180         try 
181         {
182             dataTable.encodeAll(facesContext);
183             output2 = ((StringWriter) writer.getWriter()).getBuffer().toString();
184         }
185         catch (Exception e)
186         {
187             fail(e.getMessage());
188         }
189         
190         assertTrue(output2.contains("John"));
191         assertTrue(output2.contains("Smith"));
192         assertTrue(output2.contains("class1"));
193         assertTrue(output2.contains("class2"));
194         
195         assertTrue(output1.contains("John"));
196         assertTrue(output1.contains("Smith"));
197         assertTrue(output1.contains("class1"));
198         assertTrue(output1.contains("class2"));
199         
200         assertEquals(output2, output1);
201     }
202 
203     public class Person
204     {
205         private String firstName;
206         
207         private String lastName;
208         
209         public Person(String firstName, String lastName)
210         {
211             this.firstName = firstName;
212             this.lastName = lastName;
213         }
214         
215         public String getFirstName()
216         {
217             return firstName;
218         }
219         
220         public void setFirstName(String firstName)
221         {
222             this.firstName = firstName;
223         }
224         
225         public String getLastName()
226         {
227             return lastName;
228         }
229         
230         public void setLastName(String lastName)
231         {
232             this.lastName = lastName;
233         }
234     }
235     
236     public class UnknownRowCountDemoDataModel<E> extends ListDataModel<E>
237     {
238         public UnknownRowCountDemoDataModel()
239         {
240             super();
241         }
242 
243         public UnknownRowCountDemoDataModel(List<E> list)
244         {
245             super(list);
246         }
247         
248         @Override
249         public int getRowCount()
250         {
251             return -1;
252         }
253     }
254 }