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