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