Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue 192 #219

Merged
merged 1 commit into from
Nov 15, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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