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 "";
+ }
+
+}