package org.xpect.expectation.impl; import java.util.Collection; import java.util.List; import org.eclipse.xtext.util.Pair; import org.junit.Assert; import org.junit.ComparisonFailure; import org.xpect.XpectArgument; import org.xpect.XpectImport; import org.xpect.expectation.ILinesExpectation; import org.xpect.expectation.LinesExpectation; import org.xpect.expectation.impl.ActualCollection.ActualItem; import org.xpect.expectation.impl.ExpectationCollection.ExpectationItem; import org.xpect.setup.XpectSetupFactory; import org.xpect.state.Creates; import org.xpect.text.Text; import com.google.common.base.Joiner; import com.google.common.collect.Lists; @XpectSetupFactory @XpectImport(ExpectationRegionProvider.class) public class LinesExpectationImpl extends AbstractExpectation implements ILinesExpectation { private final LinesExpectation annotation; public LinesExpectationImpl(XpectArgument argument, TargetSyntaxSupport targetSyntax) { super(argument, targetSyntax); this.annotation = argument.getAnnotationOrDefault(LinesExpectation.class); } public void assertEquals(Iterable<?> actual) { assertEquals("", actual); } public void assertEquals(String message, Iterable<?> actual) { Assert.assertNotNull(actual); ExpectationCollection exp = new ExpectationCollection(); exp.setCaseSensitive(annotation.caseSensitive()); exp.setOrdered(annotation.ordered()); exp.setQuoted(annotation.quoted()); exp.setSeparator('\n'); exp.setWhitespaceSensitive(annotation.whitespaceSensitive()); exp.init(getExpectation()); ActualCollection act = new ActualCollection(); act.setTargetLiteralSupport(getTargetSyntaxLiteral()); act.setCaseSensitive(annotation.caseSensitive()); act.setOrdered(annotation.ordered()); act.setQuoted(annotation.quoted()); act.setSeparator('\n'); act.setWhitespaceSensitive(annotation.whitespaceSensitive()); act.init(actual, annotation.itemFormatter()); if (!exp.matches(act)) { List<String> expString = Lists.newArrayList(); List<String> actString = Lists.newArrayList(); for (Pair<Collection<ExpectationItem>, ActualItem> pair : exp.map(act)) { if (pair.getFirst() != null && !pair.getFirst().isEmpty()) { if (pair.getSecond() != null) expString.add(pair.getSecond().getEscaped()); else expString.add(pair.getFirst().iterator().next().getEscaped()); } if (pair.getSecond() != null) actString.add(pair.getSecond().getEscaped()); } String nl = new Text(getRegion().getDocument()).getNL(); String expDoc = replaceInDocument(Joiner.on(nl).join(expString)); String actDoc = replaceInDocument(Joiner.on(nl).join(actString)); throw new ComparisonFailure(message, expDoc, actDoc); } } @Creates public ILinesExpectation create() { return this; } public LinesExpectation getAnnotation() { return annotation; } }