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.Collection;
37  import java.util.HashSet;
38  import java.util.Iterator;
39  import java.util.List;
40  import java.util.Set;
41  
42  public class RuleSetTest extends TestCase {
43  
44      private String javaCode = "public class Test { }";
45  
46      public void testNoDFA() {
47          RuleSet rs = new RuleSet();
48          MockRule mock = new MockRule("name", "desc", "msg", "rulesetname");
49          rs.addRule(mock);
50          assertFalse(rs.usesDFA());
51      }
52  
53      public void testIncludesRuleWithDFA() {
54          RuleSet rs = new RuleSet();
55          MockRule mock = new MockRule("name", "desc", "msg", "rulesetname");
56          mock.setUsesDFA();
57          rs.addRule(mock);
58          assertTrue(rs.usesDFA());
59      }
60  
61      public void testAccessors() {
62          RuleSet rs = new RuleSet();
63          rs.setName("foo");
64          assertEquals("name mismatch", "foo", rs.getName());
65          rs.setDescription("bar");
66          assertEquals("description mismatch", "bar", rs.getDescription());
67      }
68  
69      public void testGetRuleByName() {
70          RuleSet rs = new RuleSet();
71          MockRule mock = new MockRule("name", "desc", "msg", "rulesetname");
72          rs.addRule(mock);
73          assertEquals("unable to fetch rule by name", mock, rs.getRuleByName("name"));
74      }
75  
76      public void testGetRuleByName2() {
77          RuleSet rs = new RuleSet();
78          MockRule mock = new MockRule("name", "desc", "msg", "rulesetname");
79          rs.addRule(mock);
80          assertNull("the rule FooRule must not be found!", rs.getRuleByName("FooRule"));
81      }
82  
83      public void testRuleList() {
84          RuleSet IUT = new RuleSet();
85  
86          assertEquals("Size of RuleSet isn't zero.", 0, IUT.size());
87  
88          MockRule rule = new MockRule("name", "desc", "msg", "rulesetname");
89          IUT.addRule(rule);
90  
91          assertEquals("Size of RuleSet isn't one.", 1, IUT.size());
92  
93          Collection rules = IUT.getRules();
94  
95          Iterator i = rules.iterator();
96          assertTrue("Empty Set", i.hasNext());
97          assertEquals("Returned set of wrong size.", 1, rules.size());
98          assertEquals("Rule isn't in ruleset.", rule, i.next());
99      }
100 
101     public void testAddRuleSet() {
102         RuleSet set1 = new RuleSet();
103         set1.addRule(new MockRule("name", "desc", "msg", "rulesetname"));
104         RuleSet set2 = new RuleSet();
105         set2.addRule(new MockRule("name2", "desc", "msg", "rulesetname"));
106         set1.addRuleSet(set2);
107         assertEquals("ruleset size wrong", 2, set1.size());
108     }
109 
110     public void testApply0Rules() throws Throwable {
111         RuleSet IUT = new RuleSet();
112         verifyRuleSet(IUT, 0, new HashSet());
113     }
114 
115     public void testEquals1() {
116         RuleSet s = new RuleSet();
117         assertFalse("A ruleset cannot be equals to null", s.equals(null));
118     }
119 
120     public void testEquals2() {
121         RuleSet s = new RuleSet();
122         assertTrue("A rulset must be equals to itself", s.equals(s));
123     }
124 
125     public void testEquals3() {
126         RuleSet s = new RuleSet();
127         s.setName("basic rules");
128         assertFalse("A ruleset cannot be equals to another kind of object", s.equals("basic rules"));
129     }
130 
131     public void testEquals4() {
132         RuleSet s1 = new RuleSet();
133         s1.setName("my ruleset");
134         s1.addRule(new MockRule("name", "desc", "msg", "rulesetname"));
135 
136         RuleSet s2 = new RuleSet();
137         s2.setName("my ruleset");
138         s2.addRule(new MockRule("name", "desc", "msg", "rulesetname"));
139 
140         assertEquals("2 rulesets with same name and rules must be equals", s1, s2);
141         assertEquals("Equals rulesets must have the same hashcode", s1.hashCode(), s2.hashCode());
142     }
143 
144     public void testEquals5() {
145         RuleSet s1 = new RuleSet();
146         s1.setName("my ruleset");
147         s1.addRule(new MockRule("name", "desc", "msg", "rulesetname"));
148 
149         RuleSet s2 = new RuleSet();
150         s2.setName("my other ruleset");
151         s2.addRule(new MockRule("name", "desc", "msg", "rulesetname"));
152 
153         assertFalse("2 rulesets with different name but same rules must not be equals", s1.equals(s2));
154         assertFalse("Rulesets that are not equals should not have the same hashcode", s1.hashCode() == s2.hashCode());
155     }
156 
157     public void testEquals6() {
158         RuleSet s1 = new RuleSet();
159         s1.setName("my ruleset");
160         s1.addRule(new MockRule("name", "desc", "msg", "rulesetname"));
161 
162         RuleSet s2 = new RuleSet();
163         s2.setName("my ruleset");
164         s2.addRule(new MockRule("other rule", "desc", "msg", "rulesetname"));
165 
166         assertFalse("2 rulesets with same name but different rules must not be equals", s1.equals(s2));
167         assertFalse("Rulesets that are not equals should not have the same hashcode", s1.hashCode() == s2.hashCode());
168     }
169 
170     protected void verifyRuleSet(RuleSet IUT, int size, Set values) throws Throwable {
171 
172         RuleContext context = new RuleContext();
173         Set reportedValues = new HashSet();
174         context.setReport(new Report());
175         IUT.apply(makeCompilationUnits(), context);
176 
177         assertEquals("Invalid number of Violations Reported", size, context.getReport().size());
178 
179         Iterator violations = context.getReport().iterator();
180         while (violations.hasNext()) {
181             RuleViolation violation = (RuleViolation) violations.next();
182 
183             reportedValues.add(violation);
184             assertTrue("Unexpected Violation Returned: " + violation, values.contains(violation));
185         }
186 
187         Iterator expected = values.iterator();
188         while (expected.hasNext()) {
189             RuleViolation violation = (RuleViolation) expected.next();
190             assertTrue("Expected Violation not Returned: " + violation, reportedValues.contains(violation));
191         }
192     }
193 
194 
195     protected List makeCompilationUnits() throws Throwable {
196         List RC = new ArrayList();
197         JavaParser parser = (new TargetJDK1_4()).createParser(new StringReader(javaCode));
198         RC.add(parser.CompilationUnit());
199         return RC;
200     }
201 }