Merge branch 'pr-1269'

This commit is contained in:
Juan Martín Sotuyo Dodero
2018-08-04 15:14:06 -03:00
4 changed files with 69 additions and 18 deletions

View File

@ -202,12 +202,12 @@ public abstract class RuleTst {
}
List<Integer> expected = test.getExpectedLineNumbers();
if (report.getViolationTree().size() != expected.size()) {
if (report.size() != expected.size()) {
throw new RuntimeException("Test setup error: number of execpted line numbers doesn't match "
+ "number of violations for test case '" + test.getDescription() + "'");
}
Iterator<RuleViolation> it = report.getViolationTree().iterator();
Iterator<RuleViolation> it = report.iterator();
int index = 0;
while (it.hasNext()) {
RuleViolation violation = it.next();

View File

@ -12,27 +12,39 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.RuleContext;
import net.sourceforge.pmd.RuleViolation;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.LanguageVersion;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.rule.ParametricRuleViolation;
import net.sourceforge.pmd.test.lang.ast.DummyNode;
public class RuleTstTest {
private LanguageVersion dummyLanguage = LanguageRegistry.findLanguageByTerseName("dummy").getDefaultVersion();
private Rule rule = mock(Rule.class);
private RuleTst ruleTester = new RuleTst() {
};
@Test
public void shouldCallStartAndEnd() {
RuleTst ruleTester = new RuleTst() {
};
LanguageVersion languageVersion = LanguageRegistry.findLanguageByTerseName("dummy").getDefaultVersion();
Report report = new Report();
Rule rule = mock(Rule.class);
when(rule.getLanguage()).thenReturn(languageVersion.getLanguage());
when(rule.getLanguage()).thenReturn(dummyLanguage.getLanguage());
when(rule.getName()).thenReturn("test rule");
ruleTester.runTestFromString("the code", rule, report, languageVersion, false);
ruleTester.runTestFromString("the code", rule, report, dummyLanguage, false);
verify(rule).start(any(RuleContext.class));
verify(rule).end(any(RuleContext.class));
@ -48,4 +60,40 @@ public class RuleTstTest {
verify(rule).getPropertiesByPropertyDescriptor();
verifyNoMoreInteractions(rule);
}
@Test
public void shouldAssertLinenumbersSorted() {
when(rule.getLanguage()).thenReturn(dummyLanguage.getLanguage());
when(rule.getName()).thenReturn("test rule");
Mockito.doAnswer(new Answer<Void>() {
private RuleViolation createViolation(RuleContext context, int beginLine, String message) {
DummyNode node = new DummyNode(1);
node.testingOnlySetBeginLine(beginLine);
node.testingOnlySetBeginColumn(1);
ParametricRuleViolation<Node> violation = new ParametricRuleViolation<Node>(rule, context, node, message);
return violation;
}
@Override
public Void answer(InvocationOnMock invocation) throws Throwable {
RuleContext context = invocation.getArgumentAt(1, RuleContext.class);
// the violations are reported out of order
context.getReport().addRuleViolation(createViolation(context, 15, "first reported violation"));
context.getReport().addRuleViolation(createViolation(context, 5, "second reported violation"));
return null;
}
}).when(rule).apply(Mockito.anyList(), Mockito.any(RuleContext.class));
TestDescriptor testDescriptor = new TestDescriptor("the code", "sample test", 2, rule, dummyLanguage);
testDescriptor.setReinitializeRule(false);
testDescriptor.setExpectedLineNumbers(Arrays.asList(5, 15));
try {
ruleTester.runTest(testDescriptor);
// there should be no assertion failures
// expected line numbers and actual line numbers match
} catch (AssertionError assertionError) {
Assert.fail(assertionError.toString());
}
}
}