/*
* JBoss, Home of Professional Open Source
* Copyright 2010-2016, Red Hat, Inc. and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.richfaces.tests.metamer.ftest.extension.attributes.coverage.result;
import static org.richfaces.tests.metamer.ftest.extension.attributes.coverage.collect.SimpleAttributesCoverageCollector.ATTRIBUTES;
import java.text.MessageFormat;
import java.util.EnumSet;
import org.apache.commons.lang.math.Fraction;
/**
* @author <a href="mailto:jstefek@redhat.com">Jiri Stefek</a>
*/
public class SimpleCoverageResult implements CoverageResult {
private static final String[] IGNORED_ATTS = { "binding", "id", "var", "value", };
private final Class<? extends Enum> componentEnumClass;
private final EnumSet<?> covered;
private final EnumSet<?> ignored;
private final EnumSet<?> notCovered;
private final EnumSet<?> whole;
@SuppressWarnings("unchecked")
public SimpleCoverageResult(Class<? extends Enum> componentEnumClass, EnumSet covered) {
this.componentEnumClass = componentEnumClass;
this.covered = covered;
this.whole = EnumSet.allOf(componentEnumClass);
ignored = getDefaultIgnoredValues(componentEnumClass);
ignored.removeAll(covered);
this.notCovered = getNotCovered(covered, this.ignored);
}
@Override
public String getComponentName() {
return getComponentNameFromEnumClass();
}
private String getComponentNameFromEnumClass() {
return componentEnumClass.getSimpleName().replace(ATTRIBUTES, "");
}
@Override
public EnumSet<?> getCovered() {
return covered;
}
@Override
public Fraction getCoveredFraction() {
return getFractionFromEnumSets(covered, whole);
}
private EnumSet getDefaultIgnoredValues(Class<? extends Enum> enumClass) {
EnumSet result = EnumSet.noneOf(enumClass);
for (String ignoredAtt : IGNORED_ATTS) {
try {
result.add(Enum.valueOf(enumClass, ignoredAtt));
} catch (IllegalArgumentException e) {
}
}
return result;
}
private Fraction getFractionFromEnumSets(EnumSet numerator, EnumSet denominator) {
return Fraction.getFraction(numerator.size(), denominator.size());
}
private String getFractionFromEnumSetsAsString(EnumSet numerator, EnumSet denominator) {
return MessageFormat.format("({0})", getFractionFromEnumSets(numerator, denominator).toString());
}
@Override
public EnumSet<?> getIgnored() {
return ignored;
}
@Override
public Fraction getIgnoredFraction() {
return getFractionFromEnumSets(ignored, whole);
}
private EnumSet getNotCovered(EnumSet covered, EnumSet ignored) {
EnumSet notCovered = EnumSet.complementOf(covered);
notCovered.removeAll(ignored);
return notCovered;
}
@Override
public EnumSet<?> getNotCovered() {
return notCovered;
}
@Override
public Fraction getNotCoveredFraction() {
return getFractionFromEnumSets(notCovered, whole);
}
@Override
public String getReport() {
return toString();
}
@Override
public String toString() {
return MessageFormat.format("{0} attributes:\n * not covered: {1} {2}\n * ignored: {3} {4}\n * covered: {5} {6}",
getComponentNameFromEnumClass(), notCovered, getFractionFromEnumSetsAsString(notCovered, whole), ignored, getFractionFromEnumSetsAsString(ignored, whole), covered, getFractionFromEnumSetsAsString(covered, whole));
}
}