/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.StringWriter; import java.util.Iterator; import java.util.Map; import org.junit.Test; import net.sourceforge.pmd.lang.ast.DummyNode; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.rule.MockRule; import net.sourceforge.pmd.lang.rule.ParametricRuleViolation; import net.sourceforge.pmd.renderers.Renderer; import net.sourceforge.pmd.renderers.XMLRenderer; import net.sourceforge.pmd.stat.Metric; public class ReportTest implements ReportListener { private boolean violationSemaphore; private boolean metricSemaphore; @Override public void ruleViolationAdded(RuleViolation ruleViolation) { violationSemaphore = true; } @Override public void metricAdded(Metric metric) { metricSemaphore = true; } @Test public void testMetric0() { Report r = new Report(); assertFalse("Default report shouldn't contain metrics", r.hasMetrics()); } @Test public void testMetric1() { Report r = new Report(); assertFalse("Default report shouldn't contain metrics", r.hasMetrics()); r.addMetric(new Metric("m1", 0, 0.0, 1.0, 2.0, 3.0, 4.0)); assertTrue("Expected metrics weren't there", r.hasMetrics()); Iterator<Metric> ms = r.metrics(); assertTrue("Should have some metrics in there now", ms.hasNext()); Object o = ms.next(); assertTrue("Expected Metric, got " + o.getClass(), o instanceof Metric); Metric m = (Metric) o; assertEquals("metric name mismatch", "m1", m.getMetricName()); assertEquals("wrong low value", 1.0, m.getLowValue(), 0.05); assertEquals("wrong high value", 2.0, m.getHighValue(), 0.05); assertEquals("wrong avg value", 3.0, m.getAverage(), 0.05); assertEquals("wrong std dev value", 4.0, m.getStandardDeviation(), 0.05); } // Files are grouped together now. @Test public void testSortedReportFile() throws IOException { Report r = new Report(); RuleContext ctx = new RuleContext(); ctx.setSourceCodeFilename("foo"); Node s = getNode(10, 5); Rule rule1 = new MockRule("name", "desc", "msg", "rulesetname"); r.addRuleViolation(new ParametricRuleViolation<>(rule1, ctx, s, rule1.getMessage())); ctx.setSourceCodeFilename("bar"); Node s1 = getNode(10, 5); Rule rule2 = new MockRule("name", "desc", "msg", "rulesetname"); r.addRuleViolation(new ParametricRuleViolation<>(rule2, ctx, s1, rule2.getMessage())); Renderer rend = new XMLRenderer(); String result = render(rend, r); assertTrue("sort order wrong", result.indexOf("bar") < result.indexOf("foo")); } @Test public void testSortedReportLine() throws IOException { Report r = new Report(); RuleContext ctx = new RuleContext(); ctx.setSourceCodeFilename("foo1"); Node s = getNode(10, 5); Rule rule1 = new MockRule("rule2", "rule2", "msg", "rulesetname"); r.addRuleViolation(new ParametricRuleViolation<>(rule1, ctx, s, rule1.getMessage())); ctx.setSourceCodeFilename("foo2"); Node s1 = getNode(20, 5); Rule rule2 = new MockRule("rule1", "rule1", "msg", "rulesetname"); r.addRuleViolation(new ParametricRuleViolation<>(rule2, ctx, s1, rule2.getMessage())); Renderer rend = new XMLRenderer(); String result = render(rend, r); assertTrue("sort order wrong", result.indexOf("rule2") < result.indexOf("rule1")); } @Test public void testListener() { Report rpt = new Report(); rpt.addListener(this); violationSemaphore = false; RuleContext ctx = new RuleContext(); ctx.setSourceCodeFilename("file"); Node s = getNode(5, 5); Rule rule1 = new MockRule("name", "desc", "msg", "rulesetname"); rpt.addRuleViolation(new ParametricRuleViolation<>(rule1, ctx, s, rule1.getMessage())); assertTrue(violationSemaphore); metricSemaphore = false; rpt.addMetric(new Metric("test", 0, 0.0, 0.0, 0.0, 0.0, 0.0)); assertTrue("no metric", metricSemaphore); } @Test public void testSummary() { Report r = new Report(); RuleContext ctx = new RuleContext(); ctx.setSourceCodeFilename("foo1"); Node s = getNode(5, 5); Rule rule = new MockRule("name", "desc", "msg", "rulesetname"); r.addRuleViolation(new ParametricRuleViolation<>(rule, ctx, s, rule.getMessage())); ctx.setSourceCodeFilename("foo2"); Rule mr = new MockRule("rule1", "rule1", "msg", "rulesetname"); Node s1 = getNode(20, 5); Node s2 = getNode(30, 5); r.addRuleViolation(new ParametricRuleViolation<>(mr, ctx, s1, mr.getMessage())); r.addRuleViolation(new ParametricRuleViolation<>(mr, ctx, s2, mr.getMessage())); Map<String, Integer> summary = r.getSummary(); assertEquals(summary.keySet().size(), 2); assertTrue(summary.values().contains(Integer.valueOf(1))); assertTrue(summary.values().contains(Integer.valueOf(2))); } @Test public void testTreeIterator() { Report r = new Report(); RuleContext ctx = new RuleContext(); Rule rule = new MockRule("name", "desc", "msg", "rulesetname"); Node node1 = getNode(5, 5, true); r.addRuleViolation(new ParametricRuleViolation<>(rule, ctx, node1, rule.getMessage())); Node node2 = getNode(5, 6, true); r.addRuleViolation(new ParametricRuleViolation<>(rule, ctx, node2, rule.getMessage())); Iterator<RuleViolation> violations = r.iterator(); int violationCount = 0; while (violations.hasNext()) { violations.next(); violationCount++; } assertEquals(2, violationCount); Iterator<RuleViolation> treeIterator = r.treeIterator(); int treeCount = 0; while (treeIterator.hasNext()) { treeIterator.next(); treeCount++; } assertEquals(2, treeCount); } private static Node getNode(int line, int column) { DummyNode s = new DummyNode(2); DummyNode parent = new DummyNode(1); parent.testingOnlySetBeginLine(line); parent.testingOnlySetBeginColumn(column); s.jjtSetParent(parent); s.testingOnlySetBeginLine(10); s.testingOnlySetBeginColumn(5); return s; } private static Node getNode(int line, int column, boolean nextLine) { DummyNode s = (DummyNode) getNode(line, column); if (nextLine) { s.testingOnlySetBeginLine(line + 1); s.testingOnlySetBeginColumn(column + 4); } return s; } public static String render(Renderer renderer, Report report) throws IOException { StringWriter writer = new StringWriter(); renderer.setWriter(writer); renderer.start(); renderer.renderFileReport(report); renderer.end(); return writer.toString(); } }