/** * 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.assertSame; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Random; import org.junit.Test; import net.sourceforge.pmd.lang.ast.DummyNode; import net.sourceforge.pmd.lang.ast.Node; import net.sourceforge.pmd.lang.rule.MockRule; import net.sourceforge.pmd.lang.rule.ParametricRuleViolation; import junit.framework.JUnit4TestAdapter; public class RuleViolationComparatorTest { @Test public void testComparator() { Rule rule1 = new MockRule("name1", "desc", "msg", "rulesetname1"); Rule rule2 = new MockRule("name2", "desc", "msg", "rulesetname2"); // RuleViolations created in pre-sorted order RuleViolation[] expectedOrder = new RuleViolation[12]; int index = 0; // Different begin line expectedOrder[index++] = createJavaRuleViolation(rule1, "file1", 10, "desc1", 0, 20, 80); expectedOrder[index++] = createJavaRuleViolation(rule1, "file1", 20, "desc1", 0, 20, 80); // Different description expectedOrder[index++] = createJavaRuleViolation(rule1, "file2", 10, "desc1", 0, 20, 80); expectedOrder[index++] = createJavaRuleViolation(rule1, "file2", 10, "desc2", 0, 20, 80); // Different begin column expectedOrder[index++] = createJavaRuleViolation(rule1, "file3", 10, "desc1", 0, 20, 80); expectedOrder[index++] = createJavaRuleViolation(rule1, "file3", 10, "desc1", 10, 20, 80); // Different end line expectedOrder[index++] = createJavaRuleViolation(rule1, "file4", 10, "desc1", 0, 20, 80); expectedOrder[index++] = createJavaRuleViolation(rule1, "file4", 10, "desc1", 0, 30, 80); // Different end column expectedOrder[index++] = createJavaRuleViolation(rule1, "file5", 10, "desc1", 0, 20, 80); expectedOrder[index++] = createJavaRuleViolation(rule1, "file5", 10, "desc1", 0, 20, 90); // Different rule name expectedOrder[index++] = createJavaRuleViolation(rule1, "file6", 10, "desc1", 0, 20, 80); expectedOrder[index++] = createJavaRuleViolation(rule2, "file6", 10, "desc1", 0, 20, 80); // Randomize List<RuleViolation> ruleViolations = new ArrayList<>(Arrays.asList(expectedOrder)); long seed = System.nanoTime(); Random random = new Random(seed); Collections.shuffle(ruleViolations, random); // Sort Collections.sort(ruleViolations, RuleViolationComparator.INSTANCE); // Check int count = 0; for (int i = 0; i < expectedOrder.length; i++) { count++; assertSame("Wrong RuleViolation " + i + ", usind seed: " + seed, expectedOrder[i], ruleViolations.get(i)); } assertEquals("Missing assertion for every RuleViolation", expectedOrder.length, count); } private RuleViolation createJavaRuleViolation(Rule rule, String fileName, int beginLine, String description, int beginColumn, int endLine, int endColumn) { RuleContext ruleContext = new RuleContext(); ruleContext.setSourceCodeFilename(fileName); DummyNode simpleNode = new DummyNode(1); simpleNode.testingOnlySetBeginLine(beginLine); simpleNode.testingOnlySetBeginColumn(beginColumn); simpleNode.testingOnlySetEndLine(endLine); simpleNode.testingOnlySetEndColumn(endColumn); RuleViolation ruleViolation = new ParametricRuleViolation<Node>(rule, ruleContext, simpleNode, description); return ruleViolation; } public static junit.framework.Test suite() { return new JUnit4TestAdapter(RuleViolationComparatorTest.class); } }