/*
ORG Usurper is a random value object generator library
Copyright (C) 2007 Pierre-Antoine Grégoire
This library 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 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.org.usurper;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;
import junit.framework.TestCase;
import org.org.usurper.TestCommons.NullPropertyException;
import org.org.usurper.dummydomain.DummyVO;
import org.org.usurper.dummydomain.DummyVOWithArrays;
import org.org.usurper.dummydomain.DummyVOWithCollections;
import org.org.usurper.dummydomain.DummyVOWithEnum;
import org.org.usurper.dummydomain.DummyVOWithVOArrays;
import org.org.usurper.dummydomain.DummyVOWithVOCollections;
import org.org.usurper.dummydomain.DummyWithChildVO;
import org.org.usurper.dummydomain.FcknVO;
import org.org.usurper.dummydomain.IDummyVO;
import org.org.usurper.dummydomain.IImmutableDummyVO;
import org.org.usurper.dummydomain.ImmutableDummyVO;
import org.org.usurper.dummydomain.ImmutableDummyVOWithEnum;
import org.org.usurper.dummydomain.ImmutableDummyWithChildVO;
import org.org.usurper.dummydomain.ImmutableDummyWithChildVOArray;
import org.org.usurper.dummydomain.ImmutableDummyWithChildVOCollections;
import org.org.usurper.dummydomain.PartiallyImmutableDummyVO;
import org.org.usurper.dummydomain.SonOfDummyWithChildVO;
import org.org.usurper.dummydomain.SonOfSonOfDummyWithChildVO;
import org.org.usurper.dummydomain.TelescopicConstructorDummyVO;
import org.org.usurper.handlers.additional.ListOfValuesSpecificPropertyHandler;
import org.org.usurper.handlers.additional.ValueObjectPropertyTypeHandler;
import org.org.usurper.handlers.basic.AbstractPropertyTypeHandler;
import org.org.usurper.handlers.basic.AbstractSpecificPropertyHandler;
import org.org.usurper.handlers.exceptions.NoHandlerDefinedException;
import org.org.usurper.model.HandledBeanProperty;
import org.org.usurper.model.HandledConstructorArg;
import org.org.usurper.model.PropertyTypeDefinition;
import org.org.usurper.model.SpecificPropertyDefinition;
import org.org.usurper.setup.UsurperGeneratorSetup;
import org.org.usurper.setup.constants.OnMissingHandlers;
/**
* @author pagregoire
*/
public class UsurperGeneratorTest extends TestCase {
/**
* @see junit.framework.TestCase#setUp()
*/
@Override
protected void setUp() throws Exception {
super.setUp();
}
public void testGenerateObject() {
// CREATE USURPER GENERATOR
UsurperGenerator<DummyVO> dummyVOUsurper = new UsurperGenerator<DummyVO>(DummyVO.class);
// GENERATE USURPER
DummyVO object = dummyVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateImmutableObject() {
// PREPARE USURPER GENERATOR SETUP
UsurperGeneratorSetup usurperGeneratorSetup = new UsurperGeneratorSetup();
usurperGeneratorSetup.registerPropertyTypeHandler(new AbstractPropertyTypeHandler(new PropertyTypeDefinition(String.class)) {
public Object handle(HandledBeanProperty handledBeanProperty) {
return TestCommons.HANDLED_STRING;
}
public Object handle(HandledConstructorArg handledConstructorArg) {
return TestCommons.HANDLED_STRING;
}
});
// CREATE USURPER GENERATOR
UsurperGenerator<ImmutableDummyVO> immutableDummyVOUsurper = new UsurperGenerator<ImmutableDummyVO>(ImmutableDummyVO.class, usurperGeneratorSetup);
// GENERATE USURPER
IImmutableDummyVO object = immutableDummyVOUsurper.generateUsurper();
assertEquals("The shortest constructor should be used.", ImmutableDummyVO.SHORT_CONTRUCTOR, object.getStringField());
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateImmutableWithChildObject() {
// PREPARE USURPER GENERATOR SETUP
UsurperGeneratorSetup usurperGeneratorSetup = new UsurperGeneratorSetup();
usurperGeneratorSetup.registerPropertyTypeHandler(new ValueObjectPropertyTypeHandler(DummyWithChildVO.class, SonOfDummyWithChildVO.class, SonOfSonOfDummyWithChildVO.class));
// CREATE USURPER GENERATOR
UsurperGenerator<ImmutableDummyWithChildVO> immutableDummyWithChildVOUsurper = new UsurperGenerator<ImmutableDummyWithChildVO>(ImmutableDummyWithChildVO.class, usurperGeneratorSetup);
// GENERATE USURPER
ImmutableDummyWithChildVO object = immutableDummyWithChildVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateImmutableWithChildObjectArray() {
// PREPARE USURPER GENERATOR SETUP
UsurperGeneratorSetup usurperGeneratorSetup = new UsurperGeneratorSetup();
usurperGeneratorSetup.registerPropertyTypeHandler(new ValueObjectPropertyTypeHandler(DummyWithChildVO.class, SonOfDummyWithChildVO.class, SonOfSonOfDummyWithChildVO.class));
// CREATE USURPER GENERATOR
UsurperGenerator<ImmutableDummyWithChildVOArray> immutableDummyWithChildVOArrayUsurper = new UsurperGenerator<ImmutableDummyWithChildVOArray>(ImmutableDummyWithChildVOArray.class, usurperGeneratorSetup);
// GENERATE USURPER
ImmutableDummyWithChildVOArray object = immutableDummyWithChildVOArrayUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateImmutableWithChildObjectCollections() {
// PREPARE USURPER GENERATOR SETUP
UsurperGeneratorSetup usurperGeneratorSetup = new UsurperGeneratorSetup();
usurperGeneratorSetup.registerPropertyTypeHandler(new ValueObjectPropertyTypeHandler(DummyWithChildVO.class, SonOfDummyWithChildVO.class, SonOfSonOfDummyWithChildVO.class));
// CREATE USURPER GENERATOR
UsurperGenerator<ImmutableDummyWithChildVOCollections> immutableDummyWithChildVOCollectionsUsurper = new UsurperGenerator<ImmutableDummyWithChildVOCollections>(ImmutableDummyWithChildVOCollections.class, usurperGeneratorSetup);
// GENERATE USURPER
ImmutableDummyWithChildVOCollections object = immutableDummyWithChildVOCollectionsUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateImmutableObjectWithChosenConstructor() {
// PREPARE USURPER GENERATOR SETUP
UsurperGeneratorSetup usurperGeneratorSetup = new UsurperGeneratorSetup();
usurperGeneratorSetup.registerPropertyTypeHandler(new AbstractPropertyTypeHandler(String.class) {
public Object handle(HandledBeanProperty handledBeanProperty) {
return TestCommons.HANDLED_STRING;
}
public Object handle(HandledConstructorArg handledConstructorArg) {
return TestCommons.HANDLED_STRING;
}
});
// CREATE USURPER GENERATOR
UsurperGenerator<ImmutableDummyVO> immutableDummyVOUsurper = new UsurperGenerator<ImmutableDummyVO>(ImmutableDummyVO.class, usurperGeneratorSetup);
immutableDummyVOUsurper.useConstructor(Integer.class, Float.class, Double.class, String.class, Date.class, Long.class, Short.class, Boolean.class, int.class, short.class, long.class, boolean.class, byte.class, char.class, float.class, double.class, Timestamp.class, java.sql.Date.class);
// GENERATE USURPER
IImmutableDummyVO object = immutableDummyVOUsurper.generateUsurper();
assertNotSame("The shortest constructor should not be used.", ImmutableDummyVO.SHORT_CONTRUCTOR, object.getStringField());
assertEquals("The longest constructor should be used.", TestCommons.HANDLED_STRING, object.getStringField());
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGeneratePartiallyImmutableObject() {
// CREATE USURPER GENERATOR
UsurperGenerator<PartiallyImmutableDummyVO> partiallyImmutableDummyVOUsurper = new UsurperGenerator<PartiallyImmutableDummyVO>(PartiallyImmutableDummyVO.class);
// GENERATE USURPER
PartiallyImmutableDummyVO object = partiallyImmutableDummyVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testBestConstructorSelection() {
// CREATE USURPER GENERATOR
UsurperGenerator<TelescopicConstructorDummyVO> usurperGenerator = new UsurperGenerator<TelescopicConstructorDummyVO>(TelescopicConstructorDummyVO.class);
// GENERATE USURPER
TelescopicConstructorDummyVO object = usurperGenerator.generateUsurper();
// VALIDATE RESULTING OBJECT
// THE SHORTEST CONSTRUCTOR WITH HANDLERS AVAILABLE FOR ALL ARGUMENTS SHOULD BE CHOSEN.
assertNull(object.getInputStream());
assertNotNull(object.getInteger());
assertNotNull(object.getString());
}
public void testGenerateObjectWithInterface() {
// CREATE USURPER GENERATOR
UsurperGenerator<IDummyVO> dummyVOUsurper = new UsurperGenerator<IDummyVO>(DummyVO.class);
// GENERATE USURPER
IDummyVO object = dummyVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateImmutableObjectWithInterface() {
// CREATE USURPER GENERATOR
UsurperGenerator<IImmutableDummyVO> immutableDummyVOUsurper = new UsurperGenerator<IImmutableDummyVO>(ImmutableDummyVO.class);
// GENERATE USURPER
IImmutableDummyVO object = immutableDummyVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateObjectWithEnum() {
// CREATE USURPER GENERATOR
UsurperGenerator<DummyVOWithEnum> dummyVOUsurper = new UsurperGenerator<DummyVOWithEnum>(DummyVOWithEnum.class);
// GENERATE USURPER
DummyVOWithEnum object = dummyVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateImmutableObjectWithEnum() {
// CREATE USURPER GENERATOR
UsurperGenerator<ImmutableDummyVOWithEnum> immutableDummyVOUsurper = new UsurperGenerator<ImmutableDummyVOWithEnum>(ImmutableDummyVOWithEnum.class);
// GENERATE USURPER
ImmutableDummyVOWithEnum object = immutableDummyVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateObjectWithChilds() {
// PREPARE USURPER GENERATOR SETUP
ValueObjectPropertyTypeHandler valueObjectFieldTypeHandler = new ValueObjectPropertyTypeHandler(SonOfDummyWithChildVO.class, SonOfSonOfDummyWithChildVO.class);
UsurperGeneratorSetup usurperGeneratorSetup = new UsurperGeneratorSetup();
usurperGeneratorSetup.registerPropertyTypeHandler(valueObjectFieldTypeHandler);
// CREATE USURPER GENERATOR
UsurperGenerator<DummyWithChildVO> dummyVOUsurper = new UsurperGenerator<DummyWithChildVO>(DummyWithChildVO.class, usurperGeneratorSetup);
// GENERATE USURPER
DummyWithChildVO object = dummyVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateObjectWithCollectionChilds() {
// CREATE USURPER GENERATOR
UsurperGenerator<DummyVOWithCollections> dummyVOUsurper = new UsurperGenerator<DummyVOWithCollections>(DummyVOWithCollections.class);
// GENERATE USURPER
DummyVOWithCollections object = dummyVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateObjectWithVOCollectionChilds() {
// PREPARE USURPER GENERATOR SETUP
UsurperGeneratorSetup usurperGeneratorSetup = new UsurperGeneratorSetup();
usurperGeneratorSetup.registerPropertyTypeHandler(new ValueObjectPropertyTypeHandler(SonOfDummyWithChildVO.class, SonOfSonOfDummyWithChildVO.class));
// CREATE USURPER GENERATOR
UsurperGenerator<DummyVOWithVOCollections> dummyVOUsurper = new UsurperGenerator<DummyVOWithVOCollections>(DummyVOWithVOCollections.class, usurperGeneratorSetup);
// GENERATE USURPER
DummyVOWithVOCollections object = dummyVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateObjectWithArrayChilds() {
// CREATE USURPER GENERATOR
UsurperGenerator<DummyVOWithArrays> dummyVOUsurper = new UsurperGenerator<DummyVOWithArrays>(DummyVOWithArrays.class);
// GENERATE USURPER
DummyVOWithArrays object = dummyVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateObjectWithVOArrayChilds() {
// PREPARE USURPER GENERATOR SETUP
UsurperGeneratorSetup usurperGeneratorSetup = new UsurperGeneratorSetup();
usurperGeneratorSetup.registerPropertyTypeHandler(new ValueObjectPropertyTypeHandler(SonOfDummyWithChildVO.class, SonOfSonOfDummyWithChildVO.class));
// CREATE USURPER GENERATOR
UsurperGenerator<DummyVOWithVOArrays> dummyVOUsurper = new UsurperGenerator<DummyVOWithVOArrays>(DummyVOWithVOArrays.class, usurperGeneratorSetup);
// GENERATE USURPER
DummyVOWithVOArrays object = dummyVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateObjectWithNoHandlerForProperty() {
// CREATE USURPER GENERATOR
UsurperGenerator<FcknVO> fcknVOUsurper = new UsurperGenerator<FcknVO>(FcknVO.class);
// TRY TO GENERATE USURPER WITH AN UNHANDLED TYPE : BigInteger
try {
@SuppressWarnings("unused")
FcknVO object = fcknVOUsurper.generateUsurper();
fail("a NoHandlerDefinedException should be thrown.");
} catch (Exception e) {
assertTrue("the thrown exception should be a " + NoHandlerDefinedException.class.getName(), e instanceof NoHandlerDefinedException);
}
// PREPARE USURPER GENERATOR SETUP
UsurperGeneratorSetup usurperGeneratorSetup = new UsurperGeneratorSetup();
usurperGeneratorSetup.onMissingHandlers(OnMissingHandlers.SKIP);
// TRY TO GENERATE USURPER WITH AN UNHANDLED TYPE : BigInteger
// BUT WITH UNDEFINEDHANDLERS IGNORED
fcknVOUsurper.replaceSetup(usurperGeneratorSetup);
try {
@SuppressWarnings("unused")
FcknVO object = fcknVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT (should fail as the unhandled property
// is null)
try {
TestCommons.auditVO(object);
fail("unhandled property should be null");
} catch (Exception e) {
assertTrue("the thrown exception should be a " + NullPropertyException.class.getName(), e instanceof NullPropertyException);
}
} catch (NoHandlerDefinedException e) {
fail("NoHandlerDefinedException should not be thrown.");
}
}
public void testGenerateObjectWithListOfValuesSpecificPropertyHandler() {
// PREPARE USURPER GENERATOR SETUP
UsurperGeneratorSetup usurperGeneratorSetup = new UsurperGeneratorSetup();
usurperGeneratorSetup.registerSpecificPropertyHandler(new ListOfValuesSpecificPropertyHandler(new SpecificPropertyDefinition(FcknVO.class, "bigIntField"), TestCommons.BIG_INTEGER_VALUES_LIST));
usurperGeneratorSetup.registerSpecificPropertyHandler(new ListOfValuesSpecificPropertyHandler(new SpecificPropertyDefinition(FcknVO.class, "bigIntField2"), TestCommons.BIG_INTEGER_VALUES_LIST));
// CREATE USURPER GENERATOR
UsurperGenerator<FcknVO> fcknVOUsurper = new UsurperGenerator<FcknVO>(FcknVO.class, usurperGeneratorSetup);
// GENERATE USURPER
List<FcknVO> collection = fcknVOUsurper.generateUsurperList(6);
Iterator<BigInteger> it = TestCommons.BIG_INTEGER_VALUES_LIST.iterator();
// VALIDATE RESULTING OBJECT
for (FcknVO fcknVO : collection) {
try {
TestCommons.auditVO(fcknVO);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
if (!it.hasNext()) {
it = TestCommons.BIG_INTEGER_VALUES_LIST.iterator();
}
BigInteger nextValue = it.next();
assertEquals("the specificFieldHandler should put the <" + nextValue + "> value for the <bigIntField> field", nextValue, fcknVO.getBigIntField());
assertEquals("the specificFieldHandler should put the <" + nextValue + "> value for the <bigIntField2> field", nextValue, fcknVO.getBigIntField2());
}
}
public void testGenerateObjectWithSpecificPropertyHandler() {
// PREPARE USURPER GENERATOR SETUP
UsurperGeneratorSetup usurperGeneratorSetup = new UsurperGeneratorSetup();
usurperGeneratorSetup.registerSpecificPropertyHandler(new AbstractSpecificPropertyHandler(new SpecificPropertyDefinition(FcknVO.class, "bigIntField")) {
public Object handle(HandledBeanProperty handledBeanProperty) {
return TestCommons.BIG_INTEGER_VALUE;
}
public Object handle(HandledConstructorArg handledConstructorArg) {
return TestCommons.BIG_INTEGER_VALUE;
}
});
usurperGeneratorSetup.registerSpecificPropertyHandler(new AbstractSpecificPropertyHandler(new SpecificPropertyDefinition(FcknVO.class, "bigIntField2")) {
public Object handle(HandledBeanProperty handledBeanProperty) {
return TestCommons.BIG_INTEGER_VALUE;
}
public Object handle(HandledConstructorArg handledConstructorArg) {
return TestCommons.BIG_INTEGER_VALUE;
}
});
// CREATE USURPER GENERATOR
UsurperGenerator<FcknVO> fcknVOUsurper = new UsurperGenerator<FcknVO>(FcknVO.class, usurperGeneratorSetup);
// GENERATE USURPER
FcknVO object = fcknVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
assertEquals("the specificFieldHandler should put a default value for the field", TestCommons.BIG_INTEGER_VALUE, ((FcknVO) object).getBigIntField());
assertEquals("the specificFieldHandler should put a default value for the field", TestCommons.BIG_INTEGER_VALUE, ((FcknVO) object).getBigIntField2());
try {
TestCommons.auditVO(object);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateObjectWithPropertyTypeHandler() {
// PREPARE USURPER GENERATOR SETUP
UsurperGeneratorSetup usurperGeneratorSetup = new UsurperGeneratorSetup();
usurperGeneratorSetup.registerPropertyTypeHandler(new AbstractPropertyTypeHandler(BigInteger.class) {
public Object handle(HandledBeanProperty handledBeanProperty) {
return new BigInteger(24, new Random());
}
public Object handle(HandledConstructorArg handledConstructorArg) {
return new BigInteger(24, new Random());
}
});
// CREATE USURPER GENERATOR
UsurperGenerator<FcknVO> fcknVOUsurper = new UsurperGenerator<FcknVO>(FcknVO.class, usurperGeneratorSetup);
// GENERATE USURPER
FcknVO object3 = fcknVOUsurper.generateUsurper();
// VALIDATE RESULTING OBJECT
try {
TestCommons.auditVO(object3);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
public void testGenerateCollection() {
// CREATE USURPER GENERATOR
UsurperGenerator<DummyVO> dummyVOUsurper = new UsurperGenerator<DummyVO>(DummyVO.class);
int collectionSize = 2;
// GENERATE USURPER LIST
List<DummyVO> list = dummyVOUsurper.generateUsurperList(collectionSize);
// VALIDATE RESULTING OBJECT
assertEquals("the generated list's size should be " + collectionSize, list.size(), collectionSize);
for (DummyVO dummyVO : list) {
try {
TestCommons.auditVO(dummyVO);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
// GENERATE USURPER SET
Set<DummyVO> set = dummyVOUsurper.generateUsurperSet(collectionSize);
// VALIDATE RESULTING OBJECT
assertEquals("the generated list's size should be " + collectionSize, set.size(), collectionSize);
for (DummyVO dummyVO : set) {
try {
TestCommons.auditVO(dummyVO);
} catch (NullPropertyException e) {
fail(e.getMessage());
}
}
}
}