diff --git a/pom.xml b/pom.xml index f85e2d1..2ce2083 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ 4.0.0 com.github.trickl assertj-json - 0.2.11-SNAPSHOT + 0.2.13-SNAPSHOT jar diff --git a/src/main/java/com/trickl/assertj/core/internal/JsonDiff.java b/src/main/java/com/trickl/assertj/core/internal/JsonDiff.java index 89d3c91..94b3241 100644 --- a/src/main/java/com/trickl/assertj/core/internal/JsonDiff.java +++ b/src/main/java/com/trickl/assertj/core/internal/JsonDiff.java @@ -2,7 +2,7 @@ import com.trickl.assertj.core.api.json.JsonContainer; import com.trickl.assertj.util.diff.JsonFieldDelta; -import com.trickl.assertj.util.diff.JsonMessageDelta; +import com.trickl.assertj.util.diff.JsonRootDelta; import java.io.IOException; import java.util.Collections; import java.util.LinkedList; @@ -33,34 +33,38 @@ public class JsonDiff { public List> diff( JsonContainer actual, JsonContainer expected, JSONComparator comparator) throws IOException { try { - JSONCompareResult result = - JSONCompare.compareJSON(expected.getJson(), actual.getJson(), comparator); - return asDiff(result); + String expectedStr = expected.getJson(); + String actualStr = actual.getJson(); + JSONCompareResult result = JSONCompare.compareJSON(expectedStr, actualStr, comparator); + return asDiff(result, expectedStr, actualStr); } catch (JSONException ex) { throw new IOException(ex); } } - private List> asDiff(JSONCompareResult result) { + private List> asDiff(JSONCompareResult result, String expectedStr, String actualStr) + throws JSONException { if (result.passed()) { - return Collections.EMPTY_LIST; + return Collections.emptyList(); } List> diffs = new LinkedList<>(); for (FieldComparisonFailure missingField : result.getFieldMissing()) { - diffs.add(new JsonFieldDelta(missingField, Delta.TYPE.DELETE)); + diffs.add(new JsonFieldDelta<>(missingField, Delta.TYPE.DELETE)); } for (FieldComparisonFailure changedField : result.getFieldFailures()) { - diffs.add(new JsonFieldDelta(changedField, Delta.TYPE.CHANGE)); + diffs.add(new JsonFieldDelta<>(changedField, Delta.TYPE.CHANGE)); } for (FieldComparisonFailure unexpectedField : result.getFieldUnexpected()) { - diffs.add(new JsonFieldDelta(unexpectedField, Delta.TYPE.INSERT)); + diffs.add(new JsonFieldDelta<>(unexpectedField, Delta.TYPE.INSERT)); } - + if (diffs.isEmpty()) { - diffs.add(new JsonMessageDelta(result.getMessage())); + String expectedNoFormat = expectedStr.replace("\n", "").replace("\r", ""); + String actualNoFormat = actualStr.replace("\n", "").replace("\r", ""); + diffs.add(new JsonRootDelta<>(expectedNoFormat, actualNoFormat, result.getMessage())); } return diffs; diff --git a/src/main/java/com/trickl/assertj/core/presentation/FieldComparisonFailureFormatter.java b/src/main/java/com/trickl/assertj/core/presentation/FieldComparisonFailureFormatter.java index 33f487f..0691bb9 100644 --- a/src/main/java/com/trickl/assertj/core/presentation/FieldComparisonFailureFormatter.java +++ b/src/main/java/com/trickl/assertj/core/presentation/FieldComparisonFailureFormatter.java @@ -10,7 +10,7 @@ public String formatUnexpected(FieldComparisonFailure failure) { return formatUnexpected(failure.getActual()); } - private String formatUnexpected(Object actual) { + protected String formatUnexpected(Object actual) { return "Unexpected: " + describe(actual); } @@ -18,17 +18,31 @@ public String formatMissing(FieldComparisonFailure failure) { return formatMissing(failure.getExpected()); } - private String formatMissing(Object expected) { + protected String formatMissing(Object expected) { return "Expected: " + describe(expected) + " but none found"; } + public String formatRootFailureMessage(Object expected, Object actual) { + return formatFailureMessage(null, expected, actual); + } + public String formatFailureMessage(FieldComparisonFailure failure) { - return FieldComparisonFailureFormatter.this.formatFailureMessage( + return formatFailureMessage( failure.getField(), failure.getActual(), failure.getExpected()); } - private String formatFailureMessage(String field, Object expected, Object actual) { - return quote(field) + " - Expected: " + describe(expected) + " got: " + describe(actual); + protected String formatFailureMessage(String field, Object expected, Object actual) { + StringBuilder messageBuilder = new StringBuilder(); + if (field != null && field.length() > 0) { + messageBuilder.append(quote(field)); + messageBuilder.append(" - "); + } + messageBuilder.append("Expected: "); + messageBuilder.append(describe(expected)); + messageBuilder.append(" "); + messageBuilder.append("got: "); + messageBuilder.append(describe(actual)); + return messageBuilder.toString(); } private static String quote(String value) { diff --git a/src/main/java/com/trickl/assertj/core/util/diff/WriteOnFailureComparator.java b/src/main/java/com/trickl/assertj/core/util/diff/WriteOnFailureComparator.java index ff5e8c4..fbcc75f 100644 --- a/src/main/java/com/trickl/assertj/core/util/diff/WriteOnFailureComparator.java +++ b/src/main/java/com/trickl/assertj/core/util/diff/WriteOnFailureComparator.java @@ -25,14 +25,15 @@ public class WriteOnFailureComparator implements JSONComparator { private final Path actualOutputPath; private final boolean writeExpected; private final Path expectedOutputPath; - private final int indentation = 2; + + private static final int INDENTATION = 2; @Override public JSONCompareResult compareJSON(JSONObject expected, JSONObject actual) throws JSONException { JSONCompareResult result = comparator.compareJSON(expected, actual); - writeOnFailure(result, expected.toString(), actual.toString(indentation)); + writeOnFailure(result, expected.toString(), actual.toString(INDENTATION)); return result; } @@ -40,7 +41,7 @@ public JSONCompareResult compareJSON(JSONObject expected, JSONObject actual) @Override public JSONCompareResult compareJSON(JSONArray expected, JSONArray actual) throws JSONException { JSONCompareResult result = comparator.compareJSON(expected, actual); - writeOnFailure(result, expected.toString(), actual.toString(indentation)); + writeOnFailure(result, expected.toString(), actual.toString(INDENTATION)); return result; } @@ -49,7 +50,7 @@ public void compareJSON( String str, JSONObject expected, JSONObject actual, JSONCompareResult result) throws JSONException { comparator.compareJSON(str, expected, actual, result); - writeOnFailure(result, expected.toString(), actual.toString(indentation)); + writeOnFailure(result, expected.toString(), actual.toString(INDENTATION)); } @Override @@ -64,7 +65,7 @@ public void compareJSONArray( String str, JSONArray expected, JSONArray actual, JSONCompareResult result) throws JSONException { comparator.compareJSONArray(str, expected, actual, result); - writeOnFailure(result, expected.toString(indentation), actual.toString(indentation)); + writeOnFailure(result, expected.toString(INDENTATION), actual.toString(INDENTATION)); } private void writeOnFailure(JSONCompareResult result, String expected, String actual) { diff --git a/src/main/java/com/trickl/assertj/util/diff/JsonMessageDelta.java b/src/main/java/com/trickl/assertj/util/diff/JsonRootDelta.java similarity index 57% rename from src/main/java/com/trickl/assertj/util/diff/JsonMessageDelta.java rename to src/main/java/com/trickl/assertj/util/diff/JsonRootDelta.java index fa2e95b..d558227 100644 --- a/src/main/java/com/trickl/assertj/util/diff/JsonMessageDelta.java +++ b/src/main/java/com/trickl/assertj/util/diff/JsonRootDelta.java @@ -1,5 +1,6 @@ package com.trickl.assertj.util.diff; +import com.trickl.assertj.core.presentation.FieldComparisonFailureFormatter; import java.util.Collections; import java.util.List; import lombok.Getter; @@ -13,20 +14,23 @@ * * @param The type of the compared elements in the 'lines'. */ -public class JsonMessageDelta extends Delta { +public class JsonRootDelta extends Delta { + + @Getter private final String expected; + + @Getter private final String actual; @Getter private final String message; - + @Getter private final TYPE type = TYPE.CHANGE; - - /** - * Create a delta for a JSON document. - * @param message details of the difference - */ - public JsonMessageDelta(String message) { + + /** Create a delta for a JSON document. */ + public JsonRootDelta(String expected, String actual, String message) { super(new Chunk(0, Collections.EMPTY_LIST), new Chunk(0, Collections.EMPTY_LIST)); + this.expected = expected; + this.actual = actual; this.message = message; - } + } @Override public void applyTo(List target) throws IllegalStateException {} @@ -36,6 +40,10 @@ public void verify(List target) throws IllegalStateException {} @Override public String toString() { - return message; + FieldComparisonFailureFormatter formatter = new FieldComparisonFailureFormatter(); + if (message != null && message.length() > 0) { + return message; + } + return formatter.formatRootFailureMessage(expected, actual); } } diff --git a/src/test/java/com/trickl/assertj/core/api/json/JsonAssert_isSameJsonAs_Test.java b/src/test/java/com/trickl/assertj/core/api/json/JsonAssert_isSameJsonAs_Test.java index c920c78..3eb6dc2 100644 --- a/src/test/java/com/trickl/assertj/core/api/json/JsonAssert_isSameJsonAs_Test.java +++ b/src/test/java/com/trickl/assertj/core/api/json/JsonAssert_isSameJsonAs_Test.java @@ -3,12 +3,12 @@ import static com.trickl.assertj.core.api.JsonAssertions.assertThat; import static com.trickl.assertj.core.api.JsonAssertions.json; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; import org.junit.BeforeClass; import org.junit.Test; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; import org.skyscreamer.jsonassert.comparator.JSONComparator; /** @@ -84,6 +84,7 @@ public void should_assert_if_root_string_different() { assertThatThrownBy(() -> assertThat(json("\"test1\"")) .isSameJsonAs("\"test2\"")) .isInstanceOf(AssertionError.class) - .hasMessage("\nInputStream does not have same content as String:\n\n"); + .hasMessage("\nInputStream does not have same content as String:" + + "\n\nExpected: '\"test2\"' got: '\"test1\"'"); } } diff --git a/src/test/java/com/trickl/assertj/core/internal/JsonDiff_diff_File_Test.java b/src/test/java/com/trickl/assertj/core/internal/JsonDiff_diff_File_Test.java index fecaaec..28e1695 100644 --- a/src/test/java/com/trickl/assertj/core/internal/JsonDiff_diff_File_Test.java +++ b/src/test/java/com/trickl/assertj/core/internal/JsonDiff_diff_File_Test.java @@ -2,19 +2,19 @@ import static com.trickl.assertj.core.api.JsonAssertions.json; import static java.lang.String.format; -import static java.nio.charset.Charset.defaultCharset; import static org.assertj.core.api.Assertions.assertThat; +import static org.skyscreamer.jsonassert.JSONCompareMode.NON_EXTENSIBLE; import java.io.File; import java.io.IOException; import java.util.List; + import org.assertj.core.util.Files; import org.assertj.core.util.TextFileWriter; import org.assertj.core.util.diff.Delta; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import static org.skyscreamer.jsonassert.JSONCompareMode.NON_EXTENSIBLE; import org.skyscreamer.jsonassert.comparator.DefaultComparator; /** @@ -54,6 +54,16 @@ public void should_return_empty_diff_list_if_files_have_equal_content() throws I assertThat(diffs).isEmpty(); } + @Test + public void should_return_empty_diff_on_identical_primitives() throws IOException { + writer.write(actual, "\"original\""); + writer.write(expected, "\"original\""); + List> diffs = + diff.diff( + json(actual), json(expected), new DefaultComparator(NON_EXTENSIBLE)); + assertThat(diffs).isEmpty(); + } + @Test public void should_return_diffs_if_files_have_different_fields() throws IOException { writer.write(actual, "{\"id\": 3}"); @@ -67,6 +77,20 @@ public void should_return_diffs_if_files_have_different_fields() throws IOExcept format("\"id\" - Expected: '3' got: '5'")); } + + @Test + public void should_return_diffs_on_different_primitives() throws IOException { + writer.write(actual, "\"actual\""); + writer.write(expected, "\"expected\""); + List> diffs = + diff.diff( + json(actual), json(expected), new DefaultComparator(NON_EXTENSIBLE)); + assertThat(diffs).hasSize(1); + assertThat(diffs.get(0)) + .hasToString( + format("Expected: '\"expected\"' got: '\"actual\"'")); + } + @Test public void should_return_diffs_if_files_have_missing_fields() throws IOException { writer.write(actual, "{\"id\": 3}");