1   package test.net.sourceforge.pmd.rules;
2    
3   import static org.junit.Assert.assertEquals;
4   import net.sourceforge.pmd.PMD;
5   import net.sourceforge.pmd.Report;
6   import net.sourceforge.pmd.Rule;
7   import net.sourceforge.pmd.RuleContext;
8   import net.sourceforge.pmd.RuleSet;
9   import net.sourceforge.pmd.RuleViolation;
10  import net.sourceforge.pmd.rules.XPathRule;
11  
12  import org.junit.Before;
13  import org.junit.Test;
14  
15  import test.net.sourceforge.pmd.testframework.RuleTst;
16  
17  import java.io.StringReader;
18   /**
19    * @author daniels
20    */
21   public class XPathRuleTest extends RuleTst {
22   
23       XPathRule rule;
24   
25       @Before
26       public void setUp() {
27           rule = new XPathRule();
28           rule.setMessage("XPath Rule Failed");
29       }
30   
31       @Test
32       public void testPluginname() throws Throwable {
33           Rule rule = new XPathRule();
34           rule.addProperty("xpath", "//VariableDeclaratorId[string-length(@Image) < 3]");
35           rule.setMessage("{0}");
36           rule.addProperty("pluginname", "true");
37           PMD p = new PMD();
38           RuleContext ctx = new RuleContext();
39           Report report = new Report();
40           ctx.setReport(report);
41           ctx.setSourceCodeFilename("n/a");
42           RuleSet rules = new RuleSet();
43           rules.addRule(rule);
44           p.processFile(new StringReader(TEST1), rules, ctx);
45           RuleViolation rv = (RuleViolation) report.iterator().next();
46           assertEquals("a", rv.getDescription());
47       }
48   
49       @Test
50       public void testVariables() throws Throwable {
51           Rule rule = new XPathRule();
52           rule.addProperty("xpath", "//VariableDeclaratorId[@Image=$var]");
53           rule.setMessage("Avoid vars");
54           rule.addProperty("var", "fiddle");
55           PMD p = new PMD();
56           RuleContext ctx = new RuleContext();
57           Report report = new Report();
58           ctx.setReport(report);
59           ctx.setSourceCodeFilename("n/a");
60           RuleSet rules = new RuleSet();
61           rules.addRule(rule);
62           p.processFile(new StringReader(TEST2), rules, ctx);
63           RuleViolation rv = (RuleViolation) report.iterator().next();
64           assertEquals(3, rv.getBeginLine());
65       }
66   
67       private static final String TEST1 =
68               "public class Foo {" + PMD.EOL +
69               " int a;" + PMD.EOL +
70               "}";
71   
72       private static final String TEST2 =
73               "public class Foo {" + PMD.EOL +
74               " int faddle;" + PMD.EOL +
75               " int fiddle;" + PMD.EOL +
76               "}";
77  
78       public static junit.framework.Test suite() {
79           return new junit.framework.JUnit4TestAdapter(XPathRuleTest.class);
80       }
81   }