package com.tngtech.archunit.integration.junit;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.tngtech.archunit.junit.ExpectedViolation.ExpectedAccess;
import com.tngtech.archunit.junit.MessageAssertionChain;
class SliceDependencyErrorMatcher implements MessageAssertionChain.Link {
private String dependencyDescription;
private final Set<ExpectedAccess> expectedAccesses = new HashSet<>();
static SliceDependencyErrorMatcher sliceDependency() {
return new SliceDependencyErrorMatcher();
}
private SliceDependencyErrorMatcher() {
}
public SliceDependencyErrorMatcher described(String description) {
dependencyDescription = description;
return this;
}
public SliceDependencyErrorMatcher byAccess(ExpectedAccess expectedAccess) {
expectedAccesses.add(expectedAccess);
return this;
}
@Override
public Result filterMatching(List<String> lines) {
List<String> mismatches = new ArrayList<>();
List<String> remainingLines = new ArrayList<>(lines);
boolean matches = remainingLines.remove(dependencyDescription + ":");
if (!matches) {
mismatches.add("Description " + dependencyDescription + " was missing");
}
for (ExpectedAccess expectedAccess : expectedAccesses) {
if (!remainingLines.remove(expectedAccess.toString())) {
mismatches.add("Expected Access " + expectedAccess.toString() + " was missing");
matches = false;
}
}
if (!matches) {
return new Result(false, lines, Joiner.on(System.lineSeparator()).join(mismatches));
}
return new Result(true, remainingLines);
}
@Override
public String getDescription() {
return Joiner.on(System.lineSeparator()).join(ImmutableList.builder()
.add("Description: " + dependencyDescription)
.add("And all Accesses:")
.addAll(expectedAccesses)
.build());
}
}