This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch 
feature/improved-mismatch-output-for-resource-properties-matcher
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-testing-hamcrest.git

commit ed90660ec0cde7947f3e6e64230b01d59a4cf67f
Author: Konrad Windszus <[email protected]>
AuthorDate: Wed Jun 18 16:52:03 2025 +0200

    SLING-12833 Improved output for mismatch
    
    Highlight the first property name, value and type where a mismatch
    occurred.
---
 .../matchers/ResourcePropertiesMatcher.java        | 29 ++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/hamcrest/matchers/ResourcePropertiesMatcher.java
 
b/src/main/java/org/apache/sling/hamcrest/matchers/ResourcePropertiesMatcher.java
index 4bbba9e..461e449 100644
--- 
a/src/main/java/org/apache/sling/hamcrest/matchers/ResourcePropertiesMatcher.java
+++ 
b/src/main/java/org/apache/sling/hamcrest/matchers/ResourcePropertiesMatcher.java
@@ -29,12 +29,13 @@ import org.hamcrest.TypeSafeMatcher;
 public class ResourcePropertiesMatcher extends TypeSafeMatcher<Resource> {
 
     private final Map<String, Object> expectedProps;
+    private String firstMismatchPropertyName;
 
     public ResourcePropertiesMatcher(Map<String, Object> properties) {
         if (properties == null || properties.isEmpty()) {
             throw new IllegalArgumentException("properties is null or empty");
         }
-
+        firstMismatchPropertyName = null;
         this.expectedProps = properties;
     }
 
@@ -53,11 +54,13 @@ public class ResourcePropertiesMatcher extends 
TypeSafeMatcher<Resource> {
             if (givenValue != null && expectedValue != null
                     && givenValue.getClass().isArray() && 
expectedValue.getClass().isArray()) {
                 if (!arrayEquals(expectedValue, givenValue)) {
+                    firstMismatchPropertyName = prop.getKey();
                     return false;
                 }
             }
             else {
                 if (!objectEquals(expectedValue, givenValue)) {
+                    firstMismatchPropertyName = prop.getKey();
                     return false;
                 }
             }
@@ -99,8 +102,30 @@ public class ResourcePropertiesMatcher extends 
TypeSafeMatcher<Resource> {
              .appendText(" (resource: ")
              .appendValue(item)
              .appendText(")");
+        if (firstMismatchPropertyName != null) {
+            Object expectedValue = 
expectedProps.get(firstMismatchPropertyName);
+            Object actualValue = 
actualProperties.get(firstMismatchPropertyName);
+            mismatchDescription.appendText(System.lineSeparator());
+            mismatchDescription.appendText("     First mismatch in property ")
+                .appendValue(firstMismatchPropertyName)
+                .appendText(": expected ");
+            appendValueAndType(mismatchDescription, expectedValue);
+            mismatchDescription.appendText(" but was ");
+            appendValueAndType(mismatchDescription, actualValue);
+        }
     }
-    
+
+    private static void appendValueAndType(Description mismatchDescription, 
Object value) {
+        if (value == null) {
+            mismatchDescription.appendText("null");
+        } else {
+            mismatchDescription.appendText("value ")
+                .appendValue(value)
+                .appendText(" of type ")
+                .appendValue(value.getClass().getName());
+        }
+    }
+
     /**
      * Convert arrays to string representation to get better message if 
comparison fails.
      * @param props Properties

Reply via email to