blob: d365a6389126efc21c361c2caa0b96b244b3d304 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package javax.faces.component;
import org.apache.myfaces.core.api.shared.SharedRendererUtils;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import javax.el.ValueExpression;
import javax.faces.FacesException;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import org.apache.myfaces.test.base.AbstractJsfTestCase;
import org.apache.myfaces.test.el.MockValueExpression;
public class _SharedRendererUtilsTest extends AbstractJsfTestCase
{
/**
* A POJO used for testing.
*/
public static class POJO
{
private int id;
private String name;
public POJO(int id, String name)
{
this.id = id;
this.name = name;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@Override
public boolean equals(Object obj)
{
return obj instanceof POJO && ((POJO) obj).id == this.id;
}
@Override
public int hashCode()
{
return id;
}
}
/**
* Converter for class POJO.
*/
public static class POJOConverter implements Converter
{
public Object getAsObject(FacesContext context, UIComponent component,
String value) throws ConverterException
{
return new POJO(new Integer(value), value);
}
public String getAsString(FacesContext context, UIComponent component,
Object value) throws ConverterException
{
return ((POJO) value).name;
}
}
/**
* A Bean used for testing.
*/
public static class Bean
{
private int[] intArrayValue;
private Float[] floatArrayValue;
private POJO[] pojoArrayValue;
private Collection<POJO> pojoCollectionValue;
public int[] getIntArrayValue()
{
if (intArrayValue == null)
{
intArrayValue = new int[0];
}
return intArrayValue;
}
public void setIntArrayValue(int[] intArrayValue)
{
this.intArrayValue = intArrayValue;
}
public Float[] getFloatArrayValue()
{
if (floatArrayValue == null)
{
floatArrayValue = new Float[0];
}
return floatArrayValue;
}
public void setFloatArrayValue(Float[] floatArrayValue)
{
this.floatArrayValue = floatArrayValue;
}
public POJO[] getPojoArrayValue()
{
if (pojoArrayValue == null)
{
pojoArrayValue = new POJO[0];
}
return pojoArrayValue;
}
public void setPojoArrayValue(POJO[] pojoArrayValue)
{
this.pojoArrayValue = pojoArrayValue;
}
public Collection<POJO> getPojoCollectionValue()
{
if (pojoCollectionValue == null)
{
pojoCollectionValue = new HashSet<POJO>();
}
return pojoCollectionValue;
}
public void setPojoCollectionValue(Collection<POJO> pojoCollectionValue)
{
this.pojoCollectionValue = pojoCollectionValue;
}
}
private UISelectMany uiSelectMany;
private String[] submittedValue;
private Converter pojoConverter = new POJOConverter();
public _SharedRendererUtilsTest(String name)
{
super(name);
}
@Override
protected void setUp() throws Exception
{
super.setUp();
uiSelectMany = new UISelectMany();
submittedValue = new String[]{"1", "2"};
}
@Override
protected void tearDown() throws Exception
{
super.tearDown();
uiSelectMany = null;
submittedValue = null;
}
/**
* Test case for the case that UISelectMany has neither a Converter nor a ValueExpression for value.
* In this scenario it stores the values of submittedValue in a new object array.
*/
public void testGetConvertedUISelectManyValueNoConverterNoValueExpression()
{
Object target = SharedRendererUtils.getConvertedUISelectManyValue(facesContext, uiSelectMany, submittedValue);
assertTrue(target instanceof Object[]);
assertTrue(Arrays.deepEquals((Object[]) target, submittedValue));
}
/**
* Test case for the case that UISelectMany has a ValueExpression pointing to a primitive
* integer array and uses a standard jsf converter.
*/
@SuppressWarnings("unchecked")
public void testGetConvertedUISelectManyValuePrimitiveIntArray()
{
externalContext.getApplicationMap().put("bean", new Bean());
ValueExpression expr = new MockValueExpression("#{bean.intArrayValue}", int[].class);
uiSelectMany.setValueExpression("value", expr);
Object target = SharedRendererUtils.getConvertedUISelectManyValue(facesContext, uiSelectMany, submittedValue);
assertTrue(target instanceof int[]);
int[] array = (int[]) target;
assertTrue(new Integer(submittedValue[0]).equals(array[0]));
assertTrue(new Integer(submittedValue[0]).equals(array[0]));
}
/**
* Test case for the case that UISelectMany has a ValueExpression pointing to a non-primitive
* Float array and uses a standard jsf converter.
*/
@SuppressWarnings("unchecked")
public void testGetConvertedUISelectManyValueNonPrimitiveFloatArray()
{
externalContext.getApplicationMap().put("bean", new Bean());
ValueExpression expr = new MockValueExpression("#{bean.floatArrayValue}", Float[].class);
uiSelectMany.setValueExpression("value", expr);
Object target = SharedRendererUtils.getConvertedUISelectManyValue(facesContext, uiSelectMany, submittedValue);
assertTrue(target instanceof Float[]);
Float[] array = (Float[]) target;
assertTrue(new Float(submittedValue[0]).equals(array[0]));
assertTrue(new Float(submittedValue[1]).equals(array[1]));
}
/**
* Test case for the case that UISelectMany has a ValueExpression pointing to a
* POJO array and uses a provided converter.
*/
@SuppressWarnings("unchecked")
public void testGetConvertedUISelectManyValuePOJOArray()
{
externalContext.getApplicationMap().put("bean", new Bean());
ValueExpression expr = new MockValueExpression("#{bean.pojoArrayValue}", POJO[].class);
uiSelectMany.setValueExpression("value", expr);
uiSelectMany.setConverter(pojoConverter);
Object target = SharedRendererUtils.getConvertedUISelectManyValue(facesContext, uiSelectMany, submittedValue);
assertTrue(target instanceof POJO[]);
POJO[] array = (POJO[]) target;
assertTrue(pojoConverter.getAsObject(facesContext, uiSelectMany, submittedValue[0]).equals(array[0]));
assertTrue(pojoConverter.getAsObject(facesContext, uiSelectMany, submittedValue[1]).equals(array[1]));
}
/**
* Test case for the case that UISelectMany has a ValueExpression pointing to a
* Collection of POJOs and uses a provided converter.
* In this scenario the method does not get a hint for the right collection type, so it
* retrieves #{bean.pojoCollectionValue} and clones that Collection.
*/
@SuppressWarnings("unchecked")
public void testGetConvertedUISelectManyValuePOJOCollectionWithoutCollectionType()
{
externalContext.getApplicationMap().put("bean", new Bean());
ValueExpression expr = new MockValueExpression("#{bean.pojoCollectionValue}", Collection.class);
uiSelectMany.setValueExpression("value", expr);
uiSelectMany.setConverter(pojoConverter);
Object target = SharedRendererUtils.getConvertedUISelectManyValue(facesContext, uiSelectMany, submittedValue);
assertTrue(target instanceof Collection);
Collection collection = (Collection) target;
assertTrue(collection.contains(pojoConverter.getAsObject(facesContext, uiSelectMany, submittedValue[0])));
assertTrue(collection.contains(pojoConverter.getAsObject(facesContext, uiSelectMany, submittedValue[1])));
}
/**
* Test case for the case that UISelectMany has a ValueExpression pointing to a
* Collection of POJOs and uses a provided converter.
* In this scenario the method gets a hint for the right collection type in form
* of the fully qualified class name of the target Collection, which it uses to
* create the right Collection.
*/
@SuppressWarnings("unchecked")
public void testGetConvertedUISelectManyValuePOJOCollectionWithCollectionType()
{
externalContext.getApplicationMap().put("bean", new Bean());
ValueExpression expr = new MockValueExpression("#{bean.pojoCollectionValue}", Collection.class);
uiSelectMany.setValueExpression("value", expr);
uiSelectMany.setConverter(pojoConverter);
uiSelectMany.getAttributes().put("collectionType", "java.util.HashSet");
Object target = SharedRendererUtils.getConvertedUISelectManyValue(facesContext, uiSelectMany, submittedValue);
assertTrue(target instanceof HashSet);
HashSet hashSet = (HashSet) target;
assertTrue(hashSet.contains(pojoConverter.getAsObject(facesContext, uiSelectMany, submittedValue[0])));
assertTrue(hashSet.contains(pojoConverter.getAsObject(facesContext, uiSelectMany, submittedValue[1])));
}
/**
* In this test case the method can not proceed, because it is not able to
* obtain a converter. So it throws a ConverterException.
*/
@SuppressWarnings("unchecked")
public void testGetConvertedUISelectManyValueNoConverter()
{
externalContext.getApplicationMap().put("bean", new Bean());
ValueExpression expr = new MockValueExpression("#{bean.pojoArrayValue}", POJO[].class);
uiSelectMany.setValueExpression("value", expr);
try
{
SharedRendererUtils.getConvertedUISelectManyValue(facesContext, uiSelectMany, submittedValue);
fail();
}
catch (ConverterException ce)
{
// success
}
}
/**
* In this test case the method gets a wrong hint for a collection type
* (java.util.Collection can not be instantiated). So it throws a FacesException.
*/
@SuppressWarnings("unchecked")
public void testGetConvertedUISelectManyValueWrongCollectionType()
{
externalContext.getApplicationMap().put("bean", new Bean());
ValueExpression expr = new MockValueExpression("#{bean.pojoCollectionValue}", Collection.class);
uiSelectMany.setValueExpression("value", expr);
uiSelectMany.setConverter(pojoConverter);
uiSelectMany.getAttributes().put("collectionType", "java.util.Collection");
try
{
SharedRendererUtils.getConvertedUISelectManyValue(facesContext, uiSelectMany, submittedValue);
fail();
}
catch (FacesException fe)
{
// success
}
}
}