/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import net.sourceforge.pmd.lang.DummyLanguageModule;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.ast.DummyNode;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.rule.AbstractRule;
import net.sourceforge.pmd.lang.rule.ParametricRuleViolation;
import net.sourceforge.pmd.lang.rule.properties.IntegerProperty;
import net.sourceforge.pmd.lang.rule.properties.StringProperty;
public class AbstractRuleTest {
private static class MyRule extends AbstractRule {
private static final StringProperty FOO_PROPERTY = new StringProperty("foo", "foo property", "x", 1.0f);
private static final StringProperty XPATH_PROPERTY = new StringProperty("xpath", "xpath property", "", 2.0f);
MyRule() {
definePropertyDescriptor(FOO_PROPERTY);
definePropertyDescriptor(XPATH_PROPERTY);
setName("MyRule");
setMessage("my rule msg");
setPriority(RulePriority.MEDIUM);
setProperty(FOO_PROPERTY, "value");
}
@Override
public void apply(List<? extends Node> nodes, RuleContext ctx) {
}
}
private static class MyOtherRule extends AbstractRule {
private static final PropertyDescriptor FOO_PROPERTY = new StringProperty("foo", "foo property", "x", 1.0f);
MyOtherRule() {
definePropertyDescriptor(FOO_PROPERTY);
setName("MyOtherRule");
setMessage("my other rule");
setPriority(RulePriority.MEDIUM);
setProperty(FOO_PROPERTY, "value");
}
@Override
public void apply(List<? extends Node> nodes, RuleContext ctx) {
}
}
@Test
public void testCreateRV() {
MyRule r = new MyRule();
r.setRuleSetName("foo");
RuleContext ctx = new RuleContext();
ctx.setSourceCodeFilename("filename");
DummyNode s = new DummyNode(1);
s.testingOnlySetBeginColumn(5);
s.testingOnlySetBeginLine(5);
RuleViolation rv = new ParametricRuleViolation(r, ctx, s, r.getMessage());
assertEquals("Line number mismatch!", 5, rv.getBeginLine());
assertEquals("Filename mismatch!", "filename", rv.getFilename());
assertEquals("Rule object mismatch!", r, rv.getRule());
assertEquals("Rule msg mismatch!", "my rule msg", rv.getDescription());
assertEquals("RuleSet name mismatch!", "foo", rv.getRule().getRuleSetName());
}
@Test
public void testCreateRV2() {
MyRule r = new MyRule();
RuleContext ctx = new RuleContext();
ctx.setSourceCodeFilename("filename");
DummyNode s = new DummyNode(1);
s.testingOnlySetBeginColumn(5);
s.testingOnlySetBeginLine(5);
RuleViolation rv = new ParametricRuleViolation(r, ctx, s, "specificdescription");
assertEquals("Line number mismatch!", 5, rv.getBeginLine());
assertEquals("Filename mismatch!", "filename", rv.getFilename());
assertEquals("Rule object mismatch!", r, rv.getRule());
assertEquals("Rule description mismatch!", "specificdescription", rv.getDescription());
}
@Test
public void testRuleWithVariableInMessage() {
MyRule r = new MyRule();
r.definePropertyDescriptor(new IntegerProperty("testInt", "description", 0, 100, 10, 0));
r.setMessage("Message ${packageName} ${className} ${methodName} ${variableName} ${testInt} ${noSuchProperty}");
RuleContext ctx = new RuleContext();
ctx.setLanguageVersion(LanguageRegistry.getLanguage(DummyLanguageModule.NAME).getDefaultVersion());
ctx.setReport(new Report());
ctx.setSourceCodeFilename("filename");
DummyNode s = new DummyNode(1);
s.testingOnlySetBeginColumn(5);
s.testingOnlySetBeginLine(5);
s.setImage("TestImage");
r.addViolation(ctx, s);
RuleViolation rv = ctx.getReport().getViolationTree().iterator().next();
assertEquals("Message foo 10 ${noSuchProperty}", rv.getDescription());
}
@Test
public void testRuleSuppress() {
MyRule r = new MyRule();
RuleContext ctx = new RuleContext();
Map<Integer, String> m = new HashMap<>();
m.put(Integer.valueOf(5), "");
ctx.setReport(new Report());
ctx.getReport().suppress(m);
ctx.setSourceCodeFilename("filename");
DummyNode n = new DummyNode(1);
n.testingOnlySetBeginColumn(5);
n.testingOnlySetBeginLine(5);
RuleViolation rv = new ParametricRuleViolation(r, ctx, n, "specificdescription");
ctx.getReport().addRuleViolation(rv);
assertTrue(ctx.getReport().isEmpty());
}
@Test
public void testEquals1() {
MyRule r = new MyRule();
assertFalse("A rule is never equals to null!", r.equals(null));
}
@Test
public void testEquals2() {
MyRule r = new MyRule();
assertEquals("A rule must be equals to itself", r, r);
}
@Test
public void testEquals3() {
MyRule r1 = new MyRule();
MyRule r2 = new MyRule();
assertEquals("Two instances of the same rule are equal", r1, r2);
assertEquals("Hashcode for two instances of the same rule must be equal", r1.hashCode(), r2.hashCode());
}
@Test
public void testEquals4() {
MyRule myRule = new MyRule();
assertFalse("A rule cannot be equal to an object of another class", myRule.equals("MyRule"));
}
@Test
public void testEquals5() {
MyRule myRule = new MyRule();
MyOtherRule myOtherRule = new MyOtherRule();
assertFalse("Two rules from different classes cannot be equal", myRule.equals(myOtherRule));
}
@Test
public void testEquals6() {
MyRule r1 = new MyRule();
MyRule r2 = new MyRule();
r2.setName("MyRule2");
assertFalse("Rules with different names cannot be equal", r1.equals(r2));
}
@Test
public void testEquals7() {
MyRule r1 = new MyRule();
MyRule r2 = new MyRule();
r2.setPriority(RulePriority.HIGH);
assertFalse("Rules with different priority levels cannot be equal", r1.equals(r2));
}
@Test
public void testEquals8() {
MyRule r1 = new MyRule();
r1.setProperty(MyRule.XPATH_PROPERTY, "something");
MyRule r2 = new MyRule();
r2.setProperty(MyRule.XPATH_PROPERTY, "something else");
assertFalse("Rules with different properties values cannot be equal", r1.equals(r2));
}
@Test
public void testEquals9() {
MyRule r1 = new MyRule();
MyRule r2 = new MyRule();
r2.setProperty(MyRule.XPATH_PROPERTY, "something else");
assertFalse("Rules with different properties cannot be equal", r1.equals(r2));
}
@Test
public void testEquals10() {
MyRule r1 = new MyRule();
MyRule r2 = new MyRule();
r2.setMessage("another message");
assertEquals("Rules with different messages are still equal", r1, r2);
assertEquals("Rules that are equal must have the an equal hashcode", r1.hashCode(), r2.hashCode());
}
public static junit.framework.Test suite() {
return new junit.framework.JUnit4TestAdapter(AbstractRuleTest.class);
}
}