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