/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.cpd;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.junit.Test;
import net.sourceforge.pmd.PMD;
public class MatchAlgorithmTest {
private static final String LINE_1 = "public class Foo { ";
private static final String LINE_2 = " public void bar() {";
private static final String LINE_3 = " System.out.println(\"hello\");";
private static final String LINE_4 = " System.out.println(\"hello\");";
private static final String LINE_5 = " int i = 5";
private static final String LINE_6 = " System.out.print(\"hello\");";
private static final String LINE_7 = " }";
private static final String LINE_8 = "}";
private static String getSampleCode() {
return LINE_1 + PMD.EOL + LINE_2 + PMD.EOL + LINE_3 + PMD.EOL + LINE_4 + PMD.EOL + LINE_5 + PMD.EOL + LINE_6
+ PMD.EOL + LINE_7 + PMD.EOL + LINE_8;
}
@Test
public void testSimple() {
JavaTokenizer tokenizer = new JavaTokenizer();
SourceCode sourceCode = new SourceCode(new SourceCode.StringCodeLoader(getSampleCode(), "Foo.java"));
Tokens tokens = new Tokens();
TokenEntry.clearImages();
tokenizer.tokenize(sourceCode, tokens);
assertEquals(41, tokens.size());
Map<String, SourceCode> codeMap = new HashMap<>();
codeMap.put("Foo.java", sourceCode);
MatchAlgorithm matchAlgorithm = new MatchAlgorithm(codeMap, tokens, 5);
matchAlgorithm.findMatches();
Iterator<Match> matches = matchAlgorithm.matches();
Match match = matches.next();
assertFalse(matches.hasNext());
Iterator<Mark> marks = match.iterator();
Mark mark1 = marks.next();
Mark mark2 = marks.next();
assertFalse(marks.hasNext());
assertEquals(3, mark1.getBeginLine());
assertEquals("Foo.java", mark1.getFilename());
assertEquals(LINE_3, mark1.getSourceCodeSlice());
assertEquals(4, mark2.getBeginLine());
assertEquals("Foo.java", mark2.getFilename());
assertEquals(LINE_4, mark2.getSourceCodeSlice());
}
@Test
public void testIgnore() {
JavaTokenizer tokenizer = new JavaTokenizer();
tokenizer.setIgnoreLiterals(true);
tokenizer.setIgnoreIdentifiers(true);
SourceCode sourceCode = new SourceCode(new SourceCode.StringCodeLoader(getSampleCode(), "Foo.java"));
Tokens tokens = new Tokens();
TokenEntry.clearImages();
tokenizer.tokenize(sourceCode, tokens);
Map<String, SourceCode> codeMap = new HashMap<>();
codeMap.put("Foo.java", sourceCode);
MatchAlgorithm matchAlgorithm = new MatchAlgorithm(codeMap, tokens, 5);
matchAlgorithm.findMatches();
Iterator<Match> matches = matchAlgorithm.matches();
Match match = matches.next();
assertFalse(matches.hasNext());
Iterator<Mark> marks = match.iterator();
marks.next();
marks.next();
marks.next();
assertFalse(marks.hasNext());
}
}