Skip to content

Commit

Permalink
192. Merged PrimitiveInstantiator, StringClassInstantiator, JavaLangC…
Browse files Browse the repository at this point in the history
…lassInstantiator into JavaTypeInstantiator, which supports java type objects creation.
  • Loading branch information
sta-szek committed Nov 15, 2017
1 parent a8c56d2 commit 6929339
Show file tree
Hide file tree
Showing 56 changed files with 795 additions and 426 deletions.
1 change: 1 addition & 0 deletions src/book/release-notes/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Download latest version [ ![Download](https://api.bintray.com/packages/sta-szek/

### Features
* Quick testing - generate less objects ([#201](https://github.com/sta-szek/pojo-tester/issues/201), [#203](https://github.com/sta-szek/pojo-tester/issues/203))
* More java type instantiators - part of issue [#192](https://github.com/sta-szek/pojo-tester/issues/201)

### Others
* Issue with one-value enum (out of range exception) ([#199](https://github.com/sta-szek/pojo-tester/issues/199))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,21 @@
import java.time.ZonedDateTime;

import static pl.pojo.tester.api.assertion.Assertions.assertPojoMethodsFor;
import static pl.pojo.tester.api.assertion.Method.*;
import static pl.pojo.tester.api.assertion.Method.CONSTRUCTOR;
import static pl.pojo.tester.api.assertion.Method.EQUALS;
import static pl.pojo.tester.api.assertion.Method.GETTER;
import static pl.pojo.tester.api.assertion.Method.HASH_CODE;
import static pl.pojo.tester.api.assertion.Method.TO_STRING;

class EntityClassPojoTest {

@Test
void Should_Test_Entity_Class() {
final ConstructorParameters constructorParameters = new ConstructorParameters(
new Object[]{LocalDateTime.now(), ZoneOffset.MAX, ZoneId.systemDefault()},
new Class[]{LocalDateTime.class, ZoneOffset.class, ZoneId.class});
new Object[]{ LocalDateTime.now(), ZoneOffset.MAX, ZoneId.systemDefault() },
new Class[]{ LocalDateTime.class, ZoneOffset.class, ZoneId.class });

for (int i = 0; i < 1000; i++) {
for (int i = 0; i < 100; i++) {
assertPojoMethodsFor(EntityClass.class).testing(GETTER, TO_STRING, CONSTRUCTOR, EQUALS, HASH_CODE)
.create(ZonedDateTime.class, constructorParameters)
.areWellImplemented();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package pl.pojo.tester.issue192;


import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.time.ZonedDateTime;

@ToString
@EqualsAndHashCode
@Setter
@Getter
class ConstructorWithZonedDateTime {

private ZonedDateTime zonedDateTime;

ConstructorWithZonedDateTime(final ZonedDateTime zonedDateTime) {
this.zonedDateTime = zonedDateTime;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package pl.pojo.tester.issue192;


import org.junit.jupiter.api.Test;

import static pl.pojo.tester.api.assertion.Assertions.assertPojoMethodsFor;

class ConstructorWithZonedDateTimeTest {

@Test
void Should_Create_Instance_That_Have_Zoned_Date_Time_As_Constructor_Parameter() {
assertPojoMethodsFor(ConstructorWithZonedDateTime.class).areWellImplemented();
}
}

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package pl.pojo.tester.api;

import pl.pojo.tester.internal.instantiator.ClassLoader;
import pl.pojo.tester.internal.utils.ClassLoader;

import java.util.function.Predicate;

Expand Down
58 changes: 3 additions & 55 deletions src/main/java/pl/pojo/tester/api/DefaultPackageFilter.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
package pl.pojo.tester.api;


import pl.pojo.tester.internal.instantiator.ClassLoader;
import pl.pojo.tester.internal.utils.ReflectionUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.function.Predicate;
import java.util.regex.Matcher;

import static pl.pojo.tester.internal.preconditions.ParameterPreconditions.checkNotBlank;

Expand All @@ -21,25 +15,17 @@
*/
public final class DefaultPackageFilter implements PackageFilter {

private static final String PACKAGE_SEPARATOR = ".";
private static final String FILE_SEPARATOR = "/";
private static final String CLASS_FILE_SUFFIX = ".class";


private final File packageFile;
private final String packageName;

private DefaultPackageFilter(final String packageName) {
checkNotBlank("packageName", packageName);
this.packageName = packageName;
this.packageFile = getFile(packageName);
}

/**
* Creates filter for package name.
*
* @param packageName name of package
*
* @return filter for package name
*/
public static DefaultPackageFilter forPackage(final String packageName) {
Expand All @@ -50,7 +36,6 @@ public static DefaultPackageFilter forPackage(final String packageName) {
* Creates filter for package of given class.
*
* @param clazz class
*
* @return filter for class package
*/
public static DefaultPackageFilter forClass(final Class<?> clazz) {
Expand All @@ -66,46 +51,9 @@ public static DefaultPackageFilter forClass(final Class<?> clazz) {
@Override
public Class<?>[] getClasses() {
try {
final Predicate<File> onlyFiles = file -> !file.isDirectory();

return Files.walk(packageFile.toPath())
.map(Path::toFile)
.filter(onlyFiles)
.map(this::replaceSlashesWithDots)
.map(this::extractPackageName)
.map(this::removeClassSuffix)
.map(ClassLoader::loadClass)
.toArray(Class[]::new);
return ReflectionUtils.getClassesFromPackage(packageName);
} catch (final IOException e) {
throw new PackageFilterException(packageFile.toString(), e);
throw new PackageFilterException(packageName, e);
}
}

private String replaceSlashesWithDots(final File file) {
return file.toString()
.replaceAll(Matcher.quoteReplacement(File.separator), PACKAGE_SEPARATOR);
}

private String extractPackageName(final String dottedString) {
return dottedString.substring(dottedString.indexOf(packageName));
}


private String removeClassSuffix(final String classFile) {
final int endIndex = classFile.length() - CLASS_FILE_SUFFIX.length();
return classFile.substring(0, endIndex);
}

private File getFile(final String packageName) {
final String packagePath = packageName.replaceAll("\\" + PACKAGE_SEPARATOR, FILE_SEPARATOR);

final URL fileUrl = Thread.currentThread()
.getContextClassLoader()
.getResource(packagePath);
if (fileUrl == null) {
throw new PackageFilterException(packagePath, null);
}
return new File(fileUrl.getFile());
}

}
22 changes: 14 additions & 8 deletions src/main/java/pl/pojo/tester/api/assertion/AbstractAssertion.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
import pl.pojo.tester.api.ClassAndFieldPredicatePair;
import pl.pojo.tester.api.ConstructorParameters;
import pl.pojo.tester.internal.field.AbstractFieldValueChanger;
import pl.pojo.tester.internal.instantiator.ClassLoader;
import pl.pojo.tester.internal.instantiator.Permutator;
import pl.pojo.tester.internal.instantiator.SublistFieldPermutator;
import pl.pojo.tester.internal.instantiator.ThoroughFieldPermutator;
import pl.pojo.tester.internal.utils.Permutator;
import pl.pojo.tester.internal.utils.SublistFieldPermutator;
import pl.pojo.tester.internal.utils.ThoroughFieldPermutator;
import pl.pojo.tester.internal.tester.AbstractTester;
import pl.pojo.tester.internal.utils.ClassLoader;

import java.util.Arrays;
import java.util.HashSet;
Expand Down Expand Up @@ -139,7 +139,9 @@ public void areWellImplemented() {
* @return itself
* @see ConstructorParameters
*/
public AbstractAssertion create(final String qualifiedClassName, final Object[] constructorParameters, final Class<?>[] constructorParameterTypes) {
public AbstractAssertion create(final String qualifiedClassName,
final Object[] constructorParameters,
final Class<?>[] constructorParameterTypes) {
checkNotBlank("qualifiedClassName", qualifiedClassName);

final ConstructorParameters constructorParameter = new ConstructorParameters(constructorParameters,
Expand All @@ -156,7 +158,8 @@ public AbstractAssertion create(final String qualifiedClassName, final Object[]
* @return itself
* @see ConstructorParameters
*/
public AbstractAssertion create(final String qualifiedClassName, final ConstructorParameters constructorParameters) {
public AbstractAssertion create(final String qualifiedClassName,
final ConstructorParameters constructorParameters) {
checkNotBlank("qualifiedClassName", qualifiedClassName);
checkNotNull("constructorParameters", constructorParameters);

Expand All @@ -175,7 +178,9 @@ public AbstractAssertion create(final String qualifiedClassName, final Construct
* @return itself
* @see ConstructorParameters
*/
public AbstractAssertion create(final Class<?> clazz, final Object[] constructorParameters, final Class<?>[] constructorParameterTypes) {
public AbstractAssertion create(final Class<?> clazz,
final Object[] constructorParameters,
final Class<?>[] constructorParameterTypes) {
checkNotNull("clazz", clazz);

final ConstructorParameters constructorParameter = new ConstructorParameters(constructorParameters,
Expand Down Expand Up @@ -203,7 +208,8 @@ public AbstractAssertion create(final Class<?> clazz, final ConstructorParameter

protected abstract void runAssertions();

protected void logTestersAndClasses(final Logger logger, final ClassAndFieldPredicatePair... classAndFieldPredicatePairs) {
protected void logTestersAndClasses(final Logger logger,
final ClassAndFieldPredicatePair... classAndFieldPredicatePairs) {
if (logger.isDebugEnabled()) {
final String classes = Arrays.stream(classAndFieldPredicatePairs)
.map(ClassAndFieldPredicatePair::toString)
Expand Down
26 changes: 5 additions & 21 deletions src/main/java/pl/pojo/tester/api/assertion/Assertions.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import pl.pojo.tester.api.ClassAndFieldPredicatePair;
import pl.pojo.tester.api.FieldPredicate;
import pl.pojo.tester.api.PackageFilter;
import pl.pojo.tester.internal.instantiator.ClassLoader;
import pl.pojo.tester.internal.utils.ClassLoader;

import java.util.Arrays;
import java.util.List;
Expand All @@ -25,15 +25,14 @@
*/
public final class Assertions {

private Assertions() {}
private Assertions() {
}

/**
* Creates assertion for class, by qualified class name.
*
* @param qualifiedClassName class for assertion
*
* @return assertion for given class
*
* @see AbstractAssertion
* @see MultiClassAssertion
* @see SingleClassAssertion
Expand All @@ -49,9 +48,7 @@ public static AbstractAssertion assertPojoMethodsFor(final String qualifiedClass
* Creates assertion for class.
*
* @param clazz class for assertion
*
* @return assertion for given class
*
* @see AbstractAssertion
* @see MultiClassAssertion
* @see SingleClassAssertion
Expand All @@ -68,14 +65,13 @@ public static AbstractAssertion assertPojoMethodsFor(final Class<?> clazz) {
*
* @param qualifiedClassName class for assertion
* @param fieldPredicate field predicate for given class
*
* @return assertion for given class
*
* @see AbstractAssertion
* @see MultiClassAssertion
* @see SingleClassAssertion
*/
public static AbstractAssertion assertPojoMethodsFor(final String qualifiedClassName, final Predicate<String> fieldPredicate) {
public static AbstractAssertion assertPojoMethodsFor(final String qualifiedClassName,
final Predicate<String> fieldPredicate) {
checkNotBlank("qualifiedClassName", qualifiedClassName);
checkNotNull("fieldPredicate", fieldPredicate);

Expand All @@ -88,9 +84,7 @@ public static AbstractAssertion assertPojoMethodsFor(final String qualifiedClass
*
* @param clazz class for assertion
* @param fieldPredicate field predicate for given class
*
* @return assertion for given class
*
* @see AbstractAssertion
* @see MultiClassAssertion
* @see SingleClassAssertion
Expand All @@ -109,9 +103,7 @@ public static AbstractAssertion assertPojoMethodsFor(final Class<?> clazz, final
*
* @param baseClassAndFieldPredicatePair base class to test
* @param classAndFieldPredicatePairs nested classes, which are used as field types in base class
*
* @return assertion for given base class
*
* @see AbstractAssertion
* @see MultiClassAssertion
* @see SingleClassAssertion
Expand All @@ -126,9 +118,7 @@ public static AbstractAssertion assertPojoMethodsFor(final ClassAndFieldPredicat
* Creates assertion for all classes, by classes names.
*
* @param qualifiedClassNames classes to test
*
* @return assertion for all classes
*
* @see AbstractAssertion
* @see MultiClassAssertion
* @see SingleClassAssertion
Expand All @@ -146,9 +136,7 @@ public static AbstractAssertion assertPojoMethodsForAll(final String... qualifie
* Creates assertion for all classes returned by {@link PackageFilter}.
*
* @param packageFilter package filter
*
* @return assertion for all classes
*
* @see PackageFilter
*/
public static AbstractAssertion assertPojoMethodsForAll(final PackageFilter packageFilter) {
Expand All @@ -160,9 +148,7 @@ public static AbstractAssertion assertPojoMethodsForAll(final PackageFilter pack
* Creates assertion for all classes.
*
* @param classes classes to test
*
* @return assertion for all classes
*
* @see AbstractAssertion
* @see MultiClassAssertion
* @see SingleClassAssertion
Expand All @@ -180,9 +166,7 @@ public static AbstractAssertion assertPojoMethodsForAll(final Class... classes)
* Creates assertion for all classes declared as {@link ClassAndFieldPredicatePair} objects.
*
* @param classesAndFieldPredicatesPairs class and field predicate pairs to test
*
* @return assertion for all classes
*
* @see AbstractAssertion
* @see MultiClassAssertion
* @see SingleClassAssertion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,9 @@ abstract class AbstractMultiConstructorInstantiator extends AbstractObjectInstan

private static final Logger LOGGER = LoggerFactory.getLogger(AbstractMultiConstructorInstantiator.class);

protected final MultiValuedMap<Class<?>, ConstructorParameters> constructorParameters;

AbstractMultiConstructorInstantiator(final Class<?> clazz,
final MultiValuedMap<Class<?>, ConstructorParameters> constructorParameters) {
super(clazz);
this.constructorParameters = constructorParameters;
super(clazz, constructorParameters);
}

protected Object instantiateUsingUserParameters() {
Expand All @@ -35,16 +32,16 @@ protected Object instantiateUsingUserParameters() {
return result;
}
LOGGER.warn("Could not instantiate class {} with user defined parameters. "
+ "Trying create instance finding best constructor", clazz);
+ "Trying create instance finding best constructor", clazz);
}
return null;
}

protected boolean userDefinedOwnParametersForThisClass(final Collection<ConstructorParameters> userConstructorParameters) {
private boolean userDefinedOwnParametersForThisClass(final Collection<ConstructorParameters> userConstructorParameters) {
return CollectionUtils.isNotEmpty(userConstructorParameters);
}

protected Object tryToInstantiateUsing(final Collection<ConstructorParameters> userConstructorParameters) {
private Object tryToInstantiateUsing(final Collection<ConstructorParameters> userConstructorParameters) {
for (final ConstructorParameters param : userConstructorParameters) {
Class<?>[] parameterTypes = param.getParametersTypes();
try {
Expand Down

0 comments on commit 6929339

Please sign in to comment.