Top Description Inners Fields Constructors Methods
org.assertj.core.api.recursive.comparison

public Class RecursiveComparisonDifferenceCalculator

extends Object
Class Inheritance
Static Imports
java.lang.String.format, java.util.Objects.deepEquals, java.util.stream.Collectors.groupingBy, .Collectors.joining, .Collectors.toList, .StreamSupport.stream, org.assertj.core.api.recursive.comparison.ComparisonDifference.rootComparisonDifference, .DualValue.DEFAULT_ORDERED_COLLECTION_TYPES, .FieldLocation.rootFieldLocation, org.assertj.core.util.IterableUtil.sizeOf, .Lists.list, .Sets.newHashSet

Based on DeepDifference but takes a RecursiveComparisonConfiguration, DeepDifference being itself based on the deep equals implementation of https://github.com/jdereg/java-util
Authors
John DeRegnaucourt ([email protected]), Pascal Schumacher

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static class

Field Summary

Modifier and TypeField and Description
private static final String
private static final String
private static final String
private static final Map<Class<?>, Boolean>
private static final String
private static final String
private static final String
private static final String
private static final String

Constructor Summary

AccessConstructor and Description
public

Method Summary

Modifier and TypeMethod and Description
private static boolean
areDualValueEqual(DualValue dualValue, RecursiveComparisonConfiguration recursiveComparisonConfiguration)

private static boolean
areEqualUsingComparator(final Object actual, final Object expected, Comparator<Object> comparator, String fieldName)

private static void
private static void
compareAsEnums(final DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState, RecursiveComparisonConfiguration recursiveComparisonConfiguration)

private static void
private static void
private static void
private static void
private static void
private static void
private static void
private static void
private static void
private static <K, V> void
private static void
private static void
private static String
public List<ComparisonDifference>

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
(Object
Object one to compare
actual
,
Object
Object two to compare
expected
,
RecursiveComparisonConfiguration
the recursive comparison configuration
recursiveComparisonConfiguration
)

Compare two objects for differences by doing a 'deep' comparison.

private static List<ComparisonDifference>
determineDifferences(Object actual, Object expected, FieldLocation fieldLocation, VisitedDualValues visitedDualValues, RecursiveComparisonConfiguration recursiveComparisonConfiguration)

private static String
differentTypeErrorMessage(DualValue dualValue, String actualTypeDescription)

private static void
private static ComparisonDifference
private static boolean
private static boolean
private static String
pack-priv static boolean

Returns:

true, if the passed in Class has a .equals() method somewhere between itself and just below Object in it's inheritance.
hasOverriddenEquals
(Class<?>
Class to check.
c
)

Determine if the passed in class has a non-Object.equals() method.

private static boolean
private static FieldLocation
keyFieldLocation(FieldLocation parentFieldLocation, Object key)

private static boolean
searchIterableForElement(Iterator<?> actualIterator, Object expectedElement, DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)

private static boolean
shouldHonorEquals(DualValue dualValue, RecursiveComparisonConfiguration recursiveComparisonConfiguration)

private static boolean
shouldHonorOverriddenEquals(DualValue dualValue, RecursiveComparisonConfiguration recursiveComparisonConfiguration)

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

ACTUAL_IS_AN_ENUM_WHILE_EXPECTED_IS_NOTback to summary
private static final String ACTUAL_IS_AN_ENUM_WHILE_EXPECTED_IS_NOT
ACTUAL_NOT_ORDERED_COLLECTIONback to summary
private static final String ACTUAL_NOT_ORDERED_COLLECTION
ARRAY_FIELD_NAMEback to summary
private static final String ARRAY_FIELD_NAME
customEqualsback to summary
private static final Map<Class<?>, Boolean> customEquals
DIFFERENT_ACTUAL_AND_EXPECTED_FIELD_TYPESback to summary
private static final String DIFFERENT_ACTUAL_AND_EXPECTED_FIELD_TYPES
DIFFERENT_SIZE_ERRORback to summary
private static final String DIFFERENT_SIZE_ERROR
MISSING_FIELDSback to summary
private static final String MISSING_FIELDS
STRICT_TYPE_ERRORback to summary
private static final String STRICT_TYPE_ERROR
VALUE_FIELD_NAMEback to summary
private static final String VALUE_FIELD_NAME

Constructor Detail

RecursiveComparisonDifferenceCalculatorback to summary
public RecursiveComparisonDifferenceCalculator()

Method Detail

