1 23 package test.net.sourceforge.pmd; 24 25 import java.util.Iterator ; 26 import java.util.Map ; 27 28 import net.sourceforge.pmd.AbstractRule; 29 import net.sourceforge.pmd.IRuleViolation; 30 import net.sourceforge.pmd.PMD; 31 import net.sourceforge.pmd.Report; 32 import net.sourceforge.pmd.ReportListener; 33 import net.sourceforge.pmd.Rule; 34 import net.sourceforge.pmd.RuleContext; 35 import net.sourceforge.pmd.RuleViolation; 36 import net.sourceforge.pmd.SourceType; 37 import net.sourceforge.pmd.ast.ASTClassOrInterfaceDeclaration; 38 import net.sourceforge.pmd.ast.SimpleJavaNode; 39 import net.sourceforge.pmd.ast.SimpleNode; 40 import net.sourceforge.pmd.renderers.Renderer; 41 import net.sourceforge.pmd.renderers.XMLRenderer; 42 import net.sourceforge.pmd.stat.Metric; 43 import net.sourceforge.pmd.symboltable.SourceFileScope; 44 import test.net.sourceforge.pmd.testframework.MockRule; 45 import test.net.sourceforge.pmd.testframework.RuleTst; 46 47 public class ReportTest extends RuleTst implements ReportListener { 48 49 private static class FooRule extends AbstractRule { 50 public Object visit(ASTClassOrInterfaceDeclaration c, Object ctx) { 51 if ("Foo".equals(c.getImage())) addViolation(ctx, c); 52 return ctx; 53 } 54 55 public String getMessage() { 56 return "blah"; 57 } 58 59 public String getName() { 60 return "Foo"; 61 } 62 63 public String getRuleSetName() { 64 return "RuleSet"; 65 } 66 67 public String getDescription() { 68 return "desc"; 69 } 70 } 71 72 private boolean violationSemaphore; 73 private boolean metricSemaphore; 74 75 public void ruleViolationAdded(IRuleViolation ruleViolation) { 76 violationSemaphore = true; 77 } 78 79 public void metricAdded(Metric metric) { 80 metricSemaphore = true; 81 } 82 83 public void testBasic() throws Throwable { 84 Report r = new Report(); 85 runTestFromString(TEST1, new FooRule(), r); 86 assertTrue(!r.isEmpty()); 87 } 88 89 90 public void testMetric0() { 91 Report r = new Report(); 92 assertTrue("Default report shouldn't contain metrics", !r.hasMetrics()); 93 } 94 95 public void testMetric1() { 96 Report r = new Report(); 97 assertTrue("Default report shouldn't contain metrics", !r.hasMetrics()); 98 99 r.addMetric(new Metric("m1", 0, 0.0, 1.0, 2.0, 3.0, 4.0)); 100 assertTrue("Expected metrics weren't there", r.hasMetrics()); 101 102 Iterator ms = r.metrics(); 103 assertTrue("Should have some metrics in there now", ms.hasNext()); 104 105 Object o = ms.next(); 106 assertTrue("Expected Metric, got " + o.getClass(), o instanceof Metric); 107 108 Metric m = (Metric) o; 109 assertEquals("metric name mismatch", "m1", m.getMetricName()); 110 assertEquals("wrong low value", 1.0, m.getLowValue(), 0.05); 111 assertEquals("wrong high value", 2.0, m.getHighValue(), 0.05); 112 assertEquals("wrong avg value", 3.0, m.getAverage(), 0.05); 113 assertEquals("wrong std dev value", 4.0, m.getStandardDeviation(), 0.05); 114 } 115 116 public void testExclusionsInReportWithAnnotations() throws Throwable { 117 Report rpt = new Report(); 118 runTestFromString(TEST2, new FooRule(), rpt, SourceType.JAVA_15); 119 assertTrue(rpt.isEmpty()); 120 assertEquals(1, rpt.getSuppressedRuleViolations().size()); 121 } 122 123 public void testExclusionsInReportWithNOPMD() throws Throwable { 124 Report rpt = new Report(); 125 runTestFromString(TEST3, new FooRule(), rpt); 126 assertTrue(rpt.isEmpty()); 127 assertEquals(1, rpt.getSuppressedRuleViolations().size()); 128 } 129 130 private static final String TEST1 = 131 "public class Foo {}" + PMD.EOL; 132 133 private static final String TEST2 = 134 "@SuppressWarnings(\"PMD\")" + PMD.EOL + 135 "public class Foo {}"; 136 137 private static final String TEST3 = 138 "public class Foo {} // NOPMD"; 139 140 public void testSortedReport_File() { 142 Report r = new Report(); 143 RuleContext ctx = new RuleContext(); 144 ctx.setSourceCodeFilename("foo"); 145 SimpleNode s = getNode(10, 5, ctx.getSourceCodeFilename()); 146 r.addRuleViolation(new RuleViolation(new MockRule("name", "desc", "msg", "rulesetname"), ctx, s)); 147 ctx.setSourceCodeFilename("bar"); 148 SimpleNode s1 = getNode(10, 5, ctx.getSourceCodeFilename()); 149 r.addRuleViolation(new RuleViolation(new MockRule("name", "desc", "msg", "rulesetname"), ctx, s1)); 150 Renderer rend = new XMLRenderer(); 151 String result = rend.render(r); 152 assertTrue("sort order wrong", result.indexOf("bar") < result.indexOf("foo")); 153 } 154 155 public void testSortedReport_Line() { 156 Report r = new Report(); 157 RuleContext ctx = new RuleContext(); 158 ctx.setSourceCodeFilename("foo1"); 159 SimpleNode s = getNode(10, 5, ctx.getSourceCodeFilename()); 160 r.addRuleViolation(new RuleViolation(new MockRule("rule2", "rule2", "msg", "rulesetname"), ctx, s)); 161 ctx.setSourceCodeFilename("foo2"); 162 SimpleNode s1 = getNode(20, 5, ctx.getSourceCodeFilename()); 163 r.addRuleViolation(new RuleViolation(new MockRule("rule1", "rule1", "msg", "rulesetname"), ctx, s1)); 164 Renderer rend = new XMLRenderer(); 165 String result = rend.render(r); 166 assertTrue("sort order wrong", result.indexOf("rule2") < result.indexOf("rule1")); 167 } 168 169 public void testListener() { 170 Report rpt = new Report(); 171 rpt.addListener(this); 172 violationSemaphore = false; 173 RuleContext ctx = new RuleContext(); 174 ctx.setSourceCodeFilename("file"); 175 SimpleNode s = getNode(5, 5, ctx.getSourceCodeFilename()); 176 rpt.addRuleViolation(new RuleViolation(new MockRule("name", "desc", "msg", "rulesetname"), ctx, s)); 177 assertTrue(violationSemaphore); 178 179 metricSemaphore = false; 180 rpt.addMetric(new Metric("test", 0, 0.0, 0.0, 0.0, 0.0, 0.0)); 181 182 assertTrue("no metric", metricSemaphore); 183 } 184 185 public void testSummary() { 186 Report r = new Report(); 187 RuleContext ctx = new RuleContext(); 188 ctx.setSourceCodeFilename("foo1"); 189 SimpleNode s = getNode(5, 5, ctx.getSourceCodeFilename()); 190 Rule rule = new MockRule("name", "desc", "msg", "rulesetname"); 191 r.addRuleViolation(new RuleViolation(rule, ctx, s)); 192 ctx.setSourceCodeFilename("foo2"); 193 Rule mr = new MockRule("rule1", "rule1", "msg", "rulesetname"); 194 SimpleNode s1 = getNode(20, 5, ctx.getSourceCodeFilename()); 195 SimpleNode s2 = getNode(30, 5, ctx.getSourceCodeFilename()); 196 r.addRuleViolation(new RuleViolation(mr, ctx, s1)); 197 r.addRuleViolation(new RuleViolation(mr, ctx, s2)); 198 Map summary = r.getSummary(); 199 assertEquals(summary.keySet().size(), 2); 200 assertTrue(summary.values().contains(new Integer (1))); 201 assertTrue(summary.values().contains(new Integer (2))); 202 } 203 204 private SimpleNode getNode(int line, int column, String scopeName){ 205 SimpleNode s = new SimpleJavaNode(2); 206 SimpleNode parent = new SimpleJavaNode(1); 207 parent.testingOnly__setBeginLine(line); 208 parent.testingOnly__setBeginColumn(column); 209 s.jjtSetParent(parent); 210 s.setScope(new SourceFileScope(scopeName)); 211 s.testingOnly__setBeginLine(10); 212 s.testingOnly__setBeginColumn(5); 213 return s; 214 } 215 } 216 | Popular Tags |