1
2
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
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 }