/**
* 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.io.IOException;
import java.util.List;
import org.junit.Test;
import net.sourceforge.pmd.PMD;
public class EcmascriptTokenizerTest {
@Test
public void test1() throws IOException {
Tokenizer tokenizer = new EcmascriptTokenizer();
SourceCode sourceCode = new SourceCode(new SourceCode.StringCodeLoader(getCode1()));
Tokens tokens = new Tokens();
tokenizer.tokenize(sourceCode, tokens);
assertEquals(40, tokens.size());
}
@Test
public void test2() throws IOException {
Tokenizer t = new EcmascriptTokenizer();
SourceCode sourceCode = new SourceCode(new SourceCode.StringCodeLoader(getCode2()));
Tokens tokens = new Tokens();
t.tokenize(sourceCode, tokens);
assertEquals(45, tokens.size());
}
/**
* See: https://sourceforge.net/p/pmd/bugs/1239/
*
* @throws IOException
* IO Exception
*/
@Test
public void parseStringNotAsMultiline() throws IOException {
Tokenizer t = new EcmascriptTokenizer();
SourceCode sourceCode = new SourceCode(new SourceCode.StringCodeLoader(
"var s = \"a string \\\n" + "continues\";\n" + "var s = \"a string \\\n" + "continues2\";\n"));
Tokens tokens = new Tokens();
t.tokenize(sourceCode, tokens);
assertEquals(11, tokens.size());
List<TokenEntry> list = tokens.getTokens();
assertEquals("var", list.get(0).getIdentifier(), list.get(5).getIdentifier());
assertEquals("s", list.get(1).getIdentifier(), list.get(6).getIdentifier());
assertEquals("=", list.get(2).getIdentifier(), list.get(7).getIdentifier());
assertEquals("\"a string continues\"", list.get(3).toString());
assertEquals("\"a string continues2\"", list.get(8).toString());
assertFalse(list.get(3).getIdentifier() == list.get(8).getIdentifier());
}
@Test
public void testIgnoreSingleLineComments() throws IOException {
Tokenizer t = new EcmascriptTokenizer();
SourceCode sourceCode = new SourceCode(new SourceCode.StringCodeLoader(
"//This is a single line comment\n" + "var i = 0;\n\n" + "//This is another comment\n" + "i++;"));
Tokens tokens = new Tokens();
t.tokenize(sourceCode, tokens);
assertEquals(9, tokens.size());
List<TokenEntry> list = tokens.getTokens();
assertEquals("var", list.get(0).toString());
assertEquals("++", list.get(6).toString());
}
@Test
public void testIgnoreMultiLineComments() throws IOException {
Tokenizer t = new EcmascriptTokenizer();
SourceCode sourceCode = new SourceCode(new SourceCode.StringCodeLoader("/* This is a multi line comment\n"
+ " * \n" + " */ \n" + "var i = 0;\n\n"
+ "/* This is another multi line comment\n" + " * second line \n"
+ " * third line */\n" + "i++;"));
Tokens tokens = new Tokens();
t.tokenize(sourceCode, tokens);
assertEquals(9, tokens.size());
List<TokenEntry> list = tokens.getTokens();
assertEquals("var", list.get(0).toString());
assertEquals("++", list.get(6).toString());
}
// no semi-colons
private String getCode1() {
StringBuilder sb = new StringBuilder();
sb.append("function switchToRealPassword() {").append(PMD.EOL);
sb.append(" var real = $('realPass')").append(PMD.EOL);
sb.append(" var prompt = $('promptPass')").append(PMD.EOL);
sb.append(" real.style.display = 'inline'").append(PMD.EOL);
sb.append(" prompt.style.display = 'none'").append(PMD.EOL);
sb.append(" real.focus()").append(PMD.EOL);
sb.append("}").append(PMD.EOL);
return sb.toString();
}
// same as getCode1, but lines are ended with semi-colons
private String getCode2() {
StringBuilder sb = new StringBuilder();
sb.append("function switchToRealPassword() {").append(PMD.EOL);
sb.append(" var real = $('realPass');").append(PMD.EOL);
sb.append(" var prompt = $('promptPass');").append(PMD.EOL);
sb.append(" real.style.display = 'inline';").append(PMD.EOL);
sb.append(" prompt.style.display = 'none';").append(PMD.EOL);
sb.append(" real.focus();").append(PMD.EOL);
sb.append("}").append(PMD.EOL);
return sb.toString();
}
@Test
public void testTemplateStrings() throws IOException {
Tokenizer t = new EcmascriptTokenizer();
SourceCode sourceCode = new SourceCode(new SourceCode.StringCodeLoader(
"export default class DrawLocation extends joint.shapes.basic.Generic {" + PMD.EOL
+ " constructor(location: ILocation) {" + PMD.EOL
+ " this.markup = `<g>" + PMD.EOL
+ " <path class=\"location\"/>" + PMD.EOL
+ " <text x=\"0\" y=\"0\" text-anchor=\"middle\" class=\"location-text\"></text>" + PMD.EOL
+ PMD.EOL
+ " <path class=\"location\"/>" + PMD.EOL
+ " <circle class=\"location-circle\"/>" + PMD.EOL
+ " ${drawIndicators.Check.markup}" + PMD.EOL
+ PMD.EOL
+ " </g>`;" + PMD.EOL
+ " }" + PMD.EOL
+ "" + PMD.EOL
+ "}"));
final Tokens tokens = new Tokens();
t.tokenize(sourceCode, tokens);
final String templateString = "`<g>" + PMD.EOL
+ " <path class=\"location\"/>" + PMD.EOL
+ " <text x=\"0\" y=\"0\" text-anchor=\"middle\" class=\"location-text\"></text>" + PMD.EOL
+ PMD.EOL
+ " <path class=\"location\"/>" + PMD.EOL
+ " <circle class=\"location-circle\"/>" + PMD.EOL
+ " ${drawIndicators.Check.markup}" + PMD.EOL
+ PMD.EOL
+ " </g>`";
assertEquals(templateString, tokens.getTokens().get(24).toString());
}
}