1 package net.sourceforge.pmd;
2
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertSame;
5
6 import java.util.ArrayList;
7 import java.util.Arrays;
8 import java.util.Collections;
9 import java.util.List;
10 import java.util.Random;
11
12 import junit.framework.JUnit4TestAdapter;
13 import net.sourceforge.pmd.Rule;
14 import net.sourceforge.pmd.RuleContext;
15 import net.sourceforge.pmd.RuleViolation;
16 import net.sourceforge.pmd.RuleViolationComparator;
17 import net.sourceforge.pmd.lang.java.ast.DummyJavaNode;
18 import net.sourceforge.pmd.lang.java.rule.JavaRuleViolation;
19 import net.sourceforge.pmd.lang.java.symboltable.SourceFileScope;
20 import net.sourceforge.pmd.lang.rule.MockRule;
21
22 import org.junit.Test;
23
24 public class RuleViolationComparatorTest {
25
26 @Test
27 public void testComparator() {
28 Rule rule1 = new MockRule("name1", "desc", "msg", "rulesetname1");
29 Rule rule2 = new MockRule("name2", "desc", "msg", "rulesetname2");
30
31
32 RuleViolation[] expectedOrder = new RuleViolation[12];
33
34 int index = 0;
35
36 expectedOrder[index++] = createJavaRuleViolation(rule1, "file1", 10, "desc1", 0, 20, 80);
37 expectedOrder[index++] = createJavaRuleViolation(rule1, "file1", 20, "desc1", 0, 20, 80);
38
39 expectedOrder[index++] = createJavaRuleViolation(rule1, "file2", 10, "desc1", 0, 20, 80);
40 expectedOrder[index++] = createJavaRuleViolation(rule1, "file2", 10, "desc2", 0, 20, 80);
41
42 expectedOrder[index++] = createJavaRuleViolation(rule1, "file3", 10, "desc1", 0, 20, 80);
43 expectedOrder[index++] = createJavaRuleViolation(rule1, "file3", 10, "desc1", 10, 20, 80);
44
45 expectedOrder[index++] = createJavaRuleViolation(rule1, "file4", 10, "desc1", 0, 20, 80);
46 expectedOrder[index++] = createJavaRuleViolation(rule1, "file4", 10, "desc1", 0, 30, 80);
47
48 expectedOrder[index++] = createJavaRuleViolation(rule1, "file5", 10, "desc1", 0, 20, 80);
49 expectedOrder[index++] = createJavaRuleViolation(rule1, "file5", 10, "desc1", 0, 20, 90);
50
51 expectedOrder[index++] = createJavaRuleViolation(rule1, "file6", 10, "desc1", 0, 20, 80);
52 expectedOrder[index++] = createJavaRuleViolation(rule2, "file6", 10, "desc1", 0, 20, 80);
53
54
55 List<RuleViolation> ruleViolations = new ArrayList<RuleViolation>(Arrays.asList(expectedOrder));
56 long seed = System.nanoTime();
57 Random random = new Random(seed);
58 Collections.shuffle(ruleViolations, random);
59
60
61 Collections.sort(ruleViolations, RuleViolationComparator.INSTANCE);
62
63
64 int count = 0;
65 for (int i = 0; i < expectedOrder.length; i++) {
66 count++;
67 assertSame("Wrong RuleViolation " + i + ", usind seed: " + seed, expectedOrder[i], ruleViolations.get(i));
68 }
69 assertEquals("Missing assertion for every RuleViolation", expectedOrder.length, count);
70 }
71
72 private RuleViolation createJavaRuleViolation(Rule rule, String fileName, int beginLine, String description,
73 int beginColumn, int endLine, int endColumn) {
74 RuleContext ruleContext = new RuleContext();
75 ruleContext.setSourceCodeFilename(fileName);
76 DummyJavaNode simpleNode = new DummyJavaNode(1);
77 simpleNode.setScope(new SourceFileScope(fileName));
78 simpleNode.testingOnly__setBeginLine(beginLine);
79 simpleNode.testingOnly__setBeginColumn(beginColumn);
80 simpleNode.testingOnly__setEndLine(endLine);
81 simpleNode.testingOnly__setEndColumn(endColumn);
82 RuleViolation ruleViolation = new JavaRuleViolation(rule, ruleContext, simpleNode, description);
83 return ruleViolation;
84 }
85
86 public static junit.framework.Test suite() {
87 return new JUnit4TestAdapter(RuleViolationComparatorTest.class);
88 }
89 }