1 /***
2 * <copyright>
3 * Copyright 1997-2002 InfoEther, LLC
4 * under sponsorship of the Defense Advanced Research Projects Agency
5 (DARPA).
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the Cougaar Open Source License as published
9 by
10 * DARPA on the Cougaar Open Source Website (www.cougaar.org).
11 *
12 * THE COUGAAR SOFTWARE AND ANY DERIVATIVE SUPPLIED BY LICENSOR IS
13 * PROVIDED 'AS IS' WITHOUT WARRANTIES OF ANY KIND, WHETHER EXPRESS OR
14 * IMPLIED, INCLUDING (BUT NOT LIMITED TO) ALL IMPLIED WARRANTIES OF
15 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND WITHOUT
16 * ANY WARRANTIES AS TO NON-INFRINGEMENT. IN NO EVENT SHALL COPYRIGHT
17 * HOLDER BE LIABLE FOR ANY DIRECT, SPECIAL, INDIRECT OR CONSEQUENTIAL
18 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE OF DATA OR PROFITS,
19 * TORTIOUS CONDUCT, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THE COUGAAR SOFTWARE.
21 * </copyright>
22 */
23 package test.net.sourceforge.pmd;
24
25 import junit.framework.TestCase;
26 import net.sourceforge.pmd.Report;
27 import net.sourceforge.pmd.RuleContext;
28 import net.sourceforge.pmd.RuleSet;
29 import net.sourceforge.pmd.RuleViolation;
30 import net.sourceforge.pmd.TargetJDK1_4;
31 import net.sourceforge.pmd.ast.JavaParser;
32 import test.net.sourceforge.pmd.testframework.MockRule;
33
34 import java.io.StringReader;
35 import java.util.ArrayList;
36 import java.util.HashSet;
37 import java.util.Iterator;
38 import java.util.List;
39 import java.util.Set;
40
41 public class RuleSetTest extends TestCase {
42
43 private String javaCode = "public class Test { }";
44
45 public void testNoDFA() {
46 RuleSet rs = new RuleSet();
47 MockRule mock = new MockRule("name", "desc", "msg", "rulesetname");
48 rs.addRule(mock);
49 assertFalse(rs.usesDFA());
50 }
51
52 public void testIncludesRuleWithDFA() {
53 RuleSet rs = new RuleSet();
54 MockRule mock = new MockRule("name", "desc", "msg", "rulesetname");
55 mock.setUsesDFA();
56 rs.addRule(mock);
57 assertTrue(rs.usesDFA());
58 }
59
60 public void testAccessors() {
61 RuleSet rs = new RuleSet();
62 rs.setName("foo");
63 assertEquals("name mismatch", "foo", rs.getName());
64 rs.setDescription("bar");
65 assertEquals("description mismatch", "bar", rs.getDescription());
66 }
67
68 public void testGetRuleByName() {
69 RuleSet rs = new RuleSet();
70 MockRule mock = new MockRule("name", "desc", "msg", "rulesetname");
71 rs.addRule(mock);
72 assertEquals("unable to fetch rule by name", mock, rs.getRuleByName("name"));
73 }
74
75 public void testGetRuleByName2() {
76 RuleSet rs = new RuleSet();
77 MockRule mock = new MockRule("name", "desc", "msg", "rulesetname");
78 rs.addRule(mock);
79 assertNull("the rule FooRule must not be found!", rs.getRuleByName("FooRule"));
80 }
81
82 public void testRuleList() {
83 RuleSet IUT = new RuleSet();
84
85 assertEquals("Size of RuleSet isn't zero.", 0, IUT.size());
86
87 MockRule rule = new MockRule("name", "desc", "msg", "rulesetname");
88 IUT.addRule(rule);
89
90 assertEquals("Size of RuleSet isn't one.", 1, IUT.size());
91
92 Set rules = IUT.getRules();
93
94 Iterator i = rules.iterator();
95 assertTrue("Empty Set", i.hasNext());
96 assertEquals("Returned set of wrong size.", 1, rules.size());
97 assertEquals("Rule isn't in ruleset.", rule, i.next());
98 }
99
100 public void testAddRuleSet() {
101 RuleSet set1 = new RuleSet();
102 set1.addRule(new MockRule("name", "desc", "msg", "rulesetname"));
103 RuleSet set2 = new RuleSet();
104 set2.addRule(new MockRule("name2", "desc", "msg", "rulesetname"));
105 set1.addRuleSet(set2);
106 assertEquals("ruleset size wrong", 2, set1.size());
107 }
108
109 public void testApply0Rules() throws Throwable {
110 RuleSet IUT = new RuleSet();
111 verifyRuleSet(IUT, 0, new HashSet());
112 }
113
114 public void testEquals1() {
115 RuleSet s = new RuleSet();
116 assertFalse("A ruleset cannot be equals to null", s.equals(null));
117 }
118
119 public void testEquals2() {
120 RuleSet s = new RuleSet();
121 assertTrue("A rulset must be equals to itself", s.equals(s));
122 }
123
124 public void testEquals3() {
125 RuleSet s = new RuleSet();
126 s.setName("basic rules");
127 assertFalse("A ruleset cannot be equals to another kind of object", s.equals("basic rules"));
128 }
129
130 public void testEquals4() {
131 RuleSet s1 = new RuleSet();
132 s1.setName("my ruleset");
133 s1.addRule(new MockRule("name", "desc", "msg", "rulesetname"));
134
135 RuleSet s2 = new RuleSet();
136 s2.setName("my ruleset");
137 s2.addRule(new MockRule("name", "desc", "msg", "rulesetname"));
138
139 assertEquals("2 rulesets with same name and rules must be equals", s1, s2);
140 assertEquals("Equals rulesets must have the same hashcode", s1.hashCode(), s2.hashCode());
141 }
142
143 public void testEquals5() {
144 RuleSet s1 = new RuleSet();
145 s1.setName("my ruleset");
146 s1.addRule(new MockRule("name", "desc", "msg", "rulesetname"));
147
148 RuleSet s2 = new RuleSet();
149 s2.setName("my other ruleset");
150 s2.addRule(new MockRule("name", "desc", "msg", "rulesetname"));
151
152 assertFalse("2 rulesets with different name but same rules must not be equals", s1.equals(s2));
153 assertFalse("Rulesets that are not equals should not have the same hashcode", s1.hashCode() == s2.hashCode());
154 }
155
156 public void testEquals6() {
157 RuleSet s1 = new RuleSet();
158 s1.setName("my ruleset");
159 s1.addRule(new MockRule("name", "desc", "msg", "rulesetname"));
160
161 RuleSet s2 = new RuleSet();
162 s2.setName("my ruleset");
163 s2.addRule(new MockRule("other rule", "desc", "msg", "rulesetname"));
164
165 assertFalse("2 rulesets with same name but different rules must not be equals", s1.equals(s2));
166 assertFalse("Rulesets that are not equals should not have the same hashcode", s1.hashCode() == s2.hashCode());
167 }
168
169 protected void verifyRuleSet(RuleSet IUT, int size, Set values) throws Throwable {
170
171 RuleContext context = new RuleContext();
172 Set reportedValues = new HashSet();
173 context.setReport(new Report());
174 IUT.apply(makeCompilationUnits(), context);
175
176 assertEquals("Invalid number of Violations Reported", size, context.getReport().size());
177
178 Iterator violations = context.getReport().iterator();
179 while (violations.hasNext()) {
180 RuleViolation violation = (RuleViolation) violations.next();
181
182 reportedValues.add(violation);
183 assertTrue("Unexpected Violation Returned: " + violation, values.contains(violation));
184 }
185
186 Iterator expected = values.iterator();
187 while (expected.hasNext()) {
188 RuleViolation violation = (RuleViolation) expected.next();
189 assertTrue("Expected Violation not Returned: " + violation, reportedValues.contains(violation));
190 }
191 }
192
193
194 protected List makeCompilationUnits() throws Throwable {
195 List RC = new ArrayList();
196 JavaParser parser = (new TargetJDK1_4()).createParser(new StringReader(javaCode));
197 RC.add(parser.CompilationUnit());
198 return RC;
199 }
200 }