package com.rcpcompany.test.utils.xml; import java.util.ArrayList; import java.util.List; import org.hamcrest.Description; import org.hamcrest.Factory; import org.hamcrest.Matcher; import org.hamcrest.TypeSafeMatcher; /** * Matcher that tests whether the string under test is similar to the specified XML. * * @author Tonny Madsen, tonny.madsen@gmail.com */ public class XMLSimilar extends TypeSafeMatcher<String> { private final String myXML; /** * @param xml * the XML to test again */ public XMLSimilar(String xml) { myXML = xml; } @Override public boolean matchesSafely(String item) { final XMLDiff diff = new XMLDiff(); final List<String> diffs = new ArrayList<String>(); try { return !diff.diff(myXML, item, diffs); } catch (final Exception ex) { return false; } } @Override public void describeTo(Description description) { description.appendText("an XML document similar to ").appendText(myXML); } @Override protected void describeMismatchSafely(String item, Description mismatchDescription) { final XMLDiff diff = new XMLDiff(); final List<String> diffs = new ArrayList<String>(); try { if (!diff.diff(myXML, item, diffs)) return; } catch (final Exception ex) { mismatchDescription.appendText("with exception " + ex); return; } mismatchDescription.appendText("has differences:"); for (final String d : diffs) { mismatchDescription.appendText("\n * " + d); } } @Factory public static Matcher<String> hasSimilarXML(String xml) { return new XMLSimilar(xml); } }