FieldDescriptionMetaData.java
/**
* Powerunit - A JDK1.8 test framework
* Copyright (C) 2014 Mathieu Boretti.
*
* This file is part of Powerunit
*
* Powerunit is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Powerunit is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Powerunit. If not, see <http://www.gnu.org/licenses/>.
*/
package ch.powerunit.extensions.matchers.provideprocessor.fields;
import static ch.powerunit.extensions.matchers.common.CommonUtils.toJavaSyntax;
import static java.lang.String.format;
import static java.util.stream.Collectors.joining;
import java.util.Optional;
import javax.lang.model.element.Element;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeMirror;
import ch.powerunit.extensions.matchers.provideprocessor.Matchable;
import ch.powerunit.extensions.matchers.provideprocessor.ProvidesMatchersAnnotatedElementData;
import ch.powerunit.extensions.matchers.provideprocessor.helper.FeatureMatcher;
public abstract class FieldDescriptionMetaData extends AbstractFieldDescriptionContainerMetaData {
public static final String SEE_TEXT_FOR_IS_MATCHER = "org.hamcrest.Matchers#is(java.lang.Object)";
public static final String SEE_TEXT_FOR_HAMCREST_MATCHER = "org.hamcrest.Matchers The main class from hamcrest that provides default matchers.";
public static final String MATCHERS = "org.hamcrest.Matchers";
protected final String generic;
protected final String defaultReturnMethod;
protected final FieldDescriptionMirror mirror;
public static final String computeGenericInformation(TypeMirror fieldTypeMirror) {
if (fieldTypeMirror instanceof DeclaredType) {
DeclaredType dt = ((DeclaredType) fieldTypeMirror);
return dt.getTypeArguments().stream().map(Object::toString).collect(joining(","));
}
return "";
}
public FieldDescriptionMetaData(ProvidesMatchersAnnotatedElementData containingElementMirror,
FieldDescriptionMirror mirror) {
super(containingElementMirror);
this.mirror = mirror;
TypeMirror fieldTypeMirror = mirror.getFieldTypeMirror();
this.defaultReturnMethod = containingElementMirror.getDefaultReturnMethod();
this.generic = computeGenericInformation(fieldTypeMirror);
}
public String getMatcherForField() {
return new FeatureMatcher(mirror.getMethodFieldName(), containingElementMirror.getFullGeneric(),
getFullyQualifiedNameEnclosingClassOfField(), containingElementMirror.getGeneric(), getFieldType(),
getFieldName(), "actual." + getFieldAccessor()).toString();
}
public String getFieldCopy(String lhs, String rhs, String ignore) {
return getTargetAsMatchable().filter(a -> mirror.getFieldTypeAsTypeElement().getTypeParameters().isEmpty())
.filter(Matchable::hasWithSameValue)
.map(p -> format(
"%1$s.%6$s(%2$s.%3$s == null ? org.hamcrest.Matchers.nullValue() : %4$s(%2$s.%3$s%5$s));", lhs,
rhs, getFieldAccessor(), p.getWithSameValue(false), p.supportIgnore() ? ignore : "",
getFieldName()))
.orElseGet(() -> format(
"%1$s.%4$s((org.hamcrest.Matcher)org.hamcrest.Matchers.is((java.lang.Object)%2$s.%3$s));", lhs,
rhs, getFieldAccessor(), getFieldName()));
}
public String asMatchesSafely() {
return format(
"if(!%1$s.matches(actual)) {\n mismatchDescription.appendText(\"[\"); %1$s.describeMismatch(actual,mismatchDescription); mismatchDescription.appendText(\"]\\n\");\n result=false;\n}",
getFieldName());
}
public String asDescribeTo() {
return "description.appendText(\"[\").appendDescriptionOf(" + getFieldName() + ").appendText(\"]\\n\");";
}
public String asMatcherField() {
return format("private %1$sMatcher %2$s = new %1$sMatcher(%3$s.anything(%4$s));", mirror.getMethodFieldName(),
getFieldName(), MATCHERS, "");
}
public String getFullyQualifiedNameEnclosingClassOfField() {
return containingElementMirror.getFullyQualifiedNameOfClassAnnotatedWithProvideMatcher();
}
public String getDefaultReturnMethod() {
return defaultReturnMethod;
}
public String getFieldAccessor() {
return mirror.getFieldAccessor();
}
public String getFieldName() {
return mirror.getFieldName();
}
public String getFieldType() {
return mirror.getFieldType();
}
public Element getFieldElement() {
return mirror.getFieldElement();
}
public FieldDescriptionMirror getMirror() {
return mirror;
}
public Optional<Matchable> getTargetAsMatchable() {
return mirror.getMatchable(containingElementMirror.getRoundMirror());
}
public String getGeneric() {
return generic;
}
public String generateMetadata(String className) {
return "new " + className + "(" + toJavaSyntax(getFieldName()) + "," + toJavaSyntax(getFieldType()) + ","
+ toJavaSyntax(getFieldAccessor()) + "," + toJavaSyntax(getClass().getSimpleName()) + ","
+ Boolean.toString(this instanceof IgnoreFieldDescription) + ")";
}
}