/** * Copyright (C) 2010-2017 Gordon Fraser, Andrea Arcuri and EvoSuite * contributors * * This file is part of EvoSuite. * * EvoSuite 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 3.0 of the License, or * (at your option) any later version. * * EvoSuite 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 Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with EvoSuite. If not, see <http://www.gnu.org/licenses/>. */ /** * */ package org.evosuite.junit; import java.io.File; import java.util.List; import java.util.Set; import org.apache.commons.lang3.StringEscapeUtils; import org.evosuite.Properties; import org.evosuite.ga.Chromosome; import org.evosuite.ga.metaheuristics.GeneticAlgorithm; import org.evosuite.utils.LoggingUtils; import org.evosuite.utils.ReportGenerator; import org.evosuite.utils.Utils; /** * <p> * JUnitReportGenerator class. * </p> * * @author Gordon Fraser */ public class JUnitReportGenerator extends ReportGenerator { private static final long serialVersionUID = -7460948425298766706L; private final List<Class<?>> classes; /** * <p> * Constructor for JUnitReportGenerator. * </p> * * @param coveredGoals * a int. * @param totalGoals * a int. * @param coverage * a {@link java.util.Set} object. * @param classes * a {@link java.util.List} object. * @param startTime * a long. */ public JUnitReportGenerator(int coveredGoals, int totalGoals, Set<Integer> coverage, List<Class<?>> classes, long startTime, int tests) { this.classes = classes; StatisticEntry entry = new StatisticEntry(); entry.total_goals = totalGoals; entry.covered_goals = coveredGoals; entry.coverage = coverage; entry.className = Properties.TARGET_CLASS; entry.id = getNumber(entry.className) + 1; entry.end_time = System.currentTimeMillis(); entry.minimized_time = entry.end_time; entry.start_time = startTime; entry.size_final = tests; statistics.add(entry); } /** * {@inheritDoc} * * Write a file for a particular run */ @Override protected String writeRunPage(StatisticEntry run) { StringBuffer sb = new StringBuffer(); writeHTMLHeader(sb, run.className); sb.append("<div id=\"header\"><div id=\"logo\">"); sb.append("<h2>"); sb.append(run.className); sb.append(": "); sb.append(String.format("%.2f", 100.0 * run.covered_goals / run.total_goals)); sb.append("%"); sb.append("</h2></div></div>\n"); sb.append("<p><a href=\"../report-generation.html\">Overview</a></p>\n"); // writeResultTable(sb, run); // writeMutationTable(sb); sb.append("<div id=\"page\"><div id=\"page-bgtop\"><div id=\"page-bgbtm\"><div id=\"content\">"); sb.append("<div id=\"post\">"); // Resulting test case sb.append("<h2 class=title id=tests>JUnit Test suites</h2>\n<div class=tests>\n"); for (Class<?> clazz : classes) { // Source code try { Iterable<String> source = html_analyzer.getClassContent(clazz.getName()); sb.append("<h3 class=title id=source>" + clazz.getName() + "</h3>\n"); sb.append("<div class=source><p>"); sb.append("<pre class=\"prettyprint\" style=\"border: 1px solid #888;padding: 2px\">"); int linecount = 1; for (String line : source) { sb.append(String.format("<span class=\"nocode\"><a name=\"%d\">%3d: </a></span>", linecount, linecount)); sb.append(StringEscapeUtils.escapeHtml4(line)); sb.append("\n"); linecount++; } sb.append("</pre>\n"); sb.append("</p></div>\n"); } catch (Exception e) { // Don't display source if there is an error LoggingUtils.getEvoLogger().info("Cannot find class: " + clazz.getName()); } //sb.append("</div>"); } sb.append("</div></div>"); sb.append("<div id=\"post\">"); // Source code try { Iterable<String> source = html_analyzer.getClassContent(run.className); sb.append("<h2 class=title id=source>Source Code</h2>\n"); sb.append("<div class=source><p>"); sb.append("<pre class=\"prettyprint\" style=\"border: 1px solid #888;padding: 2px\">"); int linecount = 1; for (String line : source) { sb.append(String.format("<span class=\"nocode\"><a name=\"%d\">%3d: </a></span>", linecount, linecount)); if (run.coverage.contains(linecount)) { sb.append("<span style=\"background-color: #ffffcc\">"); sb.append(StringEscapeUtils.escapeHtml4(line)); sb.append("</span>"); } else sb.append(StringEscapeUtils.escapeHtml4(line)); sb.append("\n"); linecount++; } sb.append("</pre>\n"); sb.append("</p></div>\n"); } catch (Exception e) { // Don't display source if there is an error } sb.append("</div>"); writeHTMLFooter(sb); String filename = "report-" + run.className + "-" + run.id + ".html"; File file = new File(getReportDir().getAbsolutePath() + "/html/" + filename); Utils.writeFile(sb.toString(), file); // return file.getAbsolutePath(); return filename; } /* (non-Javadoc) * @see org.evosuite.ga.SearchListener#searchFinished(org.evosuite.ga.GeneticAlgorithm) */ /** {@inheritDoc} */ @Override public void searchFinished(GeneticAlgorithm<?> algorithm) { // TODO Auto-generated method stub } /* (non-Javadoc) * @see org.evosuite.utils.ReportGenerator#minimized(org.evosuite.ga.Chromosome) */ /** {@inheritDoc} */ @Override public void minimized(Chromosome result) { // TODO Auto-generated method stub } /** * <p> * main * </p> * * @param args * an array of {@link java.lang.String} objects. */ public static void main(String[] args) { // TODO Auto-generated method stub } }