package hudson.plugins.testabilityexplorer.report; import hudson.plugins.testabilityexplorer.PluginBaseTest; import hudson.plugins.testabilityexplorer.PluginImpl; import hudson.plugins.testabilityexplorer.report.charts.*; import hudson.plugins.testabilityexplorer.report.costs.CostSummary; import hudson.plugins.testabilityexplorer.report.costs.Statistic; import hudson.plugins.testabilityexplorer.report.health.ReportBuilder; import hudson.plugins.testabilityexplorer.report.health.TemporaryHealthCalculator; import hudson.plugins.testabilityexplorer.report.health.TestabilityReportBuilder; import hudson.model.AbstractBuild; import org.testng.annotations.Test; import org.jfree.data.category.CategoryDataset; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.plot.CategoryPlot; import static org.testng.Assert.*; import java.util.*; /** * Tests the TestabilityChartBuilder. */ @Test public class AbstractBuildReportChartingTest extends PluginBaseTest { private static final int MAX_COST_IN_TEST = 999; public void testOverallTrendChart() { List<BuildAndResults> buildsAndResults = createBuildAndResults(); AbstractBuildReport abstractBuildReport = createAbstractBuildReport(); String displayName = abstractBuildReport.getDisplayName(); assertEquals(displayName, PluginImpl.DISPLAY_NAME); String graphName = abstractBuildReport.getGraphName(); assertEquals(graphName, PluginImpl.GRAPH_NAME); String iconFileName = abstractBuildReport.getIconFileName(); assertEquals(iconFileName, PluginImpl.ICON_FILE_NAME); String urlName = abstractBuildReport.getUrlName(); assertEquals(urlName, PluginImpl.URL); RangedTrend classesTrend = new RangedOverallTrend(buildsAndResults); JFreeChart chartClasses = abstractBuildReport.createChart(classesTrend); assertNotNull(chartClasses); CategoryDataset overallCategoryDataset = classesTrend.getCategoryDataset(); assertNotNull(overallCategoryDataset); assertEquals(overallCategoryDataset.getRowCount(), 1); assertEquals(overallCategoryDataset.getColumnCount(), 10); JFreeChart chartOverall = abstractBuildReport.createChart(classesTrend); assertNotNull(chartOverall); } public void testGraphLineConsistency() { LinkedList<BuildAndResults> buildsAndResults = new LinkedList(createBuildAndResults()); buildsAndResults.add(0, new BuildAndResults(createBuild(0, GregorianCalendar.getInstance()), null)); RangedTrend classesTrend = new RangedClassesTrend(buildsAndResults); CategoryDataset categoryDataset = classesTrend.getCategoryDataset(); assertEquals(categoryDataset.getRowCount(), 3); for (int i = 0; i < 3; i++) { Number value4 = categoryDataset.getValue(i, 5); Number value5 = categoryDataset.getValue(i, 6); Number value6 = categoryDataset.getValue(i, 7); assertEquals(value4, value5); assertFalse(value5.intValue() == value6.intValue()); } } public void testClassesTrendChart() { List<BuildAndResults> buildsAndResults = createBuildAndResults(); AbstractBuildReport abstractBuildReport = createAbstractBuildReport(); RangedTrend classesTrend = new RangedClassesTrend(buildsAndResults); int maxCost = classesTrend.getUpperBoundRangeAxis(); assertTrue(maxCost <= MAX_COST_IN_TEST + RangedTrend.RANGE_AXIS_SPACE); JFreeChart chartClasses = abstractBuildReport.createChart(classesTrend); assertNotNull(chartClasses); CategoryDataset categoryDataset = classesTrend.getCategoryDataset(); assertNotNull(categoryDataset); assertEquals(categoryDataset.getRowCount(), 3); assertEquals(categoryDataset.getColumnCount(), 10); JFreeChart chartOverall = abstractBuildReport.createChart(classesTrend); assertNotNull(chartOverall); CategoryPlot categoryPlot = chartOverall.getCategoryPlot(); assertNotNull(categoryPlot); ValueAxis valueAxis = categoryPlot.getRangeAxis(); assertNotNull(valueAxis); assertTrue(valueAxis.getUpperBound() == maxCost); } @Test(expectedExceptions = IllegalArgumentException.class) public void testInvalid() { AbstractBuildReport abstractBuildReport = createAbstractBuildReport(); abstractBuildReport.createChart(null); } public void testRetrieveExistingBuildsAndResults() { ChartBuilder chartBuilder = new TestabilityChartBuilder(); ReportBuilder reportBuilder = new TestabilityReportBuilder(chartBuilder, new TemporaryHealthCalculator()); Collection<Statistic> results = createStatistics(); AbstractBuild<?,?> build = createBuild(1, GregorianCalendar.getInstance()); AbstractBuildReport abstractBuildReport = new BuildIndividualReport(results, reportBuilder, new CostDetailBuilder()) { @Override AbstractBuild<?, ?> getPreviousBuild(AbstractBuild<?, ?> build) { return null; } }; List items = abstractBuildReport.retrieveExistingBuildsAndResults(build); assertEquals(items.size(), 1); } public void testCostTemplates() { CostSummary costSummary = new CostSummary(1, 2, 3, 20); Statistic statistic = new ArrayList<Statistic>(createStatistics(false, costSummary)).get(0); CostTemplate excellent = RangedClassesTrend.EXCELLENT_COST_TEMPLATE; assertEquals(excellent.getCost(statistic), 1); CostTemplate good = RangedClassesTrend.GOOD_COST_TEMPLATE; assertEquals(good.getCost(statistic), 2); CostTemplate poor = RangedClassesTrend.POOR_COST_TEMPLATE; assertEquals(poor.getCost(statistic), 3); CostTemplate all = RangedOverallTrend.TOTAL_COST_TEMPLATE; assertEquals(all.getCost(statistic), 20); } private AbstractBuildReport createAbstractBuildReport() { ReportBuilder reportBuilder = new TestabilityReportBuilder(null, new TemporaryHealthCalculator()); Collection<Statistic> results = createStatistics(); return new BuildIndividualReport(results, reportBuilder, new CostDetailBuilder()); } private List<BuildAndResults> createBuildAndResults() { Random randomGenerator = new Random(); List<BuildAndResults> buildsAndResults = new ArrayList<BuildAndResults>(); for (int i = 0; i < 10; i++) { AbstractBuild<?,?> build = createBuild(i + 1, GregorianCalendar.getInstance()); int excellent = randomGenerator.nextInt(MAX_COST_IN_TEST); int good = randomGenerator.nextInt(MAX_COST_IN_TEST); int needWork = randomGenerator.nextInt(MAX_COST_IN_TEST); int total = randomGenerator.nextInt(MAX_COST_IN_TEST); CostSummary costSummary = new CostSummary(excellent, good, needWork, total); Collection<Statistic> stats = createStatistics(false, costSummary); // add some invalid build if (i == 5) { buildsAndResults.add(new BuildAndResults(build, null)); } else { buildsAndResults.add(new BuildAndResults(build, stats)); } } return buildsAndResults; } }