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.trinidad.model;
20  
21  import java.util.ArrayList;
22  import java.util.Collections;
23  import java.util.List;
24  import javax.faces.model.DataModel;
25  import javax.faces.model.ListDataModel;
26  
27  import junit.framework.Test;
28  import junit.framework.TestSuite;
29  
30  import org.apache.myfaces.trinidad.model.CollectionModel;
31  import org.apache.myfaces.trinidad.model.SortCriterion;
32  import org.apache.myfaces.trinidad.model.SortableModel;
33  import org.apache.shale.test.base.AbstractJsfTestCase;
34  
35  /**
36   */
37  public class SortableModelTest extends AbstractJsfTestCase
38  {
39    public SortableModelTest(String name)
40    {
41      super(name);
42    }
43  
44    @Override
45    protected void setUp() throws Exception
46    {
47      super.setUp();
48    }
49  
50    @Override
51    protected void tearDown() throws Exception
52    {
53      super.tearDown();
54    }
55    
56    public static Test suite()
57    {
58      return new TestSuite(SortableModelTest.class);
59    }
60    
61    public void testInitialSort()
62    {
63      DataModel dModel = _createTestDataModel();
64      SortableModel sModel = new SortableModel(dModel);
65      _testInitialSort(sModel);
66    }
67  
68    private void _testInitialSort(SortableModel sModel)
69    {
70      sModel.setRowIndex(0);
71      assertTrue(sModel.getRowData() == _bean1);
72      sModel.setRowIndex(1);
73      assertTrue(sModel.getRowData() == _bean2);
74      sModel.setRowIndex(2);
75      assertTrue(sModel.getRowData() == _bean3);
76    }
77    
78    public void testRowCount()
79    {
80      DataModel dModel = _createTestDataModel();
81      SortableModel sModel = new SortableModel(dModel);
82      assertTrue(sModel.getRowCount() == dModel.getRowCount());    
83      _sort(sModel, "name", true);    
84      assertTrue(sModel.getRowCount() == dModel.getRowCount());    
85    }
86  
87    public void testSortableProperties()
88    {
89      DataModel dModel = _createTestDataModel();
90      SortableModel sModel = new SortableModel(dModel);
91      assertTrue(sModel.isSortable("age"));
92      assertTrue(sModel.isSortable("name"));
93      assertFalse(sModel.isSortable("object"));
94    }
95  
96    public void testSortAscending()
97    {
98      DataModel dModel = _createTestDataModel();
99      SortableModel sModel = new SortableModel(dModel);
100     _sort(sModel, "name", true);    
101 
102 
103 //    for (int i=0; i<sModel.getRowCount(); i++)
104 //    {
105 //      sModel.setRowIndex(i);
106 //      System.out.println("i:"+i+" data:"+sModel.getRowData());
107 //    }
108 
109     sModel.setRowIndex(0);
110     assertTrue(sModel.getRowData() == _bean2);
111     sModel.setRowIndex(1);
112     assertTrue(sModel.getRowData() == _bean1);
113     sModel.setRowIndex(2);
114     assertTrue(sModel.getRowData() == _bean3);
115   }
116   
117   public void testUnsort()
118   {
119     DataModel dModel = _createTestDataModel();
120     SortableModel sModel = new SortableModel(dModel);
121     _sort(sModel, "name", true);    
122 
123     sModel.setSortCriteria(null);
124     _testInitialSort(sModel);
125   }
126   
127   public void testSortDescending()
128   {
129     DataModel dModel = _createTestDataModel();
130     SortableModel sModel = new SortableModel(dModel);
131     _sort(sModel, "age", false);    
132     sModel.setRowIndex(0);
133     assertTrue(sModel.getRowData() == _bean2);
134     sModel.setRowIndex(1);
135     assertTrue(sModel.getRowData() == _bean3);
136     sModel.setRowIndex(2);
137     assertTrue(sModel.getRowData() == _bean1);
138   }
139   
140 
141   // Test sorting an empty model - see bug 4258884
142   public void testEmptyTable()
143   {
144     DataModel emptyModel = new ListDataModel(new ArrayList<Bean>());
145     SortableModel sModel = new SortableModel(emptyModel);
146     _sort(sModel, "age", false);    
147   }
148 
149   public void testGetRowIndex()
150   {
151     DataModel dModel = _createTestDataModel();
152     SortableModel sModel = new SortableModel(dModel);
153     _sort(sModel, "age", true);    
154 
155     dModel.setRowIndex(2); //Zach
156     assertTrue(sModel.getRowIndex() == 1);
157     dModel.setRowIndex(0); //Tracy
158     assertTrue(sModel.getRowIndex() == 0);
159     dModel.setRowIndex(1); //Anne
160     assertTrue(sModel.getRowIndex() == 2);
161   }
162 
163   public void testSetRowIndex()
164   {
165     DataModel dModel = _createTestDataModel();
166     SortableModel sModel = new SortableModel(dModel);
167     _sort(sModel, "age", true);    
168 
169     sModel.setRowIndex(1); //Zach
170     assertTrue(dModel.getRowIndex() == 2);
171     sModel.setRowIndex(0); //Tracy
172     assertTrue(dModel.getRowIndex() == 0);
173     sModel.setRowIndex(2); //Anne
174     assertTrue(dModel.getRowIndex() == 1);
175   }
176   
177   private DataModel _createTestDataModel()
178   {
179     List<Bean> list = new ArrayList<Bean>(3);
180     list.add(_bean1);
181     list.add(_bean2);
182     list.add(_bean3);
183     return new ListDataModel(Collections.unmodifiableList(list));
184   }
185 
186   private void _sort(CollectionModel model, 
187                      String property, boolean isAscending)
188   {
189     SortCriterion criterion = new SortCriterion(property, isAscending);
190     model.setSortCriteria(Collections.singletonList(criterion));
191   }
192   
193   private final Bean _bean1 = new Bean(10, "Tracy");
194   private final Bean _bean2 = new Bean(15, "Anne");
195   private final Bean _bean3 = new Bean(12, "Zach");
196   
197   public static final class Bean
198   {
199     public Bean(int age, String name)
200     {
201       _age = age;
202       _name = name;
203       _obj = new Object();
204     }
205     
206     public int getAge()
207     {
208       return _age;
209     }
210     
211     public String getName()
212     {
213       return _name;
214     }
215     
216     // this is not sortable
217     public Object getObject()
218     {
219       return _obj;
220     }
221     
222     @Override
223     public String toString()
224     {
225       return "name:"+_name+" age:"+_age;
226     }
227     
228     private final int _age;
229     private final String _name;
230     private final Object _obj;
231   }
232 }