/*
* JBoss, Home of Professional Open Source
* Copyright ${year}, 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.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.faces.context.FacesContext;
import javax.faces.model.ArrayDataModel;
import javax.faces.model.DataModelEvent;
import javax.faces.model.DataModelListener;
import org.junit.Assert;
import org.jboss.test.faces.AbstractFacesTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.richfaces.component.SortOrder;
import org.ajax4jsf.model.DataVisitResult;
import org.ajax4jsf.model.DataVisitor;
import org.ajax4jsf.model.ExtendedDataModel;
import org.ajax4jsf.model.SequenceDataModel;
import org.ajax4jsf.model.SequenceRange;
/**
* @author Konstantin Mishin
*
*/
public class ArrangeableModelTest extends AbstractFacesTest {
public class User {
private String fname;
private String lname;
public User(String fname, String lname) {
super();
this.fname = fname;
this.lname = lname;
}
public String getFname() {
return fname;
}
public String getLname() {
return lname;
}
}
private static final int ROWS = 2;
private static final int ROW_KEY = 4;
private static final List<Integer> FILTERD_AND_SORTED_ROW_KEYS = Arrays.asList(5, 3, 2, 0);
private User[] users = { new User("C", "A"), new User("a", "a"), new User("B", "B"), new User("B", "C"),
new User("b", "b"), new User("A", "A") };
private ExtendedDataModel<User> extendedDataModel;
private ArrangeableModel arrangeableModel;
@Before
public void setUp() throws Exception {
super.setUp();
setupFacesRequest();
extendedDataModel = new SequenceDataModel<User>(new ArrayDataModel<User>(users));
arrangeableModel = new ArrangeableModel(extendedDataModel, "var", "filterVar");
ExpressionFactory expressionFactory = facesContext.getApplication().getExpressionFactory();
ELContext elContext = facesContext.getELContext();
FilterField[] filterFields = {
new FilterField(null, new Filter<User>() {
public boolean accept(User t) {
return t.getFname().indexOf('a') == -1;
}
}, null),
new FilterField(expressionFactory.createValueExpression(elContext, "#{var.lname != filterVar}", Object.class),
null, "b") };
SortField[] sortFields = {
new SortField(expressionFactory.createValueExpression(elContext, "#{var.fname}", Object.class), null,
SortOrder.ascending), new SortField(null, new Comparator<User>() {
public int compare(User o1, User o2) {
return o1.getLname().compareTo(o2.getLname());
}
}, SortOrder.descending) };
arrangeableModel.arrange(facesContext,
new ArrangeableStateDefaultImpl(Arrays.asList(filterFields), Arrays.asList(sortFields), null));
}
@After
public void tearDown() throws Exception {
extendedDataModel = null;
arrangeableModel = null;
super.tearDown();
}
/**
* Test method for {@link org.richfaces.model.ArrangeableModel#isRowAvailable()}.
*/
@Test
public void testIsRowAvailable() {
arrangeableModel.setRowKey(null);
Assert.assertFalse(extendedDataModel.isRowAvailable());
arrangeableModel.setRowKey(ROW_KEY);
Assert.assertTrue(extendedDataModel.isRowAvailable());
arrangeableModel.setRowKey(extendedDataModel.getRowCount());
Assert.assertFalse(extendedDataModel.isRowAvailable());
}
/**
* Test method for {@link org.richfaces.model.ArrangeableModel#getRowCount()}.
*/
@Test
public void testGetRowCount() {
Assert.assertEquals(ROW_KEY, arrangeableModel.getRowCount());
}
/**
* Test method for {@link org.richfaces.model.ArrangeableModel#setRowIndex(int)} and
* {@link org.richfaces.model.ArrangeableModel#getRowIndex()}.
*/
@Test
public void testRowIndex() {
arrangeableModel.setRowIndex(-1);
Assert.assertNull(extendedDataModel.getRowKey());
Assert.assertEquals(arrangeableModel.getRowIndex(), -1);
arrangeableModel.setRowIndex(arrangeableModel.getRowCount() - 1);
Assert.assertEquals(0, extendedDataModel.getRowKey());
Assert.assertEquals(arrangeableModel.getRowIndex(), arrangeableModel.getRowCount() - 1);
arrangeableModel.setRowIndex(extendedDataModel.getRowCount());
Assert.assertNull(extendedDataModel.getRowKey());
Assert.assertEquals(arrangeableModel.getRowIndex(), -1);
}
/**
* Test method for {@link org.richfaces.model.ArrangeableModel#setRowKey(java.lang.Object)} and
* {@link org.richfaces.model.ArrangeableModel#getRowKey()}.
*/
@Test
public void testRowKey() {
arrangeableModel.setRowKey(null);
Assert.assertNull(extendedDataModel.getRowKey());
arrangeableModel.setRowKey(ROW_KEY);
Assert.assertEquals(ROW_KEY, extendedDataModel.getRowKey());
Assert.assertEquals(ROW_KEY, arrangeableModel.getRowKey());
arrangeableModel.setRowKey(extendedDataModel.getRowCount());
Assert.assertEquals(extendedDataModel.getRowCount(), extendedDataModel.getRowKey());
}
/**
* Test method for
* {@link org.richfaces.model.ArrangeableModel#walk(javax.faces.context.FacesContext, org.richfaces.model.DataVisitor, org.richfaces.model.Range, java.lang.Object)}
* .
*/
@Test
public void testWalk() {
final List<Object> rowKeys = new ArrayList<Object>();
DataVisitor visitor = new DataVisitor() {
public DataVisitResult process(FacesContext context, Object rowKey, Object argument) {
arrangeableModel.setRowKey(rowKey);
if (arrangeableModel.isRowAvailable()) {
rowKeys.add(rowKey);
}
return DataVisitResult.CONTINUE;
}
};
arrangeableModel.walk(facesContext, visitor, new SequenceRange(0, -1), null);
Assert.assertEquals(FILTERD_AND_SORTED_ROW_KEYS, rowKeys);
rowKeys.clear();
arrangeableModel.walk(facesContext, visitor, new SequenceRange(0, ROWS), null);
Assert.assertEquals(FILTERD_AND_SORTED_ROW_KEYS.subList(0, ROWS), rowKeys);
}
/**
* Test method for {@link org.richfaces.model.ArrangeableModel#addDataModelListener(javax.faces.model.DataModelListener)}
* {@link org.richfaces.model.ArrangeableModel#removeDataModelListener(javax.faces.model.DataModelListener)} and
* {@link org.richfaces.model.ArrangeableModel#getDataModelListeners()}.
*/
@Test
public void testDataModelListener() {
Assert.assertEquals(0, extendedDataModel.getDataModelListeners().length);
DataModelListener listener = new DataModelListener() {
public void rowSelected(DataModelEvent event) {
}
};
arrangeableModel.addDataModelListener(listener);
Assert.assertSame(listener, extendedDataModel.getDataModelListeners()[0]);
Assert.assertSame(listener, arrangeableModel.getDataModelListeners()[0]);
arrangeableModel.removeDataModelListener(listener);
Assert.assertEquals(0, extendedDataModel.getDataModelListeners().length);
}
/**
* Test method for {@link org.richfaces.model.ArrangeableModel#getRowData()}.
*/
@Test
public void testGetRowData() {
boolean caught = false;
arrangeableModel.setRowKey(null);
try {
arrangeableModel.getRowData();
} catch (IllegalArgumentException e) {
caught = true;
} finally {
Assert.assertTrue(caught);
}
arrangeableModel.setRowKey(ROW_KEY);
Assert.assertEquals(arrangeableModel.getRowData(), extendedDataModel.getRowData());
caught = false;
arrangeableModel.setRowKey(extendedDataModel.getRowCount());
try {
arrangeableModel.getRowData();
} catch (IllegalArgumentException e) {
caught = true;
} finally {
Assert.assertTrue(caught);
}
}
/**
* Test method for {@link org.richfaces.model.ArrangeableModel#setWrappedData(java.lang.Object)} and
* {@link org.richfaces.model.ArrangeableModel#getWrappedData()}.
*/
@Test
public void testWrappedData() {
Assert.assertSame(users, arrangeableModel.getWrappedData());
Object[] objects = new Object[0];
arrangeableModel.setWrappedData(objects);
Assert.assertSame(objects, arrangeableModel.getWrappedData());
}
}