Class RecursiveComparisonDifferenceCalculator
- java.lang.Object
-
- org.assertj.core.api.recursive.comparison.RecursiveComparisonDifferenceCalculator
-
public class RecursiveComparisonDifferenceCalculator extends java.lang.ObjectBased onDeepDifferencebut takes aRecursiveComparisonConfiguration,DeepDifferencebeing itself based on the deep equals implementation of https://github.com/jdereg/java-util
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classRecursiveComparisonDifferenceCalculator.ComparisonState
-
Field Summary
Fields Modifier and Type Field Description private static java.lang.StringACTUAL_IS_AN_ENUM_WHILE_EXPECTED_IS_NOTprivate static java.lang.StringACTUAL_NOT_ORDERED_COLLECTIONprivate static java.lang.StringARRAY_FIELD_NAMEprivate static java.util.Map<java.lang.Class<?>,java.lang.Boolean>customEqualsprivate static java.lang.StringDIFFERENT_ACTUAL_AND_EXPECTED_FIELD_TYPESprivate static java.lang.StringDIFFERENT_SIZE_ERRORprivate static java.lang.StringMISSING_FIELDSprivate static java.lang.StringSTRICT_TYPE_ERRORprivate static java.lang.StringVALUE_FIELD_NAME
-
Constructor Summary
Constructors Constructor Description RecursiveComparisonDifferenceCalculator()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private static java.util.Map<java.lang.Integer,? extends java.util.List<?>>actualElementsGroupedByHashCode(java.lang.Iterable<?> actual)private static booleanareDualValueEqual(DualValue dualValue, RecursiveComparisonConfiguration recursiveComparisonConfiguration)private static booleanareEqualUsingComparator(java.lang.Object actual, java.lang.Object expected, java.util.Comparator<java.lang.Object> comparator, java.lang.String fieldName)private static voidcompareArrays(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static voidcompareAsEnums(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState, RecursiveComparisonConfiguration recursiveComparisonConfiguration)private static voidcompareAtomicBoolean(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static voidcompareAtomicInteger(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static voidcompareAtomicIntegerArray(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static voidcompareAtomicLong(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static voidcompareAtomicLongArray(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static voidcompareAtomicReference(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static voidcompareAtomicReferenceArray(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static voidcompareOptional(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static voidcompareOrderedCollections(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static <K,V>
voidcompareSortedMap(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static voidcompareUnorderedIterables(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static voidcompareUnorderedMap(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static java.lang.StringdescribeOrderedCollectionTypes()private static java.util.List<ComparisonDifference>determineDifferences(java.lang.Object actual, java.lang.Object expected, FieldLocation fieldLocation, VisitedDualValues visitedDualValues, RecursiveComparisonConfiguration recursiveComparisonConfiguration)java.util.List<ComparisonDifference>determineDifferences(java.lang.Object actual, java.lang.Object expected, RecursiveComparisonConfiguration recursiveComparisonConfiguration)Compare two objects for differences by doing a 'deep' comparison.private static java.lang.StringdifferentTypeErrorMessage(DualValue dualValue, java.lang.String actualTypeDescription)private static voidenumComparedToDifferentTypeError(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static ComparisonDifferenceexpectedAndActualTypeDifference(java.lang.Object actual, java.lang.Object expected)private static booleanexpectedTypeIsNotSubtypeOfActualType(java.lang.Object actual, java.lang.Object expected)private static booleanexpectedTypeIsNotSubtypeOfActualType(DualValue dualField)private static java.util.Map<?,?>filterIgnoredFields(java.util.Map<?,?> map, FieldLocation fieldLocation, RecursiveComparisonConfiguration configuration)(package private) static booleanhasOverriddenEquals(java.lang.Class<?> c)Determine if the passed in class has a non-Object.equals() method.private static FieldLocationkeyFieldLocation(FieldLocation parentFieldLocation, java.lang.Object key)private static booleansearchExpectedElementIn(java.util.Iterator<?> actualIterator, java.lang.Object expectedElement, DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)private static booleanshouldHonorEquals(DualValue dualValue, RecursiveComparisonConfiguration recursiveComparisonConfiguration)private static booleanshouldHonorJavaTypeEquals(DualValue dualValue)private static booleanshouldHonorOverriddenEquals(DualValue dualValue, RecursiveComparisonConfiguration recursiveComparisonConfiguration)private static <T,K,U>
java.util.stream.Collector<T,?,java.util.Map<K,U>>toMap(java.util.function.Function<? super T,? extends K> keyMapper, java.util.function.Function<? super T,? extends U> valueMapper)
-
-
-
Field Detail
-
DIFFERENT_ACTUAL_AND_EXPECTED_FIELD_TYPES
private static final java.lang.String DIFFERENT_ACTUAL_AND_EXPECTED_FIELD_TYPES
- See Also:
- Constant Field Values
-
ACTUAL_IS_AN_ENUM_WHILE_EXPECTED_IS_NOT
private static final java.lang.String ACTUAL_IS_AN_ENUM_WHILE_EXPECTED_IS_NOT
- See Also:
- Constant Field Values
-
ACTUAL_NOT_ORDERED_COLLECTION
private static final java.lang.String ACTUAL_NOT_ORDERED_COLLECTION
-
VALUE_FIELD_NAME
private static final java.lang.String VALUE_FIELD_NAME
- See Also:
- Constant Field Values
-
ARRAY_FIELD_NAME
private static final java.lang.String ARRAY_FIELD_NAME
- See Also:
- Constant Field Values
-
STRICT_TYPE_ERROR
private static final java.lang.String STRICT_TYPE_ERROR
- See Also:
- Constant Field Values
-
DIFFERENT_SIZE_ERROR
private static final java.lang.String DIFFERENT_SIZE_ERROR
- See Also:
- Constant Field Values
-
MISSING_FIELDS
private static final java.lang.String MISSING_FIELDS
- See Also:
- Constant Field Values
-
customEquals
private static final java.util.Map<java.lang.Class<?>,java.lang.Boolean> customEquals
-
-
Method Detail
-
determineDifferences
public java.util.List<ComparisonDifference> determineDifferences(java.lang.Object actual, java.lang.Object expected, RecursiveComparisonConfiguration recursiveComparisonConfiguration)
Compare two objects for differences by doing a 'deep' comparison. This will traverse the Object graph and perform either a field-by-field comparison on each object (if not .equals() method has been overridden from Object), or it will call the customized .equals() method if it exists.This method handles cycles correctly, for example A->B->C->A. Suppose a and a' are two separate instances of the A with the same values for all fields on A, B, and C. Then a.deepEquals(a') will return an empty list. It uses cycle detection storing visited objects in a Set to prevent endless loops.
- Parameters:
actual- Object one to compareexpected- Object two to comparerecursiveComparisonConfiguration- the recursive comparison configuration- Returns:
- the list of differences found or an empty list if objects are equivalent. Equivalent means that all field values of both subgraphs are the same, either at the field level or via the respectively encountered overridden .equals() methods during traversal.
-
determineDifferences
private static java.util.List<ComparisonDifference> determineDifferences(java.lang.Object actual, java.lang.Object expected, FieldLocation fieldLocation, VisitedDualValues visitedDualValues, RecursiveComparisonConfiguration recursiveComparisonConfiguration)
-
compareAsEnums
private static void compareAsEnums(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState, RecursiveComparisonConfiguration recursiveComparisonConfiguration)
-
enumComparedToDifferentTypeError
private static void enumComparedToDifferentTypeError(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
shouldHonorEquals
private static boolean shouldHonorEquals(DualValue dualValue, RecursiveComparisonConfiguration recursiveComparisonConfiguration)
-
shouldHonorJavaTypeEquals
private static boolean shouldHonorJavaTypeEquals(DualValue dualValue)
-
shouldHonorOverriddenEquals
private static boolean shouldHonorOverriddenEquals(DualValue dualValue, RecursiveComparisonConfiguration recursiveComparisonConfiguration)
-
compareArrays
private static void compareArrays(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
compareOrderedCollections
private static void compareOrderedCollections(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
differentTypeErrorMessage
private static java.lang.String differentTypeErrorMessage(DualValue dualValue, java.lang.String actualTypeDescription)
-
compareUnorderedIterables
private static void compareUnorderedIterables(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
actualElementsGroupedByHashCode
private static java.util.Map<java.lang.Integer,? extends java.util.List<?>> actualElementsGroupedByHashCode(java.lang.Iterable<?> actual)
-
searchExpectedElementIn
private static boolean searchExpectedElementIn(java.util.Iterator<?> actualIterator, java.lang.Object expectedElement, DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
compareSortedMap
private static <K,V> void compareSortedMap(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
compareUnorderedMap
private static void compareUnorderedMap(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
filterIgnoredFields
private static java.util.Map<?,?> filterIgnoredFields(java.util.Map<?,?> map, FieldLocation fieldLocation, RecursiveComparisonConfiguration configuration)
-
toMap
private static <T,K,U> java.util.stream.Collector<T,?,java.util.Map<K,U>> toMap(java.util.function.Function<? super T,? extends K> keyMapper, java.util.function.Function<? super T,? extends U> valueMapper)
-
keyFieldLocation
private static FieldLocation keyFieldLocation(FieldLocation parentFieldLocation, java.lang.Object key)
-
compareOptional
private static void compareOptional(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
compareAtomicBoolean
private static void compareAtomicBoolean(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
compareAtomicInteger
private static void compareAtomicInteger(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
compareAtomicIntegerArray
private static void compareAtomicIntegerArray(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
compareAtomicLong
private static void compareAtomicLong(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
compareAtomicLongArray
private static void compareAtomicLongArray(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
compareAtomicReferenceArray
private static void compareAtomicReferenceArray(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
compareAtomicReference
private static void compareAtomicReference(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
-
hasOverriddenEquals
static boolean hasOverriddenEquals(java.lang.Class<?> c)
Determine if the passed in class has a non-Object.equals() method. This method caches its results in static ConcurrentHashMap to benefit execution performance.- Parameters:
c- Class to check.- Returns:
- true, if the passed in Class has a .equals() method somewhere between itself and just below Object in it's inheritance.
-
areDualValueEqual
private static boolean areDualValueEqual(DualValue dualValue, RecursiveComparisonConfiguration recursiveComparisonConfiguration)
-
areEqualUsingComparator
private static boolean areEqualUsingComparator(java.lang.Object actual, java.lang.Object expected, java.util.Comparator<java.lang.Object> comparator, java.lang.String fieldName)
-
expectedAndActualTypeDifference
private static ComparisonDifference expectedAndActualTypeDifference(java.lang.Object actual, java.lang.Object expected)
-
expectedTypeIsNotSubtypeOfActualType
private static boolean expectedTypeIsNotSubtypeOfActualType(DualValue dualField)
-
expectedTypeIsNotSubtypeOfActualType
private static boolean expectedTypeIsNotSubtypeOfActualType(java.lang.Object actual, java.lang.Object expected)
-
describeOrderedCollectionTypes
private static java.lang.String describeOrderedCollectionTypes()
-
-