/*
* 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 org.apache.wicket.model;
import java.io.Serializable;
import junit.framework.TestCase;
import org.junit.Assert;
import org.junit.Test;
/**
* <p>
* If AbstractPropertyModel has an target that implements the IObjectClassAwareModel interface then
* the class of that target is used to infer the modeled property type.
* </p>
*
* @see <a href="https://issues.apache.org/jira/browse/WICKET-2937">WICKET-2937</a>
* @author Pedro Santos
*/
public class AbstractPropertyModelObjectClassTest extends Assert
{
/**
*
*/
@Test
public void testCompoundPropertyModel()
{
assertPropertyModelTargetTypeIsInteger(new CompoundPropertyModel<CustomType>(
new CustomType()));
}
/**
*
*/
@Test
public void testCompoundPropertyModelBind()
{
CompoundPropertyModel<CustomBean> compoundPropertyModel = new CompoundPropertyModel<CustomBean>(
new CustomBean());
IModel<?> modelForCustomTypeObject = compoundPropertyModel.bind("customType");
assertPropertyModelTargetTypeIsInteger(modelForCustomTypeObject);
}
/**
*
*/
@Test
public void testModel()
{
assertPropertyModelTargetTypeIsInteger(new Model<CustomType>(new CustomType()));
}
/**
* Just asserting that the the property expression for the somePropety is aware of this property
* type.
*
* @param modelForCustomTypeObject
*/
private void assertPropertyModelTargetTypeIsInteger(IModel<?> modelForCustomTypeObject)
{
assertEquals(Integer.class, new PropertyModel<IModel<?>>(modelForCustomTypeObject,
"someProperty").getObjectClass());
}
/**
* Asserting that there is no problem in working with an AbstractPropertyModel targeting an
* IObjectClassAwareModel not initialized with an known class.
*
* @see <a href="https://issues.apache.org/jira/browse/WICKET-3253">WICKET-3253</a>
*/
@Test
public void testLazyClassResolution()
{
Model<CustomBean> modelCustomBean = new Model<CustomBean>(null);
PropertyModel<CustomType> customTypeModel = new PropertyModel<CustomType>(modelCustomBean,
"customType");
PropertyModel<Integer> somePropertyModel = new PropertyModel<Integer>(customTypeModel,
"someProperty");
assertNull(somePropertyModel.getObjectClass());
modelCustomBean.setObject(new CustomBean());
assertEquals(Integer.class, somePropertyModel.getObjectClass());
}
private static class CustomType implements Serializable
{
private static final long serialVersionUID = 1L;
private Integer someProperty;
public void setSomeProperty(Integer someProperty)
{
this.someProperty = someProperty;
}
public Integer getSomeProperty()
{
return someProperty;
}
}
private static class CustomBean implements Serializable
{
private static final long serialVersionUID = 1L;
private CustomType customType;
public CustomType getCustomType()
{
return customType;
}
public void setCustomType(CustomType customType)
{
this.customType = customType;
}
}
}