/**
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
* Copyright 2012-2015 the original author or authors.
*/
package org.assertj.maven.generator;
import static com.google.common.collect.Maps.newTreeMap;
import static com.google.common.collect.Sets.newTreeSet;
import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
import static org.apache.commons.lang3.ArrayUtils.isNotEmpty;
import static org.apache.commons.lang3.StringUtils.remove;
import static org.apache.commons.lang3.exception.ExceptionUtils.getStackTrace;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.assertj.assertions.generator.AssertionsEntryPointType;
public class AssertionsGeneratorReport {
private static final String INDENT = "- ";
private static final String SECTION_START = "--- ";
private static final String SECTION_END = " ---\n";
private String directoryPathWhereAssertionFilesAreGenerated;
private Set<String> generatedCustomAssertionFileNames;
private Map<AssertionsEntryPointType, File> assertionsEntryPointFilesByType;
private String[] inputPackages;
private String[] inputClasses;
private Exception exception;
private Collection<Class<?>> excludedClassesFromAssertionGeneration;
private Set<String> inputClassesNotFound;
private List<String> userTemplates;
public AssertionsGeneratorReport() {
assertionsEntryPointFilesByType = newTreeMap();
generatedCustomAssertionFileNames = newTreeSet();
inputClassesNotFound = newTreeSet();
directoryPathWhereAssertionFilesAreGenerated = "no directory set";
userTemplates = new ArrayList<>();
}
public void setDirectoryPathWhereAssertionFilesAreGenerated(String directory) {
this.directoryPathWhereAssertionFilesAreGenerated = directory;
}
public void addGeneratedAssertionFile(File generatedCustomAssertionFile) throws IOException {
generatedCustomAssertionFileNames.add(generatedCustomAssertionFile.getCanonicalPath());
}
public String getReportContent() {
StringBuilder reportBuilder = new StringBuilder(System.lineSeparator());
reportBuilder.append(System.lineSeparator());
reportBuilder.append("====================================\n");
reportBuilder.append("AssertJ assertions generation report\n");
reportBuilder.append("====================================\n");
buildGeneratorParametersReport(reportBuilder);
reportBuilder.append(System.lineSeparator());
reportBuilder.append(SECTION_START).append("Generator results").append(SECTION_END);
if (generationError()) {
buildGeneratorReportError(reportBuilder);
} else if (nothingGenerated()) {
buildGeneratorReportWhenNothingWasGenerated(reportBuilder);
} else {
buildGeneratorReportSuccess(reportBuilder);
}
return reportBuilder.toString();
}
private void buildGeneratorReportSuccess(StringBuilder reportBuilder) {
reportBuilder.append(System.lineSeparator());
reportBuilder.append("Directory where custom assertions files have been generated:\n");
reportBuilder.append(INDENT).append(directoryPathWhereAssertionFilesAreGenerated).append(System.lineSeparator());
reportBuilder.append(System.lineSeparator());
reportBuilder.append("Custom assertions files generated:\n");
for (String fileName : generatedCustomAssertionFileNames) {
reportBuilder.append(INDENT).append(fileName).append(System.lineSeparator());
}
if (!inputClassesNotFound.isEmpty()) {
reportBuilder.append(System.lineSeparator());
reportBuilder.append("No custom assertions files generated for the following input classes as they were not found:\n");
for (String inputClassNotFound : inputClassesNotFound) {
reportBuilder.append(INDENT).append(inputClassNotFound).append(System.lineSeparator());
}
}
reportEntryPointClassesGeneration(reportBuilder);
}
private void reportEntryPointClassesGeneration(StringBuilder reportBuilder) {
for (AssertionsEntryPointType type : assertionsEntryPointFilesByType.keySet()) {
if (assertionsEntryPointFilesByType.get(type) != null) {
String entryPointClassName = remove(type.getFileName(), ".java");
reportBuilder.append(System.lineSeparator())
.append(entryPointClassName).append(" entry point class has been generated in file:\n")
.append(INDENT).append(assertionsEntryPointFilesByType.get(type).getAbsolutePath())
.append(System.lineSeparator());
}
}
}
private void buildGeneratorReportWhenNothingWasGenerated(StringBuilder reportBuilder) {
reportBuilder.append(System.lineSeparator());
reportBuilder.append("No assertions generated as no classes have been found from given classes/packages.\n");
if (isNotEmpty(inputClasses)) {
reportBuilder.append(INDENT).append("Given classes : ").append(Arrays.toString(inputClasses));
reportBuilder.append(System.lineSeparator());
}
if (isNotEmpty(inputPackages)) {
reportBuilder.append(INDENT).append("Given packages : ").append(Arrays.toString(inputPackages));
reportBuilder.append(System.lineSeparator());
}
if (isNotEmpty(excludedClassesFromAssertionGeneration)) {
reportBuilder.append(INDENT).append("Excluded classes : ").append(excludedClassesFromAssertionGeneration);
}
}
private void buildGeneratorReportError(StringBuilder reportBuilder) {
reportBuilder.append(System.lineSeparator());
reportBuilder.append("Assertions failed with error : ").append(exception.getMessage());
reportBuilder.append(System.lineSeparator());
if (isNotEmpty(inputClasses)) {
reportBuilder.append(INDENT).append("Given classes were : ").append(Arrays.toString(inputClasses));
reportBuilder.append(System.lineSeparator());
}
if (isNotEmpty(inputPackages)) {
reportBuilder.append(INDENT).append("Given packages were : ").append(Arrays.toString(inputPackages));
reportBuilder.append(System.lineSeparator());
}
reportBuilder.append(System.lineSeparator());
reportBuilder.append("Full error stack : ").append(getStackTrace(exception));
}
private void buildGeneratorParametersReport(StringBuilder reportBuilder) {
reportBuilder.append(System.lineSeparator());
reportBuilder.append(SECTION_START).append("Generator input parameters").append(SECTION_END)
.append(System.lineSeparator());
if (isNotEmpty(userTemplates)) {
reportBuilder.append("The following templates will replace the ones provided by AssertJ when generating AssertJ assertions :\n");
for (String inputPackage : userTemplates) {
reportBuilder.append(INDENT).append(inputPackage).append(System.lineSeparator());
}
reportBuilder.append(System.lineSeparator());
}
if (isNotEmpty(inputPackages)) {
reportBuilder.append("Generating AssertJ assertions for classes in following packages and subpackages:\n");
for (String inputPackage : inputPackages) {
reportBuilder.append(INDENT).append(inputPackage).append(System.lineSeparator());
}
}
if (isNotEmpty(inputClasses)) {
if (isNotEmpty(inputPackages)) {
reportBuilder.append(System.lineSeparator());
}
reportBuilder.append("Generating AssertJ assertions for classes:\n");
for (String inputClass : inputClasses) {
reportBuilder.append(INDENT).append(inputClass).append(System.lineSeparator());
}
}
if (isNotEmpty(excludedClassesFromAssertionGeneration)) {
reportBuilder.append(System.lineSeparator());
reportBuilder.append("Input classes excluded from assertions generation:\n");
for (Class<?> excludedClass : excludedClassesFromAssertionGeneration) {
reportBuilder.append(INDENT).append(excludedClass.getName()).append(System.lineSeparator());
}
}
}
private boolean generationError() {
return exception != null;
}
private boolean nothingGenerated() {
return generatedCustomAssertionFileNames.isEmpty();
}
public void reportEntryPointGeneration(AssertionsEntryPointType assertionsEntryPointType,
File assertionsEntryPointFile) {
this.assertionsEntryPointFilesByType.put(assertionsEntryPointType, assertionsEntryPointFile);
}
public void setInputPackages(String[] packages) {
this.inputPackages = packages;
}
public void setInputClasses(String[] classes) {
this.inputClasses = classes;
}
public void setException(Exception exception) {
this.exception = exception;
}
public Exception getReportedException() {
return exception;
}
public void setExcludedClassesFromAssertionGeneration(Collection<Class<?>> excludedClassSet) {
this.excludedClassesFromAssertionGeneration = excludedClassSet;
}
public Set<String> getInputClassesNotFound() {
return inputClassesNotFound;
}
public void reportInputClassesNotFound(Set<Class<?>> classes, String[] inputClassNames) {
Set<String> classesFound = newTreeSet();
for (Class<?> clazz : classes) {
classesFound.add(clazz.getName());
}
for (String inputClass : inputClassNames) {
if (!classesFound.contains(inputClass)) {
inputClassesNotFound.add(inputClass);
}
}
}
public void registerUserTemplate(String userTemplateDescription) {
userTemplates.add(userTemplateDescription);
}
public List<String> getUserTemplates() {
return userTemplates;
}
}