View Javadoc
1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd;
5   
6   import static org.junit.Assert.assertEquals;
7   import static org.junit.Assert.assertFalse;
8   import static org.junit.Assert.assertTrue;
9   
10  import java.io.IOException;
11  import java.io.StringWriter;
12  import java.util.Iterator;
13  import java.util.Map;
14  
15  import net.sourceforge.pmd.lang.ast.DummyNode;
16  import net.sourceforge.pmd.lang.ast.Node;
17  import net.sourceforge.pmd.lang.rule.MockRule;
18  import net.sourceforge.pmd.lang.rule.ParametricRuleViolation;
19  import net.sourceforge.pmd.renderers.Renderer;
20  import net.sourceforge.pmd.renderers.XMLRenderer;
21  import net.sourceforge.pmd.stat.Metric;
22  
23  import org.junit.Test;
24  
25  
26  public class ReportTest implements ReportListener {
27  
28      private boolean violationSemaphore;
29      private boolean metricSemaphore;
30  
31      public void ruleViolationAdded(RuleViolation ruleViolation) {
32          violationSemaphore = true;
33      }
34  
35      public void metricAdded(Metric metric) {
36          metricSemaphore = true;
37      }
38  
39      @Test
40      public void testMetric0() {
41          Report r = new Report();
42          assertFalse("Default report shouldn't contain metrics", r.hasMetrics());
43      }
44  
45      @Test
46      public void testMetric1() {
47          Report r = new Report();
48          assertFalse("Default report shouldn't contain metrics", r.hasMetrics());
49  
50          r.addMetric(new Metric("m1", 0, 0.0, 1.0, 2.0, 3.0, 4.0));
51          assertTrue("Expected metrics weren't there", r.hasMetrics());
52  
53          Iterator<Metric> ms = r.metrics();
54          assertTrue("Should have some metrics in there now", ms.hasNext());
55  
56          Object o = ms.next();
57          assertTrue("Expected Metric, got " + o.getClass(), o instanceof Metric);
58  
59          Metric m = (Metric) o;
60          assertEquals("metric name mismatch", "m1", m.getMetricName());
61          assertEquals("wrong low value", 1.0, m.getLowValue(), 0.05);
62          assertEquals("wrong high value", 2.0, m.getHighValue(), 0.05);
63          assertEquals("wrong avg value", 3.0, m.getAverage(), 0.05);
64          assertEquals("wrong std dev value", 4.0, m.getStandardDeviation(), 0.05);
65      }
66  
67      // Files are grouped together now.
68      @Test
69      public void testSortedReport_File() throws IOException {
70          Report r = new Report();
71          RuleContext ctx = new RuleContext();
72          ctx.setSourceCodeFilename("foo");
73          Node s = getNode(10, 5);
74          Rule rule1 = new MockRule("name", "desc", "msg", "rulesetname");
75          r.addRuleViolation(new ParametricRuleViolation<Node>(rule1, ctx, s, rule1.getMessage()));
76          ctx.setSourceCodeFilename("bar");
77          Node s1 = getNode(10, 5);
78          Rule rule2 = new MockRule("name", "desc", "msg", "rulesetname");
79          r.addRuleViolation(new ParametricRuleViolation<Node>(rule2, ctx, s1, rule2.getMessage()));
80          Renderer rend = new XMLRenderer();
81          String result = render(rend, r);
82          assertTrue("sort order wrong", result.indexOf("bar") < result.indexOf("foo"));
83      }
84  
85      @Test
86      public void testSortedReport_Line() throws IOException {
87          Report r = new Report();
88          RuleContext ctx = new RuleContext();
89          ctx.setSourceCodeFilename("foo1");
90          Node s = getNode(10, 5);
91          Rule rule1 = new MockRule("rule2", "rule2", "msg", "rulesetname");
92          r.addRuleViolation(new ParametricRuleViolation<Node>(rule1, ctx, s, rule1.getMessage()));
93          ctx.setSourceCodeFilename("foo2");
94          Node s1 = getNode(20, 5);
95          Rule rule2 = new MockRule("rule1", "rule1", "msg", "rulesetname");
96          r.addRuleViolation(new ParametricRuleViolation<Node>(rule2, ctx, s1, rule2.getMessage()));
97          Renderer rend = new XMLRenderer();
98          String result = render(rend, r);
99          assertTrue("sort order wrong", result.indexOf("rule2") < result.indexOf("rule1"));
100     }
101 
102     @Test
103     public void testListener() {
104         Report rpt = new Report();
105         rpt.addListener(this);
106         violationSemaphore = false;
107         RuleContext ctx = new RuleContext();
108         ctx.setSourceCodeFilename("file");
109         Node s = getNode(5, 5);
110         Rule rule1 = new MockRule("name", "desc", "msg", "rulesetname");
111         rpt.addRuleViolation(new ParametricRuleViolation<Node>(rule1, ctx, s, rule1.getMessage()));
112         assertTrue(violationSemaphore);
113 
114         metricSemaphore = false;
115         rpt.addMetric(new Metric("test", 0, 0.0, 0.0, 0.0, 0.0, 0.0));
116 
117         assertTrue("no metric", metricSemaphore);
118     }
119 
120     @Test
121     public void testSummary() {
122         Report r = new Report();
123         RuleContext ctx = new RuleContext();
124         ctx.setSourceCodeFilename("foo1");
125         Node s = getNode(5, 5);
126         Rule rule = new MockRule("name", "desc", "msg", "rulesetname");
127         r.addRuleViolation(new ParametricRuleViolation<Node>(rule, ctx, s, rule.getMessage()));
128         ctx.setSourceCodeFilename("foo2");
129         Rule mr = new MockRule("rule1", "rule1", "msg", "rulesetname");
130         Node s1 = getNode(20, 5);
131         Node s2 = getNode(30, 5);
132         r.addRuleViolation(new ParametricRuleViolation<Node>(mr, ctx, s1, mr.getMessage()));
133         r.addRuleViolation(new ParametricRuleViolation<Node>(mr, ctx, s2, mr.getMessage()));
134         Map<String, Integer> summary = r.getSummary();
135         assertEquals(summary.keySet().size(), 2);
136         assertTrue(summary.values().contains(Integer.valueOf(1)));
137         assertTrue(summary.values().contains(Integer.valueOf(2)));
138     }
139 
140     @Test
141     public void testTreeIterator() {
142         Report r = new Report();
143         RuleContext ctx = new RuleContext();
144         Rule rule = new MockRule("name", "desc", "msg", "rulesetname");
145         Node node1 = getNode(5, 5, true);
146         r.addRuleViolation(new ParametricRuleViolation<Node>(rule, ctx, node1, rule.getMessage()));
147         Node node2 = getNode(5, 6, true);
148         r.addRuleViolation(new ParametricRuleViolation<Node>(rule, ctx, node2, rule.getMessage()));
149 
150         Iterator<RuleViolation> violations = r.iterator();
151         int violationCount = 0;
152         while (violations.hasNext()) {
153             violations.next();
154             violationCount++;
155         }
156         assertEquals(2, violationCount);
157 
158         Iterator<RuleViolation> treeIterator = r.treeIterator();
159         int treeCount = 0;
160         while (treeIterator.hasNext()) {
161             treeIterator.next();
162             treeCount++;
163         }
164         assertEquals(2, treeCount);
165     }
166     
167     private static Node getNode(int line, int column){
168         DummyNode s = new DummyNode(2);
169         DummyNode parent = new DummyNode(1);
170         parent.testingOnly__setBeginLine(line);
171         parent.testingOnly__setBeginColumn(column);
172         s.jjtSetParent(parent);
173         s.testingOnly__setBeginLine(10);
174         s.testingOnly__setBeginColumn(5);
175         return s;
176     }
177 
178     private static Node getNode(int line, int column, boolean nextLine) {
179         DummyNode s = (DummyNode)getNode(line, column);
180         if (nextLine) {
181             s.testingOnly__setBeginLine(line + 1);
182             s.testingOnly__setBeginColumn(column + 4);
183         }
184         return s;
185     }
186 
187     public static String render(Renderer renderer, Report report) throws IOException {
188         StringWriter writer = new StringWriter();
189         renderer.setWriter(writer);
190         renderer.start();
191         renderer.renderFileReport(report);
192         renderer.end();
193         return writer.toString();
194     }
195 }