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.AbstractRule;
27  import net.sourceforge.pmd.Report;
28  import net.sourceforge.pmd.RuleContext;
29  import net.sourceforge.pmd.RuleViolation;
30  import net.sourceforge.pmd.ast.SimpleNode;
31  import net.sourceforge.pmd.symboltable.SourceFileScope;
32  
33  import java.util.HashSet;
34  import java.util.Set;
35  
36  public class AbstractRuleTest extends TestCase {
37  
38      private static class MyRule extends AbstractRule{
39          public MyRule() {
40              setName("MyRule");
41              setMessage("my rule");
42              setPriority(3);
43              addProperty("foo", "value");
44          }
45      }
46  
47      private static class MyOtherRule extends AbstractRule{
48          public MyOtherRule() {
49              setName("MyOtherRule");
50              setMessage("my other rule");
51              setPriority(3);
52              addProperty("foo", "value");
53          }
54      }
55  
56      public AbstractRuleTest(String name) {
57          super(name);
58      }
59  
60      public void testCreateRV() {
61          MyRule r = new MyRule();
62          r.setRuleSetName("foo");
63          RuleContext ctx = new RuleContext();
64          ctx.setSourceCodeFilename("filename");
65          SimpleNode s = new SimpleNode(1);
66          s.testingOnly__setBeginColumn(5);
67          s.testingOnly__setBeginLine(5);
68          s.setScope(new SourceFileScope("foo"));
69          RuleViolation rv = r.createRuleViolation(ctx, s);
70          assertEquals("Line number mismatch!", 5, rv.getLine());
71          assertEquals("Filename mismatch!", "filename", rv.getFilename());
72          assertEquals("Rule object mismatch!", r, rv.getRule());
73          assertEquals("Rule description mismatch!", "my rule", rv.getDescription());
74          assertEquals("RuleSet name mismatch!", "foo", rv.getRule().getRuleSetName());
75      }
76  
77      public void testCreateRV2() {
78          MyRule r = new MyRule();
79          RuleContext ctx = new RuleContext();
80          ctx.setSourceCodeFilename("filename");
81          SimpleNode s = new SimpleNode(1);
82          s.testingOnly__setBeginColumn(5);
83          s.testingOnly__setBeginLine(5);
84          s.setScope(new SourceFileScope("foo"));
85          RuleViolation rv = r.createRuleViolation(ctx, s, "specificdescription");
86          assertEquals("Line number mismatch!", 5, rv.getLine());
87          assertEquals("Filename mismatch!", "filename", rv.getFilename());
88          assertEquals("Rule object mismatch!", r, rv.getRule());
89          assertEquals("Rule description mismatch!", "specificdescription", rv.getDescription());
90      }
91  
92      public void testRuleExclusion() {
93          MyRule r = new MyRule();
94          RuleContext ctx = new RuleContext();
95          Set s = new HashSet();
96          s.add(new Integer(5));
97          ctx.setReport(new Report());
98          ctx.excludeLines(s);
99          ctx.setSourceCodeFilename("filename");
100         SimpleNode n = new SimpleNode(1);
101         n.testingOnly__setBeginColumn(5);
102         n.testingOnly__setBeginLine(5);
103         n.setScope(new SourceFileScope("foo"));
104         r.createRuleViolation(ctx, n, "specificdescription");
105         assertTrue(ctx.getReport().isEmpty());
106     }
107     
108     public void testEquals1() {
109         MyRule r = new MyRule();
110         assertFalse("A rule is never equals to null!", r.equals(null));
111     }
112     
113     public void testEquals2() {
114         MyRule r = new MyRule();
115         assertEquals("A rule must be equals to itself", r, r);
116     }
117     
118     public void testEquals3() {
119         MyRule r1 = new MyRule();
120         MyRule r2 = new MyRule();
121         assertEquals("2 instances of the same rule are equals", r1, r2);
122         assertEquals("hasCode for 2 instances of the same rule must be equals", r1.hashCode(), r2.hashCode());
123     }
124     
125     public void testEquals4() {
126         MyRule myRule = new MyRule();
127         assertFalse("A rule cannot be equals to an object of another class", myRule.equals("MyRule"));
128     }
129     
130     public void testEquals5() {
131         MyRule myRule = new MyRule();
132         MyOtherRule myOtherRule = new MyOtherRule();
133         assertFalse("2 rules of different classes cannot be equals", myRule.equals(myOtherRule));
134         assertFalse("Rules that are not equals should not have the same hashcode", myRule.hashCode() == myOtherRule.hashCode());
135     }
136     
137     public void testEquals6() {
138         MyRule r1 = new MyRule();
139         MyRule r2 = new MyRule();
140         r2.setName("MyRule2");
141         assertFalse("Rules with different names cannot be equals", r1.equals(r2));
142         assertFalse("Rules that are not equals should not have the same hashcode", r1.hashCode() == r2.hashCode());
143     }
144     
145     public void testEquals7() {
146         MyRule r1 = new MyRule();
147         MyRule r2 = new MyRule();
148         r2.setPriority(1);
149         assertFalse("Rules with different priority cannot be equals", r1.equals(r2));
150         assertFalse("Rules that are not equals should not have the same hashcode", r1.hashCode() == r2.hashCode());
151     }
152     
153     public void testEquals8() {
154         MyRule r1 = new MyRule();
155         r1.addProperty("xpath", "something");
156         MyRule r2 = new MyRule();
157         r2.addProperty("xpath", "something else");
158         assertFalse("Rules with different properties values cannot be equals", r1.equals(r2));
159         assertFalse("Rules that are not equals should not have the same hashcode", r1.hashCode() == r2.hashCode());
160     }
161     
162     public void testEquals9() {
163         MyRule r1 = new MyRule();
164         MyRule r2 = new MyRule();
165         r2.addProperty("xpath", "something else");
166         assertFalse("Rules with different properties cannot be equals", r1.equals(r2));
167         assertFalse("Rules that are not equals should not have the same hashcode", r1.hashCode() == r2.hashCode());
168     }
169     
170     public void testEquals10() {
171         MyRule r1 = new MyRule();
172         MyRule r2 = new MyRule();
173         r2.setMessage("another message");
174         assertTrue("Rules with different message are still equals", r1.equals(r2));
175         assertTrue("Rules that are equals must have the same hashcode", r1.hashCode() == r2.hashCode());
176     }
177 
178 }