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.Collection; 37 import java.util.HashSet; 38 import java.util.Iterator; 39 import java.util.List; 40 import java.util.Set; 41 42 public class RuleSetTest extends TestCase { 43 44 private String javaCode = "public class Test { }"; 45 46 public void testNoDFA() { 47 RuleSet rs = new RuleSet(); 48 MockRule mock = new MockRule("name", "desc", "msg", "rulesetname"); 49 rs.addRule(mock); 50 assertFalse(rs.usesDFA()); 51 } 52 53 public void testIncludesRuleWithDFA() { 54 RuleSet rs = new RuleSet(); 55 MockRule mock = new MockRule("name", "desc", "msg", "rulesetname"); 56 mock.setUsesDFA(); 57 rs.addRule(mock); 58 assertTrue(rs.usesDFA()); 59 } 60 61 public void testAccessors() { 62 RuleSet rs = new RuleSet(); 63 rs.setName("foo"); 64 assertEquals("name mismatch", "foo", rs.getName()); 65 rs.setDescription("bar"); 66 assertEquals("description mismatch", "bar", rs.getDescription()); 67 } 68 69 public void testGetRuleByName() { 70 RuleSet rs = new RuleSet(); 71 MockRule mock = new MockRule("name", "desc", "msg", "rulesetname"); 72 rs.addRule(mock); 73 assertEquals("unable to fetch rule by name", mock, rs.getRuleByName("name")); 74 } 75 76 public void testGetRuleByName2() { 77 RuleSet rs = new RuleSet(); 78 MockRule mock = new MockRule("name", "desc", "msg", "rulesetname"); 79 rs.addRule(mock); 80 assertNull("the rule FooRule must not be found!", rs.getRuleByName("FooRule")); 81 } 82 83 public void testRuleList() { 84 RuleSet IUT = new RuleSet(); 85 86 assertEquals("Size of RuleSet isn't zero.", 0, IUT.size()); 87 88 MockRule rule = new MockRule("name", "desc", "msg", "rulesetname"); 89 IUT.addRule(rule); 90 91 assertEquals("Size of RuleSet isn't one.", 1, IUT.size()); 92 93 Collection rules = IUT.getRules(); 94 95 Iterator i = rules.iterator(); 96 assertTrue("Empty Set", i.hasNext()); 97 assertEquals("Returned set of wrong size.", 1, rules.size()); 98 assertEquals("Rule isn't in ruleset.", rule, i.next()); 99 } 100 101 public void testAddRuleSet() { 102 RuleSet set1 = new RuleSet(); 103 set1.addRule(new MockRule("name", "desc", "msg", "rulesetname")); 104 RuleSet set2 = new RuleSet(); 105 set2.addRule(new MockRule("name2", "desc", "msg", "rulesetname")); 106 set1.addRuleSet(set2); 107 assertEquals("ruleset size wrong", 2, set1.size()); 108 } 109 110 public void testApply0Rules() throws Throwable { 111 RuleSet IUT = new RuleSet(); 112 verifyRuleSet(IUT, 0, new HashSet()); 113 } 114 115 public void testEquals1() { 116 RuleSet s = new RuleSet(); 117 assertFalse("A ruleset cannot be equals to null", s.equals(null)); 118 } 119 120 public void testEquals2() { 121 RuleSet s = new RuleSet(); 122 assertTrue("A rulset must be equals to itself", s.equals(s)); 123 } 124 125 public void testEquals3() { 126 RuleSet s = new RuleSet(); 127 s.setName("basic rules"); 128 assertFalse("A ruleset cannot be equals to another kind of object", s.equals("basic rules")); 129 } 130 131 public void testEquals4() { 132 RuleSet s1 = new RuleSet(); 133 s1.setName("my ruleset"); 134 s1.addRule(new MockRule("name", "desc", "msg", "rulesetname")); 135 136 RuleSet s2 = new RuleSet(); 137 s2.setName("my ruleset"); 138 s2.addRule(new MockRule("name", "desc", "msg", "rulesetname")); 139 140 assertEquals("2 rulesets with same name and rules must be equals", s1, s2); 141 assertEquals("Equals rulesets must have the same hashcode", s1.hashCode(), s2.hashCode()); 142 } 143 144 public void testEquals5() { 145 RuleSet s1 = new RuleSet(); 146 s1.setName("my ruleset"); 147 s1.addRule(new MockRule("name", "desc", "msg", "rulesetname")); 148 149 RuleSet s2 = new RuleSet(); 150 s2.setName("my other ruleset"); 151 s2.addRule(new MockRule("name", "desc", "msg", "rulesetname")); 152 153 assertFalse("2 rulesets with different name but same rules must not be equals", s1.equals(s2)); 154 assertFalse("Rulesets that are not equals should not have the same hashcode", s1.hashCode() == s2.hashCode()); 155 } 156 157 public void testEquals6() { 158 RuleSet s1 = new RuleSet(); 159 s1.setName("my ruleset"); 160 s1.addRule(new MockRule("name", "desc", "msg", "rulesetname")); 161 162 RuleSet s2 = new RuleSet(); 163 s2.setName("my ruleset"); 164 s2.addRule(new MockRule("other rule", "desc", "msg", "rulesetname")); 165 166 assertFalse("2 rulesets with same name but different rules must not be equals", s1.equals(s2)); 167 assertFalse("Rulesets that are not equals should not have the same hashcode", s1.hashCode() == s2.hashCode()); 168 } 169 170 protected void verifyRuleSet(RuleSet IUT, int size, Set values) throws Throwable { 171 172 RuleContext context = new RuleContext(); 173 Set reportedValues = new HashSet(); 174 context.setReport(new Report()); 175 IUT.apply(makeCompilationUnits(), context); 176 177 assertEquals("Invalid number of Violations Reported", size, context.getReport().size()); 178 179 Iterator violations = context.getReport().iterator(); 180 while (violations.hasNext()) { 181 RuleViolation violation = (RuleViolation) violations.next(); 182 183 reportedValues.add(violation); 184 assertTrue("Unexpected Violation Returned: " + violation, values.contains(violation)); 185 } 186 187 Iterator expected = values.iterator(); 188 while (expected.hasNext()) { 189 RuleViolation violation = (RuleViolation) expected.next(); 190 assertTrue("Expected Violation not Returned: " + violation, reportedValues.contains(violation)); 191 } 192 } 193 194 195 protected List makeCompilationUnits() throws Throwable { 196 List RC = new ArrayList(); 197 JavaParser parser = (new TargetJDK1_4()).createParser(new StringReader(javaCode)); 198 RC.add(parser.CompilationUnit()); 199 return RC; 200 } 201 }