1   /***
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package test.net.sourceforge.pmd.cpd;
5   
6   import junit.framework.TestCase;
7   import net.sourceforge.pmd.PMD;
8   import net.sourceforge.pmd.cpd.JavaTokenizer;
9   import net.sourceforge.pmd.cpd.Match;
10  import net.sourceforge.pmd.cpd.MatchAlgorithm;
11  import net.sourceforge.pmd.cpd.SourceCode;
12  import net.sourceforge.pmd.cpd.TokenEntry;
13  import net.sourceforge.pmd.cpd.Tokens;
14  
15  import java.util.HashMap;
16  import java.util.Iterator;
17  import java.util.Map;
18  
19  public class MatchAlgorithmTest extends TestCase {
20  
21      public static final String LINE_1 = "public class Foo { ";
22      public static final String LINE_2 = " public void bar() {";
23      public static final String LINE_3 = "  System.out.println(\"hello\");";
24      public static final String LINE_4 = "  System.out.println(\"hello\");";
25      public static final String LINE_5 = "  int i = 5";
26      public static final String LINE_6 = "  System.out.print(\"hello\");";
27      public static final String LINE_7 = " }";
28      public static final String LINE_8 = "}";
29  
30      public static String getSampleCode() {
31          return
32                  LINE_1 + PMD.EOL +
33                  LINE_2 + PMD.EOL +
34                  LINE_3 + PMD.EOL +
35                  LINE_4 + PMD.EOL +
36                  LINE_5 + PMD.EOL +
37                  LINE_6 + PMD.EOL +
38                  LINE_7 + PMD.EOL +
39                  LINE_8;
40      }
41  
42      public void testSimple() throws Throwable {
43          JavaTokenizer tokenizer = new JavaTokenizer();
44          SourceCode sourceCode = new SourceCode(new SourceCode.StringCodeLoader(getSampleCode(), "Foo.java"));
45          Tokens tokens = new Tokens();
46          TokenEntry.clearImages();
47          tokenizer.tokenize(sourceCode, tokens);
48          assertEquals(41, tokens.size());
49          Map codeMap = new HashMap();
50          codeMap.put("Foo.java", sourceCode);
51  
52          MatchAlgorithm matchAlgorithm = new MatchAlgorithm(codeMap, tokens, 5);
53          matchAlgorithm.findMatches();
54          Iterator matches = matchAlgorithm.matches();
55          Match match = (Match) matches.next();
56          assertFalse(matches.hasNext());
57  
58          Iterator marks = match.iterator();
59          TokenEntry mark1 = (TokenEntry) marks.next();
60          TokenEntry mark2 = (TokenEntry) marks.next();
61          assertFalse(marks.hasNext());
62  
63          assertEquals(3, mark1.getBeginLine());
64          assertEquals(4, mark2.getBeginLine());
65          assertTrue("Foo.java" == mark1.getTokenSrcID() && "Foo.java" == mark2.getTokenSrcID());
66          assertEquals(LINE_3, match.getSourceCodeSlice());
67      }
68  
69      public void testIgnore() throws Throwable {
70          JavaTokenizer tokenizer = new JavaTokenizer();
71          tokenizer.setIgnoreLiterals(true);
72          tokenizer.setIgnoreIdentifiers(true);
73          SourceCode sourceCode = new SourceCode(new SourceCode.StringCodeLoader(getSampleCode(), "Foo.java"));
74          Tokens tokens = new Tokens();
75          TokenEntry.clearImages();
76          tokenizer.tokenize(sourceCode, tokens);
77          Map codeMap = new HashMap();
78          codeMap.put("Foo.java", sourceCode);
79  
80          MatchAlgorithm matchAlgorithm = new MatchAlgorithm(codeMap, tokens, 5);
81          matchAlgorithm.findMatches();
82          Iterator matches = matchAlgorithm.matches();
83          Match match = (Match) matches.next();
84          assertFalse(matches.hasNext());
85  
86          Iterator marks = match.iterator();
87          marks.next();
88          marks.next();
89          marks.next();
90          assertFalse(marks.hasNext());
91      }
92  }