/**
* 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.assertNotEquals;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
public class CsTokenizerTest {
private CsTokenizer tokenizer;
private Tokens tokens;
@Before
public void init() {
tokenizer = new CsTokenizer();
tokens = new Tokens();
TokenEntry.clearImages();
}
@Test
public void testSimpleClass() {
tokenizer.tokenize(toSourceCode("class Foo {}"), tokens);
assertEquals(5, tokens.size());
}
@Test
public void testSimpleClassDuplicatedTokens() {
tokenizer.tokenize(toSourceCode("class Foo { class Foo { } }"), tokens);
assertEquals(9, tokens.size());
List<TokenEntry> tokenList = tokens.getTokens();
assertEquals(tokenList.get(0).getIdentifier(), tokenList.get(3).getIdentifier());
assertEquals(tokenList.get(1).getIdentifier(), tokenList.get(4).getIdentifier());
assertEquals(tokenList.get(2).getIdentifier(), tokenList.get(5).getIdentifier());
assertEquals(tokenList.get(6).getIdentifier(), tokenList.get(7).getIdentifier());
}
@Test
public void testSimpleClassMethodMultipleLines() {
tokenizer.tokenize(toSourceCode("class Foo {\n" + " public String foo(int a) {\n" + " int i = a;\n"
+ " return \"x\" + a;\n" + " }\n" + "}"), tokens);
assertEquals(22, tokens.size());
List<TokenEntry> tokenList = tokens.getTokens();
assertEquals(1, tokenList.get(0).getBeginLine());
assertEquals(2, tokenList.get(4).getBeginLine());
assertEquals(3, tokenList.get(11).getBeginLine());
}
@Test
public void testStrings() {
tokenizer.tokenize(toSourceCode("String s =\"aaa \\\"b\\n\";"), tokens);
assertEquals(5, tokens.size());
}
@Test
public void testOpenString() {
tokenizer.tokenize(toSourceCode("String s =\"aaa \\\"b\\"), tokens);
assertEquals(5, tokens.size());
}
@Test
public void testCommentsIgnored1() {
tokenizer.tokenize(toSourceCode("class Foo { /* class * ** X */ }"), tokens);
assertEquals(5, tokens.size());
}
@Test
public void testCommentsIgnored2() {
tokenizer.tokenize(toSourceCode("class Foo { // class X /* aaa */ \n }"), tokens);
assertEquals(5, tokens.size());
}
@Test
public void testCommentsIgnored3() {
tokenizer.tokenize(toSourceCode("class Foo { /// class X /* aaa */ \n }"), tokens);
assertEquals(5, tokens.size());
}
@Test
public void testMoreTokens() {
tokenizer
.tokenize(
toSourceCode("class Foo {\n" + " void bar() {\n" + " int a = 1 >> 2; \n" + " a += 1; \n"
+ " a++; \n" + " a /= 3e2; \n" + " float f = -3.1; \n" + " f *= 2; \n"
+ " bool b = ! (f == 2.0 || f >= 1.0 && f <= 2.0) \n" + " }\n" + "}"),
tokens);
assertEquals(50, tokens.size());
}
@Test
public void testLineNumberAfterMultilineComment() {
tokenizer
.tokenize(
toSourceCode("/* This is a multiline comment \n" + " * \n" + " * Lorem ipsum dolor sit amet, \n"
+ " * consectetur adipiscing elit \n" + " */\n" + "\n" + "class Foo {\n" + "\n" + "}"),
tokens);
assertEquals(5, tokens.size());
assertEquals(7, tokens.getTokens().get(0).getBeginLine());
}
@Test
public void testLineNumberAfterMultilineString() {
tokenizer.tokenize(toSourceCode(
"class Foo {\n" + " void bar() {\n" + " String query = \n" + " @\"SELECT foo, bar\n"
+ " FROM table \n" + " WHERE id = 42\"; \n" + " }\n" + "}"),
tokens);
assertEquals(16, tokens.size());
assertEquals(8, tokens.getTokens().get(14).getBeginLine());
}
@Test
public void testIgnoreUsingDirectives() {
tokenizer.setIgnoreUsings(true);
tokenizer.tokenize(toSourceCode("using System.Text;\n"), tokens);
assertNotEquals("using", tokens.getTokens().get(0).toString());
assertEquals(2, tokens.size());
}
@Test
public void testUsingStatementsAreNotIgnored() {
tokenizer.setIgnoreUsings(true);
tokenizer.tokenize(toSourceCode(
"using (Font font1 = new Font(\"Arial\", 10.0f)) {\n" + " byte charset = font1.GdiCharSet;\n" + "}\n"),
tokens);
assertEquals("using", tokens.getTokens().get(0).toString());
}
private SourceCode toSourceCode(String source) {
return new SourceCode(new SourceCode.StringCodeLoader(source));
}
}