package org.strecks.validator.internal;
import static org.easymock.EasyMock.expect;
import static org.easymock.classextension.EasyMock.createStrictMock;
import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.reset;
import static org.easymock.classextension.EasyMock.verify;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.strecks.exceptions.ApplicationConfigurationException;
import org.strecks.validator.IntegerValidator;
import org.strecks.validator.message.DefaultMessageParameterProvider;
import org.testng.Assert;
import org.testng.annotations.Test;
/**
* @author Phil Zoio
*/
public class TestConvertedTypeValidationChecker
{
@Test
public void testIsInterface()
{
List<ValidatorWrapper> list = new ArrayList<ValidatorWrapper>();
ValidatorWrapper v1 = getWrapper(List.class);
list.add(v1);
ConvertedTypeValidationChecker checker = new ConvertedTypeValidationChecker(this.getClass(),
newOrderedProperty(), list);
try
{
checker.checkConvertedValueTypes();
Assert.fail();
}
catch (ApplicationConfigurationException e)
{
Assert.assertEquals(e.getMessage(), "Class org.strecks.validator.internal.TestConvertedTypeValidationChecker, " +
"property prop uses validators for which the most concrete parameterized type java.util.List is an interface. " +
"It must be an instantiable concrete class");
}
}
@Test
public void testIsAbstract()
{
List<ValidatorWrapper> list = new ArrayList<ValidatorWrapper>();
ValidatorWrapper v1 = getWrapper(Number.class);
list.add(v1);
ConvertedTypeValidationChecker checker = new ConvertedTypeValidationChecker(this.getClass(),
newOrderedProperty(), list);
try
{
checker.checkConvertedValueTypes();
Assert.fail();
}
catch (ApplicationConfigurationException e)
{
Assert.assertEquals(e.getMessage(), "Class org.strecks.validator.internal.TestConvertedTypeValidationChecker, " +
"property prop uses validators for which the most concrete parameterized type java.lang.Number is an abstract class. " +
"It must be an instantiable concrete class");
}
}
@Test
public void testSortWrappers()
{
List<ValidatorWrapper> list = new ArrayList<ValidatorWrapper>();
ValidatorWrapper v1 = getWrapper(Integer.class);
ValidatorWrapper v2 = getWrapper(Number.class);
ValidatorWrapper v3 = getWrapper(Object.class);
list.add(v1);
list.add(v2);
list.add(v3);
ConvertedTypeValidationChecker checker = new ConvertedTypeValidationChecker(this.getClass(),
newOrderedProperty(), list);
assert checker.checkUsesConvertedValue();
checker.sortValidators();
assert v1 == checker.getSortableValidators().iterator().next().getWrapper();
// now check that sort applies in reverse
list.clear();
list.add(v2);
list.add(v3);
list.add(v1);
checker = new ConvertedTypeValidationChecker(this.getClass(), newOrderedProperty(), list);
checker.sortValidators();
assert v1 == checker.getSortableValidators().iterator().next().getWrapper();
// check all are assignable
checker.checkAllAreAssignable();
checker.setConverterType();
Assert.assertEquals(Integer.class, checker.getConverterType());
}
@Test
public void testNotTypeCompatible()
{
List<ValidatorWrapper> list = new ArrayList<ValidatorWrapper>();
ValidatorWrapper v1 = getWrapper(Integer.class);
ValidatorWrapper v2 = getWrapper(String.class);
ValidatorWrapper v3 = getWrapper(Object.class);
list.add(v1);
list.add(v2);
list.add(v3);
ConvertedTypeValidationChecker checker = new ConvertedTypeValidationChecker(this.getClass(),
newOrderedProperty(), list);
assert checker.checkUsesConvertedValue();
checker.sortValidators();
assert v1 == checker.getSortableValidators().iterator().next().getWrapper();
// now check that sort applies in reverse
list.clear();
list.add(v2);
list.add(v3);
list.add(v1);
checker = new ConvertedTypeValidationChecker(this.getClass(), newOrderedProperty(), list);
checker.sortValidators();
assert v2 == checker.getSortableValidators().iterator().next().getWrapper();
// check all are assignable
try
{
checker.checkAllAreAssignable();
Assert.fail();
}
catch (ApplicationConfigurationException e)
{
Assert
.assertEquals(
e.getMessage(),
"Class org.strecks.validator.internal.TestConvertedTypeValidationChecker, "
+ "property prop uses validators "
+ "with parameterized types java.lang.String and java.lang.Integer which are not type compatible");
}
}
private ValidatorWrapper getWrapper(Class<?> type)
{
DefaultMessageParameterProvider provider = new DefaultMessageParameterProvider();
ValidatorWrapper wrapper = new ValidatorWrapper("key1", 20, Collections.emptyList(), new IntegerValidator(),
this.getClass().getMethods()[0], provider, true, type);
return wrapper;
}
@Test
public void testUsesConvertedValue()
{
ValidatorWrapper wrapper1 = createStrictMock(ValidatorWrapper.class);
ValidatorWrapper wrapper2 = createStrictMock(ValidatorWrapper.class);
ValidatorWrapper wrapper3 = createStrictMock(ValidatorWrapper.class);
List<ValidatorWrapper> list = new ArrayList<ValidatorWrapper>();
list.add(wrapper1);
list.add(wrapper2);
list.add(wrapper3);
expect(wrapper1.getUsesConvertedValue()).andReturn(false);
expect(wrapper2.getUsesConvertedValue()).andReturn(true);
for (ValidatorWrapper wrapper : list)
{
replay(wrapper);
}
ConvertedTypeValidationChecker checker = new ConvertedTypeValidationChecker(this.getClass(),
newOrderedProperty(), list);
assert checker.checkUsesConvertedValue();
for (ValidatorWrapper wrapper : list)
{
verify(wrapper);
}
for (ValidatorWrapper wrapper : list)
{
reset(wrapper);
}
expect(wrapper1.getUsesConvertedValue()).andReturn(false);
expect(wrapper2.getUsesConvertedValue()).andReturn(false);
expect(wrapper3.getUsesConvertedValue()).andReturn(false);
for (ValidatorWrapper wrapper : list)
{
replay(wrapper);
}
assert !checker.checkUsesConvertedValue();
for (ValidatorWrapper wrapper : list)
{
verify(wrapper);
}
for (ValidatorWrapper wrapper : list)
{
reset(wrapper);
}
}
private OrderedProperty newOrderedProperty()
{
return new OrderedProperty("prop", 1);
}
}