areDualValueEqualback to summary
private static boolean areDualValueEqual(DualValue dualValue, RecursiveComparisonConfiguration recursiveComparisonConfiguration)
Annotations
@SuppressWarnings:rawtypes, unchecked
areEqualUsingComparatorback to summary
private static boolean areEqualUsingComparator(final Object actual, final Object expected, Comparator<Object> comparator, String fieldName)
compareArraysback to summary
private static void compareArrays(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
compareAsEnumsback to summary
private static void compareAsEnums(final DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState, RecursiveComparisonConfiguration recursiveComparisonConfiguration)
compareAtomicBooleanback to summary
private static void compareAtomicBoolean(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
compareAtomicIntegerback to summary
private static void compareAtomicInteger(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
compareAtomicIntegerArrayback to summary
private static void compareAtomicIntegerArray(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
compareAtomicLongback to summary
private static void compareAtomicLong(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
compareAtomicLongArrayback to summary
private static void compareAtomicLongArray(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
compareAtomicReferenceback to summary
private static void compareAtomicReference(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
compareAtomicReferenceArrayback to summary
private static void compareAtomicReferenceArray(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
compareOptionalback to summary
private static void compareOptional(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
compareOrderedCollectionsback to summary
private static void compareOrderedCollections(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
compareSortedMapback to summary
private static <K, V> void compareSortedMap(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
compareUnorderedIterablesback to summary
private static void compareUnorderedIterables(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
compareUnorderedMapback to summary
private static void compareUnorderedMap(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
describeOrderedCollectionTypesback to summary
private static String describeOrderedCollectionTypes()
determineDifferencesback to summary
public List<ComparisonDifference> determineDifferences(Object actual, 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

Object one to compare

expected:Object

Object two to compare

recursiveComparisonConfiguration:RecursiveComparisonConfiguration

the recursive comparison configuration

Returns:List<ComparisonDifference>

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.

determineDifferencesback to summary
private static List<ComparisonDifference> determineDifferences(Object actual, Object expected, FieldLocation fieldLocation, VisitedDualValues visitedDualValues, RecursiveComparisonConfiguration recursiveComparisonConfiguration)
differentTypeErrorMessageback to summary
private static String differentTypeErrorMessage(DualValue dualValue, String actualTypeDescription)
enumComparedToDifferentTypeErrorback to summary
private static void enumComparedToDifferentTypeError(DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
expectedAndActualTypeDifferenceback to summary
private static ComparisonDifference expectedAndActualTypeDifference(Object actual, Object expected)
expectedTypeIsNotSubtypeOfActualTypeback to summary
private static boolean expectedTypeIsNotSubtypeOfActualType(DualValue dualField)
expectedTypeIsNotSubtypeOfActualTypeback to summary
private static boolean expectedTypeIsNotSubtypeOfActualType(Object actual, Object expected)
getChildFieldForValidationback to summary
private static String getChildFieldForValidation(FieldLocation field, FieldLocation fieldValue)
hasOverriddenEqualsback to summary
pack-priv static boolean hasOverriddenEquals(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<?>

Class to check.

Returns:boolean

true, if the passed in Class has a .equals() method somewhere between itself and just below Object in it's inheritance.

isChildOfSpecifiedComparatorFieldback to summary
private static boolean isChildOfSpecifiedComparatorField(DualValue dualValue, FieldLocation field)
keyFieldLocationback to summary
private static FieldLocation keyFieldLocation(FieldLocation parentFieldLocation, Object key)
searchIterableForElementback to summary
private static boolean searchIterableForElement(Iterator<?> actualIterator, Object expectedElement, DualValue dualValue, RecursiveComparisonDifferenceCalculator.ComparisonState comparisonState)
shouldHonorEqualsback to summary
private static boolean shouldHonorEquals(DualValue dualValue, RecursiveComparisonConfiguration recursiveComparisonConfiguration)
shouldHonorOverriddenEqualsback to summary
private static boolean shouldHonorOverriddenEquals(DualValue dualValue, RecursiveComparisonConfiguration recursiveComparisonConfiguration)
org.assertj.core.api.recursive.comparison back to summary

private Class RecursiveComparisonDifferenceCalculator.ComparisonState

extends Object
Class Inheritance
  • java.lang.Object
  • org.assertj.core.api.recursive.comparison.RecursiveComparisonDifferenceCalculator.ComparisonState

Field Summary

Modifier and TypeField and Description
pack-priv List<ComparisonDifference>
pack-priv DualValueDeque
pack-priv RecursiveComparisonConfiguration
pack-priv VisitedDualValues

Constructor Summary

AccessConstructor and Description
public
ComparisonState(VisitedDualValues visitedDualValues, RecursiveComparisonConfiguration recursiveComparisonConfiguration)

Method Summary

Modifier and TypeMethod and Description
pack-priv void
pack-priv void
addDifference(DualValue dualValue, String description)

pack-priv void
addKeyDifference(DualValue parentDualValue, Object actualKey, Object expectedKey)

private String
public List<ComparisonDifference>
public boolean
private void
initDualValuesToCompare(Object actual, Object expected, FieldLocation nodeLocation)

private boolean
public DualValue
private void
Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

differencesback to summary
pack-priv List<ComparisonDifference> differences
dualValuesToCompareback to summary
pack-priv DualValueDeque dualValuesToCompare
recursiveComparisonConfigurationback to summary
pack-priv RecursiveComparisonConfiguration recursiveComparisonConfiguration
visitedDualValuesback to summary
pack-priv VisitedDualValues visitedDualValues

Constructor Detail

ComparisonStateback to summary
public ComparisonState(VisitedDualValues visitedDualValues, RecursiveComparisonConfiguration recursiveComparisonConfiguration)

Method Detail

addDifferenceback to summary
pack-priv void addDifference(DualValue dualValue)
addDifferenceback to summary
pack-priv void addDifference(DualValue dualValue, String description)
addKeyDifferenceback to summary
pack-priv void addKeyDifference(DualValue parentDualValue, Object actualKey, Object expectedKey)
getCustomErrorMessageback to summary
private String getCustomErrorMessage(DualValue dualValue)
getDifferencesback to summary
public List<ComparisonDifference> getDifferences()
hasDualValuesToCompareback to summary
public boolean hasDualValuesToCompare()
initDualValuesToCompareback to summary
private void initDualValuesToCompare(Object actual, Object expected, FieldLocation nodeLocation)
mustCompareNodesRecursivelyback to summary
private boolean mustCompareNodesRecursively(DualValue dualValue)
pickDualValueToCompareback to summary
public DualValue pickDualValueToCompare()
registerForComparisonback to summary
private void registerForComparison(DualValue dualValue)