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.util.HashMap;
11 import java.util.Map;
12
13 import net.sourceforge.pmd.PropertyDescriptor;
14 import net.sourceforge.pmd.Report;
15 import net.sourceforge.pmd.RuleContext;
16 import net.sourceforge.pmd.RulePriority;
17 import net.sourceforge.pmd.RuleViolation;
18 import net.sourceforge.pmd.lang.Language;
19 import net.sourceforge.pmd.lang.java.ast.DummyJavaNode;
20 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
21 import net.sourceforge.pmd.lang.java.rule.JavaRuleViolation;
22 import net.sourceforge.pmd.lang.java.symboltable.SourceFileScope;
23 import net.sourceforge.pmd.lang.rule.properties.IntegerProperty;
24 import net.sourceforge.pmd.lang.rule.properties.StringProperty;
25
26 import org.junit.Test;
27 public class AbstractRuleTest {
28
29 private static class MyRule extends AbstractJavaRule {
30 private static final StringProperty pd = new StringProperty("foo", "foo property", "x", 1.0f);
31
32 private static final StringProperty xpath = new StringProperty("xpath", "xpath property", "", 2.0f);
33
34 public MyRule() {
35 definePropertyDescriptor(pd);
36 definePropertyDescriptor(xpath);
37 setName("MyRule");
38 setMessage("my rule msg");
39 setPriority(RulePriority.MEDIUM);
40 setProperty(pd, "value");
41 }
42 }
43
44 private static class MyOtherRule extends AbstractJavaRule {
45 private static final PropertyDescriptor pd = new StringProperty("foo", "foo property", "x", 1.0f);
46
47 public MyOtherRule() {
48 definePropertyDescriptor(pd);
49 setName("MyOtherRule");
50 setMessage("my other rule");
51 setPriority(RulePriority.MEDIUM);
52 setProperty(pd, "value");
53 }
54 }
55
56 @Test
57 public void testCreateRV() {
58 MyRule r = new MyRule();
59 r.setRuleSetName("foo");
60 RuleContext ctx = new RuleContext();
61 ctx.setSourceCodeFilename("filename");
62 DummyJavaNode s = new DummyJavaNode(1);
63 s.testingOnly__setBeginColumn(5);
64 s.testingOnly__setBeginLine(5);
65 s.setScope(new SourceFileScope("foo"));
66 RuleViolation rv = new JavaRuleViolation(r, ctx, s, r.getMessage());
67 assertEquals("Line number mismatch!", 5, rv.getBeginLine());
68 assertEquals("Filename mismatch!", "filename", rv.getFilename());
69 assertEquals("Rule object mismatch!", r, rv.getRule());
70 assertEquals("Rule msg mismatch!", "my rule msg", rv.getDescription());
71 assertEquals("RuleSet name mismatch!", "foo", rv.getRule().getRuleSetName());
72 }
73
74 @Test
75 public void testCreateRV2() {
76 MyRule r = new MyRule();
77 RuleContext ctx = new RuleContext();
78 ctx.setSourceCodeFilename("filename");
79 DummyJavaNode s = new DummyJavaNode(1);
80 s.testingOnly__setBeginColumn(5);
81 s.testingOnly__setBeginLine(5);
82 s.setScope(new SourceFileScope("foo"));
83 RuleViolation rv = new JavaRuleViolation(r, ctx, s, "specificdescription");
84 assertEquals("Line number mismatch!", 5, rv.getBeginLine());
85 assertEquals("Filename mismatch!", "filename", rv.getFilename());
86 assertEquals("Rule object mismatch!", r, rv.getRule());
87 assertEquals("Rule description mismatch!", "specificdescription", rv.getDescription());
88 }
89
90 @Test
91 public void testRuleWithVariableInMessage() {
92 MyRule r = new MyRule();
93 r.definePropertyDescriptor(new IntegerProperty("testInt", "description", 0, 100, 10, 0));
94 r.setMessage("Message ${packageName} ${className} ${methodName} ${variableName} ${testInt} ${noSuchProperty}");
95 RuleContext ctx = new RuleContext();
96 ctx.setLanguageVersion(Language.JAVA.getDefaultVersion());
97 ctx.setReport(new Report());
98 ctx.setSourceCodeFilename("filename");
99 DummyJavaNode s = new DummyJavaNode(1);
100 s.testingOnly__setBeginColumn(5);
101 s.testingOnly__setBeginLine(5);
102 s.setImage("TestImage");
103 s.setScope(new SourceFileScope("foo"));
104 r.addViolation(ctx, s);
105 RuleViolation rv = ctx.getReport().getViolationTree().iterator().next();
106 assertEquals("Message foo 10 ${noSuchProperty}", rv.getDescription());
107 }
108
109 @Test
110 public void testRuleSuppress() {
111 MyRule r = new MyRule();
112 RuleContext ctx = new RuleContext();
113 Map<Integer, String> m = new HashMap<Integer, String>();
114 m.put(Integer.valueOf(5), "");
115 ctx.setReport(new Report());
116 ctx.getReport().suppress(m);
117 ctx.setSourceCodeFilename("filename");
118 DummyJavaNode n = new DummyJavaNode(1);
119 n.testingOnly__setBeginColumn(5);
120 n.testingOnly__setBeginLine(5);
121 n.setScope(new SourceFileScope("foo"));
122 RuleViolation rv = new JavaRuleViolation(r, ctx, n, "specificdescription");
123 ctx.getReport().addRuleViolation(rv);
124 assertTrue(ctx.getReport().isEmpty());
125 }
126
127 @Test
128 public void testEquals1() {
129 MyRule r = new MyRule();
130 assertFalse("A rule is never equals to null!", r.equals(null));
131 }
132
133 @Test
134 public void testEquals2() {
135 MyRule r = new MyRule();
136 assertEquals("A rule must be equals to itself", r, r);
137 }
138
139 @Test
140 public void testEquals3() {
141 MyRule r1 = new MyRule();
142 MyRule r2 = new MyRule();
143 assertEquals("Two instances of the same rule are equal", r1, r2);
144 assertEquals("Hashcode for two instances of the same rule must be equal", r1.hashCode(), r2.hashCode());
145 }
146
147 @Test
148 public void testEquals4() {
149 MyRule myRule = new MyRule();
150 assertFalse("A rule cannot be equal to an object of another class", myRule.equals("MyRule"));
151 }
152
153 @Test
154 public void testEquals5() {
155 MyRule myRule = new MyRule();
156 MyOtherRule myOtherRule = new MyOtherRule();
157 assertFalse("Two rules from different classes cannot be equal", myRule.equals(myOtherRule));
158 }
159
160 @Test
161 public void testEquals6() {
162 MyRule r1 = new MyRule();
163 MyRule r2 = new MyRule();
164 r2.setName("MyRule2");
165 assertFalse("Rules with different names cannot be equal", r1.equals(r2));
166 }
167
168 @Test
169 public void testEquals7() {
170 MyRule r1 = new MyRule();
171 MyRule r2 = new MyRule();
172 r2.setPriority(RulePriority.HIGH);
173 assertFalse("Rules with different priority levels cannot be equal", r1.equals(r2));
174 }
175
176 @Test
177 public void testEquals8() {
178 MyRule r1 = new MyRule();
179 r1.setProperty(MyRule.xpath, "something");
180 MyRule r2 = new MyRule();
181 r2.setProperty(MyRule.xpath, "something else");
182 assertFalse("Rules with different properties values cannot be equal", r1.equals(r2));
183 }
184
185 @Test
186 public void testEquals9() {
187 MyRule r1 = new MyRule();
188 MyRule r2 = new MyRule();
189 r2.setProperty(MyRule.xpath, "something else");
190 assertFalse("Rules with different properties cannot be equal", r1.equals(r2));
191 }
192
193 @Test
194 public void testEquals10() {
195 MyRule r1 = new MyRule();
196 MyRule r2 = new MyRule();
197 r2.setMessage("another message");
198 assertEquals("Rules with different messages are still equal", r1, r2);
199 assertEquals("Rules that are equal must have the an equal hashcode", r1.hashCode(), r2.hashCode());
200 }
201
202
203 public static junit.framework.Test suite() {
204 return new junit.framework.JUnit4TestAdapter(AbstractRuleTest.class);
205 }
206 }