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