package com.codecrate.testdox;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Locale;
import org.apache.maven.doxia.sink.Sink;
import org.apache.maven.doxia.siterenderer.Renderer;
import org.apache.maven.project.MavenProject;
import org.apache.maven.reporting.AbstractMavenReport;
import org.apache.maven.reporting.MavenReportException;
import com.thoughtworks.qdox.JavaDocBuilder;
import com.thoughtworks.qdox.model.JavaClass;
import com.thoughtworks.qdox.model.JavaMethod;
import com.thoughtworks.qdox.model.JavaSource;
/**
* Creates an "human readable" html report of unit test cases.
* To enable this report, the following configuration should be added to the pom.xml
* <pre>
* <reporting>
* <plugins>
* <plugin>
* <groupId>com.codecrate.maven.plugins</groupId>
* <artifactId>testdox-maven-plugin</artifactId>
* </plugin>
* </plugins>
* </reporting>
* </pre>
*
* @goal report
* @phase site
*/
public class TestDoxReportMojo extends AbstractMavenReport {
/**
* The Maven project.
*
* @parameter expression="${project}"
* @required
* @readonly
*/
private MavenProject mavenProject;
/**
* Directory where reports will go.
*
* @parameter expression="${project.reporting.outputDirectory}"
* @required
* @readonly
*/
private String outputDirectory;
/**
* @parameter expression="${component.org.apache.maven.doxia.siterenderer.Renderer}"
* @required
* @readonly
*/
private Renderer siteRenderer;
private TestDoxFormatter formatter = new TestDoxFormatter();
protected void executeReport(Locale locale) throws MavenReportException {
Sink sink = getSink();
sink.head();
sink.title();
sink.text("TestDox Report");
sink.title_();
sink.head_();
sink.body();
getLog().debug("testdox report output is set to: " + getOutputDirectory());
String testSourceDirectory = mavenProject.getBuild().getTestSourceDirectory();
getLog().info("Processing test classes from: " + testSourceDirectory);
JavaDocBuilder builder = new JavaDocBuilder();
builder.addSourceTree(new File(testSourceDirectory));
JavaSource[] sources = builder.getSources();
for (int i = 0; i < sources.length; i++) {
JavaSource source = sources[i];
for (Iterator iter = getTestClasses(source).iterator(); iter.hasNext();) {
JavaClass clazz = (JavaClass) iter.next();
getLog().info("Processing test class: " + clazz.getName());
sink.section1();
sink.sectionTitle1();
sink.text(formatter.prettifyTestClassName(clazz.getName()));
sink.sectionTitle1_();
sink.section1_();
sink.list();
for (Iterator iterator = getTestMethods(clazz).iterator(); iterator.hasNext();) {
JavaMethod method = (JavaMethod) iterator.next();
sink.listItem();
sink.text(formatter.prettifyTestMethodName(method.getName()));
sink.listItem_();
}
sink.list_();
}
}
sink.body_();
sink.flush();
sink.close();
}
private Collection getTestMethods(JavaClass aClass) {
Collection results = new ArrayList();
JavaMethod[] methods = aClass.getMethods();
for (int k = 0; k < methods.length; k++) {
JavaMethod method = methods[k];
if (formatter.isATestMethod(method)) {
results.add(method);
}
}
return results;
}
private Collection getTestClasses(JavaSource source) {
Collection results = new ArrayList();
JavaClass[] classes = source.getClasses();
for (int j = 0; j < classes.length; j++) {
JavaClass clazz = classes[j];
if (formatter.isTestClass(clazz)) {
results.add(clazz);
}
}
return results;
}
public String getDescription(Locale locale) {
return "TestDox Report Description";
}
public String getName(Locale locale) {
return "TestDox Report";
}
protected String getOutputDirectory() {
return outputDirectory;
}
protected MavenProject getProject() {
return mavenProject;
}
protected Renderer getSiteRenderer() {
return siteRenderer;
}
public String getOutputName() {
return "testdox";
}
}