View Javadoc
1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd.cpd;
5   
6   import static org.junit.Assert.assertEquals;
7   import static org.junit.Assert.assertFalse;
8   
9   import java.io.IOException;
10  import java.util.List;
11  
12  import net.sourceforge.pmd.PMD;
13  
14  import org.junit.Test;
15  
16  public class EcmascriptTokenizerTest {
17  
18      @Test
19      public void test1() throws Throwable {
20          Tokenizer tokenizer = new EcmascriptTokenizer();
21          SourceCode sourceCode = new SourceCode( new SourceCode.StringCodeLoader( getCode1() ) );
22          Tokens tokens = new Tokens();
23          tokenizer.tokenize( sourceCode, tokens );
24          assertEquals( 22, tokens.size() );
25      }
26  
27      @Test
28      public void test2() throws Throwable {
29          Tokenizer t = new EcmascriptTokenizer();
30          SourceCode sourceCode = new SourceCode( new SourceCode.StringCodeLoader( getCode2() ) );
31          Tokens tokens = new Tokens();
32          t.tokenize( sourceCode, tokens );
33          assertEquals( 22, tokens.size() );
34      }
35  
36      /**
37       * See: https://sourceforge.net/p/pmd/bugs/1239/
38       * @throws IOException IO Exception
39       */
40      @Test
41      public void parseStringNotAsMultiline() throws IOException {
42          Tokenizer t = new EcmascriptTokenizer();
43          SourceCode sourceCode = new SourceCode( new SourceCode.StringCodeLoader(
44                    "var s = \"a string \\\n"
45                  + "continues\";\n"
46                  + "var s = \"a string \\\n"
47                  + "continues2\";\n") );
48          Tokens tokens = new Tokens();
49          t.tokenize(sourceCode, tokens);
50          assertEquals(9, tokens.size());
51          List<TokenEntry> list = tokens.getTokens();
52          assertEquals("var", list.get(0).getIdentifier(), list.get(4).getIdentifier());
53          assertEquals("s", list.get(1).getIdentifier(), list.get(5).getIdentifier());
54          assertEquals("=", list.get(2).getIdentifier(), list.get(6).getIdentifier());
55          assertEquals("\"a string continues\"", list.get(3).toString());
56          assertEquals("\"a string continues2\"", list.get(7).toString());
57          assertFalse(list.get(3).getIdentifier() == list.get(7).getIdentifier());
58      }
59  
60      // no semi-colons
61      private String getCode1() {
62          StringBuilder sb = new StringBuilder();
63          sb.append( "function switchToRealPassword() {" ).append(PMD.EOL);
64          sb.append( "   var real = $('realPass')" ).append(PMD.EOL);
65          sb.append( "   var prompt = $('promptPass')" ).append(PMD.EOL);
66          sb.append( "   real.style.display = 'inline'" ).append(PMD.EOL);
67          sb.append( "   prompt.style.display = 'none'" ).append(PMD.EOL);
68          sb.append( "   real.focus()" ).append(PMD.EOL);
69          sb.append( "}" ).append(PMD.EOL);
70          return sb.toString();
71      }
72  
73      // same as getCode1, but lines are ended with semi-colons
74      private String getCode2() {
75          StringBuilder sb = new StringBuilder();
76          sb.append( "function switchToRealPassword() {" ).append(PMD.EOL);
77          sb.append( "   var real = $('realPass');" ).append(PMD.EOL);
78          sb.append( "   var prompt = $('promptPass');" ).append(PMD.EOL);
79          sb.append( "   real.style.display = 'inline';" ).append(PMD.EOL);
80          sb.append( "   prompt.style.display = 'none';" ).append(PMD.EOL);
81          sb.append( "   real.focus();" ).append(PMD.EOL);
82          sb.append( "}" ).append(PMD.EOL);
83          return sb.toString();
84      }
85  }