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.Collections;
37  import java.util.HashSet;
38  import java.util.Iterator;
39  import java.util.List;
40  import java.util.Random;
41  import java.util.Set;
42  
43  public class RuleSetTest extends TestCase {
44      private String javaCode = "public class Test { }";
45  
46      public void testConstructor() {
47          new RuleSet();
48      }
49  
50      public void testAccessors() {
51          RuleSet rs = new RuleSet();
52          rs.setName("foo");
53          assertEquals("name mismatch", "foo", rs.getName());
54          rs.setDescription("bar");
55          assertEquals("description mismatch", "bar", rs.getDescription());
56      }
57  
58      public void testGetRuleByName() {
59          RuleSet rs = new RuleSet();
60          MockRule mock = new MockRule("name", "desc", "msg");
61          rs.addRule(mock);
62          assertEquals("unable to fetch rule by name", mock, rs.getRuleByName("name"));
63      }
64  
65      public void testRuleList() {
66          RuleSet IUT = new RuleSet();
67  
68          assertEquals("Size of RuleSet isn't zero.", 0, IUT.size());
69  
70          MockRule rule = new MockRule("name", "desc", "msg");
71          IUT.addRule(rule);
72  
73          assertEquals("Size of RuleSet isn't one.", 1, IUT.size());
74  
75          Set rules = IUT.getRules();
76  
77          Iterator i = rules.iterator();
78          assertTrue("Empty Set", i.hasNext());
79          assertEquals("Returned set of wrong size.", 1, rules.size());
80          assertEquals("Rule isn't in ruleset.", rule, i.next());
81      }
82  
83      public void testAddRuleSet() {
84          RuleSet set1 = new RuleSet();
85          set1.addRule(new MockRule("name", "desc", "msg"));
86          RuleSet set2 = new RuleSet();
87          set2.addRule(new MockRule("name", "desc", "msg"));
88          set1.addRuleSet(set2);
89          assertEquals("ruleset size wrong", 2, set1.size());
90      }
91  
92      public void testApply0Rules() throws Throwable {
93          RuleSet IUT = new RuleSet();
94          verifyRuleSet(IUT, 0, new HashSet());
95      }
96  
97      public void testApply1Rule() throws Throwable {
98          RuleSet IUT = new RuleSet();
99  
100         MockRule rule = new MockRule("name", "desc", "msg");
101         RuleContext ctx = new RuleContext();
102         ctx.setSourceCodeFilename("filename");
103         RuleViolation violation = new RuleViolation(rule, 1, ctx);
104         rule.addViolation(violation);
105 
106         IUT.addRule(rule);
107 
108         verifyRuleSet(IUT, 1, Collections.singleton(violation));
109     }
110 
111     public void testApplyNRule() throws Throwable {
112         RuleSet IUT = new RuleSet();
113 
114         Random rand = new Random();
115         int numRules = rand.nextInt(10) + 1;
116         Set ruleViolations = new HashSet();
117 
118         for (int i = 0; i < numRules; i++) {
119             MockRule rule = new MockRule("name", "desc", "msg");
120             RuleContext ctx = new RuleContext();
121             ctx.setSourceCodeFilename("filename");
122             RuleViolation violation = new RuleViolation(rule, i, ctx);
123 
124             ruleViolations.add(violation);
125             rule.addViolation(violation);
126 
127             IUT.addRule(rule);
128         }
129 
130         verifyRuleSet(IUT, numRules, ruleViolations);
131     }
132 
133     protected void verifyRuleSet(RuleSet IUT, int size, Set values) throws Throwable {
134 
135         RuleContext context = new RuleContext();
136         Set reportedValues = new HashSet();
137         context.setReport(new Report());
138         IUT.apply(makeCompilationUnits(), context);
139 
140         assertEquals("Invalid number of Violations Reported", size, context.getReport().size());
141 
142         Iterator violations = context.getReport().iterator();
143         while (violations.hasNext()) {
144             RuleViolation violation = (RuleViolation) violations.next();
145 
146             reportedValues.add(violation);
147             assertTrue("Unexpected Violation Returned: " + violation, values.contains(violation));
148         }
149 
150         Iterator expected = values.iterator();
151         while (expected.hasNext()) {
152             RuleViolation violation = (RuleViolation) expected.next();
153             assertTrue("Expected Violation not Returned: " + violation, reportedValues.contains(violation));
154         }
155     }
156 
157 
158     protected List makeCompilationUnits() throws Throwable {
159         List RC = new ArrayList();
160         JavaParser parser = (new TargetJDK1_4()).createParser(new StringReader(javaCode));
161         RC.add(parser.CompilationUnit());
162         return RC;
163     }
164 }