package io.swagger.matchers; import static org.testng.Assert.fail; import io.swagger.util.Json; import io.swagger.util.Yaml; import java.io.IOException; import java.util.Comparator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.NumericNode; import com.fasterxml.jackson.databind.node.ObjectNode; public class SerializationMatchers { private static final Logger LOGGER = LoggerFactory.getLogger(SerializationMatchers.class); public static void assertEqualsToYaml(Object objectToSerialize, String yamlStr) { apply(objectToSerialize, yamlStr, Yaml.mapper()); } public static void assertEqualsToJson(Object objectToSerialize, String jsonStr) { apply(objectToSerialize, jsonStr, Json.mapper()); } private static void apply(Object objectToSerialize, String str, ObjectMapper mapper) { final ObjectNode lhs = mapper.convertValue(objectToSerialize, ObjectNode.class); ObjectNode rhs = null; try { rhs = mapper.readValue(str, ObjectNode.class); } catch (IOException e) { LOGGER.error("Failed to read value", e); } if (!lhs.equals(new ObjectNodeComparator(), rhs)) { fail(String.format("Serialized object:\n%s\ndoes not equal to expected serialized string:\n%s", lhs, rhs)); } } static final class ObjectNodeComparator implements Comparator<JsonNode> { @Override public int compare(JsonNode o1, JsonNode o2) { if (o1.equals(o2)) { return 0; } if ((o1 instanceof NumericNode) && (o2 instanceof NumericNode)) { double d1 = ((NumericNode) o1).asDouble(); double d2 = ((NumericNode) o2).asDouble(); return Double.compare(d1, d2); } int comp = o1.asText().compareTo(o2.asText()); if (comp == 0) { return Integer.compare(o1.hashCode(), o2.hashCode()); } return comp; } } }