diff --git a/CHANGELOG.md b/CHANGELOG.md index 18279c8..c388ca8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ ## Change log ---------------------- +Version 3.2-SNAPSHOT +------------- + +CHANGED: + +- update of parent version to 5 +- update of dependency randomizer-core version to 6.0.1 + Version 3.1.2 ------------- diff --git a/README.md b/README.md index 4308402..fd340a1 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Than you can add the dependency to your dependencies: ... - 3.1.2 + 3.2 ... ... diff --git a/pom.xml b/pom.xml index 17a2abe..1d0c823 100644 --- a/pom.xml +++ b/pom.xml @@ -7,11 +7,11 @@ de.alpharogroup mvn-java-parent - 4.8 + 5 jobj-contract-verifier - 3.1.2 + 3.2 ${project.artifactId} @@ -25,7 +25,7 @@ 5.2 - 5.8.3 + 6.0.1 diff --git a/src/main/java/de/alpharogroup/evaluate/object/checkers/EqualsHashCodeAndToStringCheck.java b/src/main/java/de/alpharogroup/evaluate/object/checkers/EqualsHashCodeAndToStringCheck.java index 4cb2d0f..3563832 100644 --- a/src/main/java/de/alpharogroup/evaluate/object/checkers/EqualsHashCodeAndToStringCheck.java +++ b/src/main/java/de/alpharogroup/evaluate/object/checkers/EqualsHashCodeAndToStringCheck.java @@ -24,6 +24,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.Optional; import java.util.function.Function; +import java.util.logging.Level; import de.alpharogroup.clone.object.CloneObjectExtensions; import de.alpharogroup.evaluate.object.api.ContractViolation; @@ -32,13 +33,17 @@ import de.alpharogroup.random.RandomObjectFactory; import io.github.benas.randombeans.EnhancedRandomBuilder; import lombok.experimental.UtilityClass; +import lombok.extern.java.Log; /** * The class {@link EqualsHashCodeAndToStringCheck} is a combination of all checks. */ @UtilityClass +@Log public final class EqualsHashCodeAndToStringCheck { + /** The Constant value for the default max iteration. */ + public static final int DEFAULT_MAX_ITERATION = 9999; /** * Checks all the contract conditions for the methods {@link Object#equals(Object)} and @@ -294,26 +299,110 @@ public static Optional equalsHashcodeAndToString(Class { return Optional.of(ToStringContractViolation.CLASS_NULL_ARGUMENT); } - final T first = function.apply(cls); + + final T first = getRandomObject(cls, function); + final T second = getSecondRandomObject(cls, function, first); + final T third = (T)CloneObjectExtensions.cloneObject(first); + final T fourth = (T)CloneObjectExtensions.cloneObject(third); + + return EqualsHashCodeAndToStringCheck.equalsHashcodeAndToString(first, second, third, + fourth); + } + + private static T getSecondRandomObject(Class cls, Function, T> function, + T first) throws AssertionError + { T second = null; + int count = 0; + boolean iterate = true; do { - if (second == null) + second = getRandomObject(cls, function); + count++; + try { + iterate = first.equals(second); + } catch(Exception e) { + iterate = false; + log.log(Level.INFO, e.getMessage(), e); + } + } + while (iterate && count < DEFAULT_MAX_ITERATION); + return second; + } + + private static T getRandomObject(Class cls, Function, T> function) + throws AssertionError + { + return getRandomObject(cls, function, false); + } + + private static T getRandomObject(Class cls, Function, T> function, + boolean withRandomizer) throws AssertionError + { + T first = null; + Optional optionalRandomObject = forceNewRandomObject(cls, function, withRandomizer); + if (optionalRandomObject.isPresent()) + { + first = optionalRandomObject.get(); + } + else + { + throw new AssertionError("Failed to create random object."); + } + return first; + } + + private static Optional forceNewRandomObject(Class cls, + Function, T> function, boolean withRandomizer) + { + Optional optionalRandomObject = Optional.empty(); + if (withRandomizer) + { + optionalRandomObject = newRandomObjectWithRandomizer(cls, function); + if (!optionalRandomObject.isPresent()) { - second = function.apply(cls); + optionalRandomObject = newRandomObjectWithRandomBeans(cls, function); } - else + } + else + { + optionalRandomObject = newRandomObjectWithRandomBeans(cls, function); + if (!optionalRandomObject.isPresent()) { - second = RandomObjectFactory.newRandomObject(cls); + optionalRandomObject = newRandomObjectWithRandomizer(cls, function); } } - while (second.equals(first)); + return optionalRandomObject; + } - final T third = (T)CloneObjectExtensions.cloneObject(first); - final T fourth = (T)CloneObjectExtensions.cloneObject(third); + private static Optional newRandomObjectWithRandomBeans(Class cls, + Function, T> function) + { + Optional randomObject = Optional.empty(); + try + { + randomObject = Optional.of(function.apply(cls)); + } + catch (Exception e) + { + log.log(Level.INFO, "Failed to create random object with random beans.", e); + } + return randomObject; + } - return EqualsHashCodeAndToStringCheck.equalsHashcodeAndToString(first, second, third, - fourth); + private static Optional newRandomObjectWithRandomizer(Class cls, + Function, T> function) + { + Optional randomObject = Optional.empty(); + try + { + randomObject = Optional.of(RandomObjectFactory.newRandomObject(cls)); + } + catch (Exception e) + { + log.log(Level.INFO, "Failed to create random object with RandomObjectFactory", e); + } + return randomObject; } /** diff --git a/src/test/java/de/alpharogroup/evaluate/object/verifier/ContractVerifierTest.java b/src/test/java/de/alpharogroup/evaluate/object/verifier/ContractVerifierTest.java index 2f9e4e0..8ab0ae0 100644 --- a/src/test/java/de/alpharogroup/evaluate/object/verifier/ContractVerifierTest.java +++ b/src/test/java/de/alpharogroup/evaluate/object/verifier/ContractVerifierTest.java @@ -22,8 +22,28 @@ import org.testng.annotations.Test; +import de.alpharogroup.test.objects.A; +import de.alpharogroup.test.objects.AlgorithmModel; +import de.alpharogroup.test.objects.ClonableObject; +import de.alpharogroup.test.objects.Company; +import de.alpharogroup.test.objects.Customer; +import de.alpharogroup.test.objects.Employee; +import de.alpharogroup.test.objects.EmployeeList; +import de.alpharogroup.test.objects.Light; import de.alpharogroup.test.objects.Member; +import de.alpharogroup.test.objects.NotSerializable; +import de.alpharogroup.test.objects.Permission; import de.alpharogroup.test.objects.Person; +import de.alpharogroup.test.objects.PremiumMember; +import de.alpharogroup.test.objects.Television; +import de.alpharogroup.test.objects.annotations.classes.AnnotatedClass; +import de.alpharogroup.test.objects.annotations.classes.AnnotatedTestClass; +import de.alpharogroup.test.objects.annotations.classes.ClassExtendsAnnotatedInterface; +import de.alpharogroup.test.objects.annotations.classes.SubAnnotatedClass; +import de.alpharogroup.test.objects.auth.AccessRight; +import de.alpharogroup.test.objects.auth.Role; +import de.alpharogroup.test.objects.auth.Roles; +import de.alpharogroup.test.objects.exceptions.ExceptionEvent; /** * The unit test class for the class {@link ContractVerifier} @@ -37,7 +57,28 @@ public class ContractVerifierTest @Test public void testOfVerify() { - ContractVerifier.of(Person.class).verify(); + ContractVerifier.of(AnnotatedClass.class).verify(); + ContractVerifier.of(AnnotatedTestClass.class).verify(); + ContractVerifier.of(ClassExtendsAnnotatedInterface.class).verify(); + ContractVerifier.of(SubAnnotatedClass.class).verify(); + ContractVerifier.of(AccessRight.class).verify(); + ContractVerifier.of(Roles.class).verify(); + ContractVerifier.of(Role.class).verify(); + ContractVerifier.of(ExceptionEvent.class).verify(); + ContractVerifier.of(AlgorithmModel.class).verify(); + ContractVerifier.of(A.class).verify(); + ContractVerifier.of(ClonableObject.class).verify(); + ContractVerifier.of(Company.class).verify(); + ContractVerifier.of(Customer.class).verify(); + ContractVerifier.of(EmployeeList.class).verify(); + ContractVerifier.of(Employee.class).verify(); + ContractVerifier.of(Light.class).verify(); ContractVerifier.of(Member.class).verify(); + ContractVerifier.of(NotSerializable.class).verify(); + ContractVerifier.of(Permission.class).verify(); + ContractVerifier.of(Person.class).verify(); + ContractVerifier.of(PremiumMember.class).verify(); + ContractVerifier.of(Television.class).verify(); + ContractVerifier.of(ManifestVersion.class).withFactoryFunction(clzz -> ManifestVersion.builder().build()).verify(); } } diff --git a/src/test/java/de/alpharogroup/evaluate/object/verifier/ManifestVersion.java b/src/test/java/de/alpharogroup/evaluate/object/verifier/ManifestVersion.java new file mode 100644 index 0000000..df145e3 --- /dev/null +++ b/src/test/java/de/alpharogroup/evaluate/object/verifier/ManifestVersion.java @@ -0,0 +1,69 @@ +package de.alpharogroup.evaluate.object.verifier; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.jar.Attributes; +import java.util.jar.Manifest; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.FieldDefaults; + +/** + * Simple bean to hold information about the version of a Manifest. Can be used for JAR, EAR and WAR + * manifest files. + */ +@Getter +@Setter +@EqualsAndHashCode +@ToString +@NoArgsConstructor +@AllArgsConstructor +@Builder(toBuilder = true) +@FieldDefaults(level = AccessLevel.PRIVATE) +public class ManifestVersion implements Serializable +{ + + /** The serialVersionUID. */ + private static final long serialVersionUID = 1L; + + /** The last modified holds the {@code LocalDateTime} when the last build was. */ + LocalDateTime lastModified; + + /** The manifest. */ + Manifest manifest; + + /** The title. */ + String title; + + /** The version number. */ + String version; + + /** + * Gets the manifest attribute value from the given {@code Attributes.Name} object. + * + * @param name + * the name + * @return the manifest attribute or an empty String if the manifest attribute value is null + */ + public String getManifestAttribute(final Attributes.Name name) + { + if (getManifest() != null) + { + final Attributes attributes = getManifest().getMainAttributes(); + final Object value = attributes.get(name); + if (value != null) + { + return value.toString().trim(); + } + } + return ""; + } + +}