/**
* License Agreement.
*
* Rich Faces - Natural Ajax for Java Server Faces (JSF)
*
* Copyright (C) 2007 Exadel, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* This library 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 library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.ajax4jsf.component;
import java.util.ArrayList;
import javax.faces.component.UIColumn;
import javax.faces.component.UIData;
import javax.faces.component.UIInput;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import org.richfaces.model.DataComponentState;
import org.richfaces.model.ExtendedDataModel;
import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
import org.ajax4jsf.tests.MockComponentState;
import org.ajax4jsf.tests.MockDataModel;
import org.ajax4jsf.tests.MockUIInputRenderer;
/**
* @author shura
*
*/
public class DataAdaptorTestCase extends AbstractAjax4JsfTestCase {
private UIDataAdaptor adaptor;
private UIInput child;
private UIInput childChild;
private UIInput childChildFacet;
private int childChildFacetInvoked;
private int childChildInvoked;
private int childInvoked;
UIData data;
private UIInput facetChild;
private int facetInvoked;
/**
* @param name
*/
public DataAdaptorTestCase(String name) {
super(name);
}
/*
* (non-Javadoc)
* @see org.ajax4jsf.tests.AbstractAjax4JsfTestCase#setUp()
*/
public void setUp() throws Exception {
super.setUp();
// Create mock DataAdaptor and childs.
adaptor = new MockDataAdaptor();
child = new UIInput() {
public void processDecodes(FacesContext context) {
childInvoked++;
super.processDecodes(context);
}
};
childInvoked = 0;
child.setId("child");
adaptor.getChildren().add(child);
facetChild = new UIInput() {
public void processDecodes(FacesContext context) {
facetInvoked++;
super.processDecodes(context);
}
};
facetInvoked = 0;
facetChild.setId("facetChild");
adaptor.getFacets().put("facet", facetChild);
childChild = new UIInput() {
public void processDecodes(FacesContext context) {
childChildInvoked++;
super.processDecodes(context);
}
};
;
childChildInvoked = 0;
childChild.setId("childChild");
child.getChildren().add(childChild);
childChildFacet = new UIInput() {
public void processDecodes(FacesContext context) {
childChildFacetInvoked++;
super.processDecodes(context);
}
};
;
childChildFacetInvoked = 0;
childChildFacet.setId("childChildFacet");
childChild.getFacets().put("facet", childChildFacet);
data = new UIData();
renderKit.addRenderer(child.getFamily(), child.getRendererType(), new MockUIInputRenderer());
renderKit.addRenderer(adaptor.getFamily(), adaptor.getRendererType(), new MockUIInputRenderer());
}
/*
* (non-Javadoc)
* @see org.ajax4jsf.tests.AbstractAjax4JsfTestCase#tearDown()
*/
public void tearDown() throws Exception {
super.tearDown();
adaptor = null;
child = null;
childChild = null;
childChildFacet = null;
facetChild = null;
}
private void createTree() {
facesContext.getViewRoot().getChildren().add(adaptor);
adaptor.setId("adaptor");
}
private void createDataTree() {
data.setId("data");
adaptor.setId("adaptor");
ArrayList value = new ArrayList(2);
value.add("first");
value.add("second");
data.setValue(value);
data.setVar("var");
UIColumn column = new UIColumn();
data.getChildren().add(column);
column.getChildren().add(adaptor);
facesContext.getViewRoot().getChildren().add(data);
}
/**
* Test method for {@link org.ajax4jsf.component.UIDataAdaptor#isRowAvailable()}.
*/
public void testIsRowAvailable() {
adaptor.setRowKey(new Integer(0));
assertTrue(adaptor.isRowAvailable());
adaptor.setRowKey(new Integer(MockDataModel.ROWS - 1));
assertTrue(adaptor.isRowAvailable());
adaptor.setRowKey(new Integer(MockDataModel.ROWS + 1));
assertFalse(adaptor.isRowAvailable());
adaptor.setRowKey(null);
assertFalse(adaptor.isRowAvailable());
}
/**
* Test method for {@link org.ajax4jsf.component.UIDataAdaptor#getRowKey()}.
*/
public void testGetRowKey() {
adaptor.setRowIndex(0);
assertEquals(new Integer(0), adaptor.getRowKey());
adaptor.setRowIndex(-1);
assertNull(adaptor.getRowKey());
}
/**
* Test method for {@link org.ajax4jsf.component.UIDataAdaptor#setRowKey(java.lang.Object)}.
*/
public void testSetRowKey() {
adaptor.setRowKey(new Integer(1));
assertEquals(1, adaptor.getRowIndex());
adaptor.setRowKey(null);
assertEquals(-1, adaptor.getRowIndex());
}
/**
* Test method for {@link org.ajax4jsf.component.UIDataAdaptor#resetDataModel()}.
*/
public void testResetDataModel() {
adaptor.setRowKey(new Integer(1));
adaptor.resetDataModel();
assertEquals(0, adaptor.getRowIndex());
}
public void testGetBaseClientId() {
createDataTree();
data.setRowIndex(-1);
assertEquals(adaptor.getBaseClientId(facesContext), "data:adaptor");
data.setRowIndex(0);
assertEquals(adaptor.getBaseClientId(facesContext), "data:0:adaptor");
data.setRowIndex(1);
assertEquals(adaptor.getBaseClientId(facesContext), "data:1:adaptor");
adaptor.setRowIndex(1);
assertEquals(adaptor.getBaseClientId(facesContext), "data:1:adaptor");
}
/**
* Test method for {@link org.ajax4jsf.component.UIDataAdaptor#setExtendedDataModel(org.ajax4jsf.ajax.repeat.ExtendedDataModel)}.
*/
public void testSetIterableDataModel() {
createDataTree();
data.setRowIndex(0);
MockDataModel mockDataModel0 = new MockDataModel();
adaptor.setExtendedDataModel(mockDataModel0);
data.setRowIndex(1);
MockDataModel mockDataModel1 = new MockDataModel();
adaptor.setExtendedDataModel(mockDataModel1);
data.setRowIndex(0);
assertSame(mockDataModel0, adaptor.getExtendedDataModel());
data.setRowIndex(1);
assertSame(mockDataModel1, adaptor.getExtendedDataModel());
}
public void testSetDataModel() {
MockDataModel mockDataModel1 = new MockDataModel();
adaptor.setExtendedDataModel(mockDataModel1);
assertSame(mockDataModel1, adaptor.getExtendedDataModel());
}
/**
* Test method for {@link org.ajax4jsf.component.UIDataAdaptor#getExtendedDataModel()}.
*/
public void testGetIterableDataModel() {
ExtendedDataModel dataModel = adaptor.getExtendedDataModel();
assertTrue(dataModel instanceof MockDataModel);
}
/**
* Test method for {@link org.ajax4jsf.component.UIDataAdaptor#getComponentState()}.
*/
public void testGetComponentState() {
createDataTree();
data.setRowIndex(0);
DataComponentState state0 = adaptor.getComponentState();
assertTrue(state0 instanceof MockComponentState);
data.setRowIndex(1);
DataComponentState state1 = adaptor.getComponentState();
data.setRowIndex(0);
assertSame(state0, adaptor.getComponentState());
data.setRowIndex(1);
assertSame(state1, adaptor.getComponentState());
}
/**
* Test method for {@link org.ajax4jsf.component.UIDataAdaptor#createComponentState()}.
*/
public void testCreateComponentState() {
DataComponentState state = adaptor.createComponentState();
assertTrue(state instanceof MockComponentState);
}
/**
* Test method for {@link org.ajax4jsf.component.UIDataAdaptor#iterate(javax.faces.context.FacesContext, org.ajax4jsf.ajax.repeat.RepeaterInvoker)}.
*/
public void testProcess() {
createTree();
MockComponentState mockState = (MockComponentState) adaptor.getComponentState();
mockState.setCount(4);
adaptor.processDecodes(facesContext);
assertEquals(childInvoked, 4);
assertEquals(facetInvoked, 1);
}
/**
* Test method for {@link org.ajax4jsf.component.UIDataAdaptor#iterate(javax.faces.context.FacesContext, org.ajax4jsf.ajax.repeat.RepeaterInvoker)}.
*/
public void testProcessMore() {
createTree();
MockComponentState mockState = (MockComponentState) adaptor.getComponentState();
mockState.setCount(Integer.MAX_VALUE);
adaptor.processDecodes(facesContext);
assertEquals(childInvoked, MockDataModel.ROWS);
assertEquals(facetInvoked, 1);
}
/**
* Test method for {@link org.ajax4jsf.component.UIDataAdaptor#restoreState(javax.faces.context.FacesContext, java.lang.Object)}.
* @throws IllegalAccessException
* @throws InstantiationException
*/
public void testRestoreStateFacesContextObject() throws Exception {
createTree();
MockComponentState mockState = (MockComponentState) adaptor.getComponentState();
mockState.setCount(123);
adaptor.encodeBegin(facesContext);
UIViewRoot viewRoot = facesContext.getViewRoot();
Object treeState = viewRoot.processSaveState(facesContext);
UIViewRoot root = (UIViewRoot) viewRoot.getClass().newInstance();
UIDataAdaptor restoredAdaptor = new MockDataAdaptor();
root.getChildren().add(restoredAdaptor);
root.processRestoreState(facesContext, treeState);
mockState = (MockComponentState) restoredAdaptor.getComponentState();
assertEquals(mockState.getCount(), 123);
}
/**
* Test method for {@link org.ajax4jsf.component.UIDataAdaptor#saveState(javax.faces.context.FacesContext)}.
*/
public void testSaveStateFacesContext() throws Exception {
createDataTree();
data.setRowIndex(0);
MockComponentState mockState = (MockComponentState) adaptor.getComponentState();
mockState.setCount(123);
adaptor.encodeBegin(facesContext);
data.setRowIndex(1);
mockState = (MockComponentState) adaptor.getComponentState();
mockState.setCount(321);
adaptor.encodeBegin(facesContext);
UIViewRoot viewRoot = facesContext.getViewRoot();
Object treeState = viewRoot.processSaveState(facesContext);
UIViewRoot root = (UIViewRoot) viewRoot.getClass().newInstance();
UIData restoredData = new UIData();
UIDataAdaptor restoredAdaptor = new MockDataAdaptor();
root.getChildren().add(restoredData);
UIColumn column = new UIColumn();
restoredData.getChildren().add(column);
column.getChildren().add(restoredAdaptor);
root.processRestoreState(facesContext, treeState);
restoredData.setRowIndex(0);
mockState = (MockComponentState) restoredAdaptor.getComponentState();
assertEquals(123, mockState.getCount());
restoredData.setRowIndex(1);
mockState = (MockComponentState) restoredAdaptor.getComponentState();
assertEquals(321, mockState.getCount());
}
public void testSaveChildState() {
createTree();
child.setSubmittedValue("Submitted");
child.setValid(true);
child.setValue("Value");
child.setLocalValueSet(true);
adaptor.saveChildState(facesContext);
child.setSubmittedValue("NonSubmitted");
child.setValid(false);
child.setValue(null);
child.setLocalValueSet(false);
adaptor.restoreChildState(facesContext);
assertEquals(child.getSubmittedValue(), "Submitted");
assertTrue(child.isValid());
assertEquals(child.getValue(), "Value");
assertTrue(child.isLocalValueSet());
}
public void testSaveChildChildState() {
createTree();
childChild.setSubmittedValue("Submitted");
childChild.setValid(true);
childChild.setValue("Value");
childChild.setLocalValueSet(true);
adaptor.saveChildState(facesContext);
childChild.setSubmittedValue("NonSubmitted");
childChild.setValid(false);
childChild.setValue(null);
childChild.setLocalValueSet(false);
adaptor.restoreChildState(facesContext);
assertEquals(childChild.getSubmittedValue(), "Submitted");
assertTrue(childChild.isValid());
assertEquals(childChild.getValue(), "Value");
assertTrue(childChild.isLocalValueSet());
}
public void testSaveChildChildFacetState() {
createTree();
childChildFacet.setSubmittedValue("Submitted");
childChildFacet.setValid(true);
childChildFacet.setValue("Value");
childChildFacet.setLocalValueSet(true);
adaptor.saveChildState(facesContext);
childChildFacet.setSubmittedValue("NonSubmitted");
childChildFacet.setValid(false);
childChildFacet.setValue(null);
childChildFacet.setLocalValueSet(false);
adaptor.restoreChildState(facesContext);
assertEquals(childChildFacet.getSubmittedValue(), "Submitted");
assertTrue(childChildFacet.isValid());
assertEquals(childChildFacet.getValue(), "Value");
assertTrue(childChildFacet.isLocalValueSet());
}
public void testSetValue() {
ExtendedDataModel model1 = adaptor.getExtendedDataModel();
adaptor.setValue("value");
ExtendedDataModel model2 = adaptor.getExtendedDataModel();
assertNotSame(model1, model2);
Object value = adaptor.getValue();
assertNotNull(value);
assertEquals("value", value);
}
}