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 }