/* * JBoss, Home of Professional Open Source * Copyright 2010-2016, 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.tests.metamer.ftest.abstractions; import static org.richfaces.fragment.dataScroller.DataScroller.DataScrollerSwitchButton.FIRST; import static org.richfaces.fragment.dataScroller.DataScroller.DataScrollerSwitchButton.LAST; import static org.richfaces.tests.metamer.ftest.richDataTable.DataTableAttributes.sortMode; import static org.testng.Assert.assertEquals; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.richfaces.fragment.dataTable.AbstractTable; import org.richfaces.model.SortMode; import org.richfaces.tests.metamer.ftest.abstractions.fragments.FilteringRowInterface; import org.richfaces.tests.metamer.ftest.abstractions.fragments.SortingHeaderInterface; import org.richfaces.tests.metamer.ftest.richDataTable.DataTableAttributes; import org.richfaces.tests.metamer.ftest.webdriver.Attributes; import org.richfaces.tests.metamer.model.Employee; /** * @author <a href="mailto:jhuska@redhat.com">Juraj Huska</a> */ public abstract class DataTableSortingTest extends AbstractDataTableTest { private final Attributes<DataTableAttributes> dataTableAttributes = getAttributes(); private boolean isBuiltIn = false; private int modelIndex; private List<Employee> sortedEmployees; /** * Created a list containing five number of rows to be tested. These number are relative to the amount of rows visible on * page. * * @param visiblePageRows number of visible table rows on page * @return List containing five numbers (int) of rows to test. These numbers are relative to number of rows on page. */ private List<Integer> getListWithTestPages(int visiblePageRows) { List<Integer> rowsToTest = new ArrayList<Integer>(); rowsToTest.add(0); // first item rowsToTest.add((int) Math.round((visiblePageRows - 1) / 2 - 0.5 * (visiblePageRows - 1) / 2)); // item in first quarter rowsToTest.add(Math.round((visiblePageRows - 1) / 2)); // item in half rowsToTest.add((int) Math.round((visiblePageRows - 1) / 2 + 0.5 * (visiblePageRows - 1) / 2)); // item in third quarter rowsToTest.add(visiblePageRows - 1); // last item return Collections.unmodifiableList(rowsToTest); } public <T> Comparator<T> getPropertyComparator(final Class<T> classT, final String... properties) { return new Comparator<T>() { @Override public int compare(T o1, T o2) { for (String property : properties) { boolean reverse = property.endsWith("-"); String getterName = "get" + StringUtils.capitalize(property.replace("-", "")); try { Method getter = classT.getMethod(getterName); Object got1 = getter.invoke(o1); Object got2 = getter.invoke(o2); int result; if (String.class.equals(getter.getReturnType())) { Method comparecompareToIgnoreCase = got1.getClass().getMethod("compareToIgnoreCase", got2.getClass()); result = (Integer) comparecompareToIgnoreCase.invoke(got1, got2); } else if (got1 instanceof Comparable<?> && got1 instanceof Comparable<?>) { result = ((Comparable) got1).compareTo(got2); // Method compareTo = got1.getClass().getMethod("compareTo", got2.getClass()); // result = (Integer) compareTo.invoke(got1, got2); } else { throw new IllegalStateException("Cannot compare values"); } if (result != 0) { if (reverse) { return -result; } else { return result; } } } catch (Exception e) { throw new IllegalArgumentException("Cannot obtain property '" + property + "'", e); } } return 0; } }; } protected abstract AbstractTable<? extends SortingHeaderInterface, ? extends FilteringRowInterface, ?> getTable(); public void setBuiltIn(boolean isBuiltIn) { this.isBuiltIn = isBuiltIn; } public void sortByColumn(int column) { switch (column) { case COLUMN_SEX: getTable().getHeader().sortBySex(isBuiltIn); break; case COLUMN_NAME: getTable().getHeader().sortByName(isBuiltIn); break; case COLUMN_TITLE: getTable().getHeader().sortByTitle(isBuiltIn); break; case COLUMN_NUMBER_OF_KIDS1: getTable().getHeader().sortByNumberOfKids(isBuiltIn); break; default: throw new IllegalArgumentException("Wrong number of column passed! Such does not exist!"); } } public void testSortModeMulti() { dataTableAttributes.set(sortMode, SortMode.multi); sortByColumn(COLUMN_TITLE); verifySortingByColumns("title"); sortByColumn(COLUMN_SEX); verifySortingByColumns("title", "sex"); sortByColumn(COLUMN_NUMBER_OF_KIDS1); verifySortingByColumns("title", "sex", "numberOfKids"); sortByColumn(COLUMN_NAME); verifySortingByColumns("title", "sex", "numberOfKids", "name"); } public void testSortModeMultiFullPageRefresh() { dataTableAttributes.set(sortMode, SortMode.multi); sortByColumn(COLUMN_TITLE); verifySortingByColumns("title"); sortByColumn(COLUMN_NUMBER_OF_KIDS1); sortByColumn(COLUMN_NUMBER_OF_KIDS1); verifySortingByColumns("title", "numberOfKids-"); sortByColumn(COLUMN_TITLE); verifySortingByColumns("numberOfKids-", "title-"); getMetamerPage().fullPageRefresh(); verifySortingByColumns("numberOfKids-", "title-"); } public void testSortModeMultiReplacingOldOccurences() { dataTableAttributes.set(sortMode, SortMode.multi); sortByColumn(COLUMN_TITLE); verifySortingByColumns("title"); sortByColumn(COLUMN_NUMBER_OF_KIDS1); sortByColumn(COLUMN_NUMBER_OF_KIDS1); verifySortingByColumns("title", "numberOfKids-"); sortByColumn(COLUMN_TITLE); verifySortingByColumns("numberOfKids-", "title-"); } public void testSortModeMultiRerenderAll() { dataTableAttributes.set(sortMode, SortMode.multi); sortByColumn(COLUMN_TITLE); verifySortingByColumns("title"); sortByColumn(COLUMN_NUMBER_OF_KIDS1); sortByColumn(COLUMN_NUMBER_OF_KIDS1); verifySortingByColumns("title", "numberOfKids-"); sortByColumn(COLUMN_TITLE); verifySortingByColumns("numberOfKids-", "title-"); getMetamerPage().rerenderAll(); verifySortingByColumns("numberOfKids-", "title-"); } public void testSortModeMultiReverse() { dataTableAttributes.set(sortMode, SortMode.multi); sortByColumn(COLUMN_TITLE); sortByColumn(COLUMN_TITLE); verifySortingByColumns("title-"); sortByColumn(COLUMN_SEX); sortByColumn(COLUMN_SEX); verifySortingByColumns("title-", "sex-"); sortByColumn(COLUMN_NUMBER_OF_KIDS1); sortByColumn(COLUMN_NUMBER_OF_KIDS1); verifySortingByColumns("title-", "sex-", "numberOfKids-"); sortByColumn(COLUMN_NAME); sortByColumn(COLUMN_NAME); verifySortingByColumns("title-", "sex-", "numberOfKids-", "name-"); } public void testSortModeSingle() { dataTableAttributes.set(sortMode, SortMode.single); sortByColumn(COLUMN_TITLE); verifySortingByColumns("title"); sortByColumn(COLUMN_SEX); verifySortingByColumns("sex"); sortByColumn(COLUMN_NUMBER_OF_KIDS1); verifySortingByColumns("numberOfKids"); sortByColumn(COLUMN_TITLE); verifySortingByColumns("title"); } public void testSortModeSingleFullPageRefresh() { dataTableAttributes.set(sortMode, SortMode.single); sortByColumn(COLUMN_NUMBER_OF_KIDS1); verifySortingByColumns("numberOfKids"); sortByColumn(COLUMN_TITLE); verifySortingByColumns("title"); getMetamerPage().fullPageRefresh(); verifySortingByColumns("title"); } public void testSortModeSingleRerenderAll() { dataTableAttributes.set(sortMode, SortMode.single); sortByColumn(COLUMN_NAME); verifySortingByColumns("name"); sortByColumn(COLUMN_NUMBER_OF_KIDS1); verifySortingByColumns("numberOfKids"); getMetamerPage().rerenderAll(); verifySortingByColumns("numberOfKids"); } public void testSortModeSingleReverse() { dataTableAttributes.set(sortMode, SortMode.single); sortByColumn(COLUMN_SEX); sortByColumn(COLUMN_SEX); verifySortingByColumns("sex-"); sortByColumn(COLUMN_TITLE); sortByColumn(COLUMN_TITLE); verifySortingByColumns("title-"); sortByColumn(COLUMN_NUMBER_OF_KIDS1); sortByColumn(COLUMN_NUMBER_OF_KIDS1); verifySortingByColumns("numberOfKids-"); sortByColumn(COLUMN_NAME); sortByColumn(COLUMN_NAME); verifySortingByColumns("name-"); } public void verifyRow(int rowIndex, int modelIndex) { verifyRow(rowIndex, modelIndex, Collections.<Integer>emptySet()); } public void verifyRow(int rowIndex, int modelIndex, Set<Integer> hiddenColumns) { Employee employee = sortedEmployees.get(modelIndex); FilteringRowInterface row = getTable().getRow(rowIndex); if (hiddenColumns.contains(0)) { assertNotVisible(row.getSexColumnElement(), "Column should not be visible."); } else { assertEquals(row.getSexColumnValue(), employee.getSex()); } if (hiddenColumns.contains(1)) { assertNotVisible(row.getNameColumnElement(), "Column should not be visible."); } else { assertEquals(row.getNameColumnValue(), employee.getName()); } if (hiddenColumns.contains(2)) { assertNotVisible(row.getTitleColumnElement(), "Column should not be visible."); } else { assertEquals(row.getTitleColumnValue(), employee.getTitle()); } if (hiddenColumns.contains(3)) { assertNotVisible(row.getNumberOfKids1ColumnElement(), "Column should not be visible."); } else { assertEquals(row.getNumberOfKids1ColumnValue(), employee.getNumberOfKids()); } } public void verifySortingByColumns(String... columns) { verifySortingByColumns(Collections.<Integer>emptySet(), columns); } public void verifySortingByColumns(Set<Integer> hiddenColumns, String... columns) { Comparator<Employee> employeeComparator = getPropertyComparator(Employee.class, columns); sortedEmployees = new ArrayList<Employee>(EMPLOYEES); Collections.sort(sortedEmployees, employeeComparator); if (dataScroller2.hasPages() && dataScroller2.getActivePageNumber() != 1) { jsUtils.scrollToView(dataScroller2.advanced().getButtonElement(FIRST)); dataScroller2.switchTo(FIRST); } int pageRows = getTable().advanced().getNumberOfVisibleRows(); for (Integer row : getListWithTestPages(pageRows)) { verifyRow(row, row, hiddenColumns); } jsUtils.scrollToView(dataScroller2.advanced().getButtonElement(LAST)); dataScroller2.switchTo(LAST); pageRows = getTable().advanced().getNumberOfVisibleRows(); for (Integer row : getListWithTestPages(pageRows)) { modelIndex = EMPLOYEES.size() - pageRows + row; verifyRow(row, modelIndex, hiddenColumns); } } }