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