package japicmp.util;
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import japicmp.cmp.JApiCmpArchive;
import japicmp.cmp.JarArchiveComparator;
import japicmp.cmp.JarArchiveComparatorOptions;
import japicmp.config.Options;
import japicmp.model.*;
import japicmp.output.xml.XmlOutputGenerator;
import japicmp.output.xml.XmlOutputGeneratorOptions;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import java.io.File;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
public class Helper {
public static JApiCmpArchive getArchive(String filename) {
File file = new File("target" + File.separator + filename);
return toJApiCmpArchive(file);
}
public static JApiCmpArchive toJApiCmpArchive(File file) {
JApiCmpArchive jApiCmpArchive = new JApiCmpArchive(file, "n.a.");
return jApiCmpArchive;
}
public static JApiClass getJApiClass(List<JApiClass> jApiClasses, String fqn) {
for (JApiClass jApiClass : jApiClasses) {
if (jApiClass.getFullyQualifiedName().equals(fqn)) {
return jApiClass;
}
}
throw new IllegalArgumentException("No class found with name " + fqn + ".");
}
public static JApiMethod getJApiMethod(List<JApiMethod> jApiMethods, String name) {
for (JApiMethod jApiMethod : jApiMethods) {
if (jApiMethod.getName().equals(name)) {
return jApiMethod;
}
}
throw new IllegalArgumentException("No method found with name " + name + ".");
}
public static JApiConstructor getJApiConstructor(List<JApiConstructor> constructors, List<String> parameterTypes) {
for (JApiConstructor constructor : constructors) {
List<JApiParameter> parameters = constructor.getParameters();
if (parameterTypes.size() == parameters.size()) {
boolean typeMismatch = false;
for (int i = 0; i < parameters.size(); i++) {
if (!parameters.get(i).getType().equals(parameterTypes.get(i))) {
typeMismatch = true;
break;
}
}
if (!typeMismatch) {
return constructor;
}
}
}
throw new IllegalArgumentException("No constructor found with parameters " + Joiner.on(",").join(parameterTypes) + ".");
}
public static Matcher<JApiClass> hasJApiMethodWithName(final String methodName) {
return new TypeSafeMatcher<JApiClass>() {
@Override
public void describeTo(Description description) {
description.appendText("JApiClass should have a method with name '").appendValue(methodName)
.appendText("'.");
}
@Override
protected boolean matchesSafely(JApiClass jApiClass) {
List<JApiMethod> jApiMethods = jApiClass.getMethods();
boolean found = false;
for (JApiMethod jApiMethod : jApiMethods) {
if (methodName.equals(jApiMethod.getName())) {
found = true;
break;
}
}
return found;
}
};
}
public static Matcher<JApiClass> hasNoJApiMethodWithName(final String methodName) {
return new TypeSafeMatcher<JApiClass>() {
@Override
public void describeTo(Description description) {
description.appendText("JApiClass should not have a method with name '").appendValue(methodName)
.appendText("'.");
}
@Override
protected boolean matchesSafely(JApiClass jApiClass) {
List<JApiMethod> jApiMethods = jApiClass.getMethods();
boolean found = false;
for (JApiMethod jApiMethod : jApiMethods) {
if (methodName.equals(jApiMethod.getName())) {
found = true;
break;
}
}
return !found;
}
};
}
public static Matcher<JApiClass> hasNoJApiFieldWithName(final String fieldName) {
return new TypeSafeMatcher<JApiClass>() {
@Override
public void describeTo(Description description) {
description.appendText("JApiClass should not have a field with name '").appendValue(fieldName)
.appendText("'.");
}
@Override
protected boolean matchesSafely(JApiClass jApiClass) {
boolean found = false;
List<JApiField> fields = jApiClass.getFields();
for (JApiField field : fields) {
if (field.getName().equals(fieldName)) {
found = true;
break;
}
}
return !found;
}
};
}
public static Matcher<JApiClass> hasJApiFieldWithName(final String fieldName) {
return new TypeSafeMatcher<JApiClass>() {
@Override
public void describeTo(Description description) {
description.appendText("JApiClass should not have a field with name '").appendValue(fieldName)
.appendText("'.");
}
@Override
protected boolean matchesSafely(JApiClass jApiClass) {
boolean found = false;
List<JApiField> fields = jApiClass.getFields();
for (JApiField field : fields) {
if (field.getName().equals(fieldName)) {
found = true;
break;
}
}
return found;
}
};
}
public static JApiField getJApiField(List<JApiField> jApiFields, String name) {
for (JApiField jApiField : jApiFields) {
if (jApiField.getName().equals(name)) {
return jApiField;
}
}
throw new IllegalArgumentException("No field found with name " + name + ".");
}
public static JApiImplementedInterface getJApiImplementedInterface(List<JApiImplementedInterface> jApiImplementedInterfaces, String name) {
for (JApiImplementedInterface jApiImplementedInterface : jApiImplementedInterfaces) {
if (jApiImplementedInterface.getFullyQualifiedName().equals(name)) {
return jApiImplementedInterface;
}
}
throw new IllegalArgumentException("No interface found with name " + name + ".");
}
public static JApiAnnotation getJApiAnnotation(List<JApiAnnotation> annotations, String name) {
for (JApiAnnotation annotation : annotations) {
if (annotation.getFullyQualifiedName().equals(name)) {
return annotation;
}
}
throw new IllegalArgumentException("No annotation found with name " + name + ".");
}
public static JApiAnnotationElement getJApiAnnotationElement(List<JApiAnnotationElement> annotationElements, String name) {
for (JApiAnnotationElement annotationElement : annotationElements) {
if (annotationElement.getName().equals(name)) {
return annotationElement;
}
}
throw new IllegalArgumentException("No annotation element found with name " + name + ".");
}
public static String replaceLastDotWith$(String str) {
int lastIndex = str.lastIndexOf('.');
if (lastIndex > -1) {
if (lastIndex == 0) {
if (str.length() > 1) {
str = "$" + str.substring(1);
} else {
str = "$";
}
} else {
if (str.length() > lastIndex + 1) {
str = str.substring(0, lastIndex) + "$" + str.substring(lastIndex + 1);
} else {
str = str.substring(0, lastIndex) + "$";
}
}
}
return str;
}
public static List<JApiClass> compareTestV1WithTestV2(AccessModifier accessModifier) {
JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
options.setAccessModifier(accessModifier);
JarArchiveComparator jarArchiveComparator = new JarArchiveComparator(options);
return jarArchiveComparator.compare(getArchive("japicmp-test-v1.jar"), getArchive("japicmp-test-v2.jar"));
}
public static void generateHtmlOutput(List<JApiClass> jApiClasses, String xmlOutputFile, String htmlOutputFile, boolean outputOnlyModifications, AccessModifier accessModifier) {
Options options = Options.newDefault();
options.setXmlOutputFile(Optional.of(xmlOutputFile));
options.setHtmlOutputFile(Optional.of(htmlOutputFile));
options.setOutputOnlyModifications(outputOnlyModifications);
options.setAccessModifier(Optional.of(accessModifier));
XmlOutputGeneratorOptions xmlOutputGeneratorOptions = new XmlOutputGeneratorOptions();
xmlOutputGeneratorOptions.setCreateSchemaFile(true);
XmlOutputGenerator generator = new XmlOutputGenerator(jApiClasses, options, xmlOutputGeneratorOptions);
generator.generate();
}
public interface SimpleExceptionVerifier {
void execute();
}
public static void assertThatExceptionIsThrown(SimpleExceptionVerifier verifier, Class<? extends Exception> exceptionClass) {
boolean exceptionThrown = false;
try {
verifier.execute();
} catch (Exception e) {
exceptionThrown = true;
assertThat(e.getClass().isAssignableFrom(exceptionClass), is(true));
}
assertThat(exceptionThrown, is(true));
}
}