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.io.StringReader;
16  import java.util.HashMap;
17  import java.util.Iterator;
18  import java.util.Map;
19  
20  public class MatchAlgorithmTest extends TestCase {
21  
22      public static final String LINE_1 = "public class Foo { ";
23      public static final String LINE_2 = " public void bar() {";
24      public static final String LINE_3 = "  System.out.println(\"hello\");";
25      public static final String LINE_4 = "  System.out.println(\"hello\");";
26      public static final String LINE_5 = " }";
27      public static final String LINE_6 = "}";
28  
29      public static String getSampleCode() {
30          return
31              LINE_1 + PMD.EOL +
32              LINE_2 + PMD.EOL +
33              LINE_3 + PMD.EOL +
34              LINE_4 + PMD.EOL +
35              LINE_5 + PMD.EOL +
36              LINE_6;
37      }
38  
39      public void testSimple() throws Throwable {
40          String code = getSampleCode();
41          JavaTokenizer tokenizer = new JavaTokenizer();
42          SourceCode sourceCode = new SourceCode("Foo.java");
43          Tokens tokens = new Tokens();
44          TokenEntry.clearImages();
45          sourceCode.readSource(new StringReader(code));
46          tokenizer.tokenize(sourceCode, tokens);
47          assertEquals(29, tokens.size());
48          Map codeMap = new HashMap();
49          codeMap.put("Foo.java", sourceCode);
50  
51          MatchAlgorithm matchAlgorithm = new MatchAlgorithm(codeMap, tokens, 5);
52          matchAlgorithm.findMatches();
53          Iterator matches = matchAlgorithm.matches();
54          Match match = (Match)matches.next();
55          assertFalse(matches.hasNext());
56  
57          Iterator marks = match.iterator();
58          TokenEntry mark1 = (TokenEntry)marks.next();
59          TokenEntry mark2 = (TokenEntry)marks.next();
60          assertTrue(!marks.hasNext());
61  
62          assertEquals(3, mark1.getBeginLine());
63          assertEquals(4, mark2.getBeginLine());
64          assertTrue("Foo.java" == mark1.getTokenSrcID() && "Foo.java" == mark2.getTokenSrcID());
65          assertEquals(LINE_3, match.getSourceCodeSlice());
66      }
67  }