View Javadoc

1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package net.sourceforge.pmd.symboltable;
5   
6   import static org.junit.Assert.assertEquals;
7   import static org.junit.Assert.assertFalse;
8   import static org.junit.Assert.assertTrue;
9   import net.sourceforge.pmd.PMD;
10  import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
11  import net.sourceforge.pmd.lang.java.symboltable.NameFinder;
12  import net.sourceforge.pmd.lang.java.symboltable.NameOccurrence;
13  
14  import org.junit.Test;
15  
16  import java.util.List;
17  public class NameOccurrencesTest extends STBBaseTst {
18  
19      @Test
20      public void testSuper() {
21          parseCode(TEST1);
22          List<ASTPrimaryExpression> nodes = acu.findDescendantsOfType(ASTPrimaryExpression.class);
23          NameFinder occs = new NameFinder(nodes.get(0));
24          assertEquals("super", occs.getNames().get(0).getImage());
25      }
26  
27      @Test
28      public void testThis() {
29          parseCode(TEST2);
30          List<ASTPrimaryExpression> nodes = acu.findDescendantsOfType(ASTPrimaryExpression.class);
31          NameFinder occs = new NameFinder(nodes.get(0));
32          assertEquals("this", occs.getNames().get(0).getImage());
33          assertEquals("x", occs.getNames().get(1).getImage());
34      }
35  
36      @Test
37      public void testNameLinkage() {
38          parseCode(TEST2);
39          List<ASTPrimaryExpression> nodes = acu.findDescendantsOfType(ASTPrimaryExpression.class);
40          NameFinder occs = new NameFinder(nodes.get(0));
41          NameOccurrence thisNameOccurrence = occs.getNames().get(0);
42          assertEquals(thisNameOccurrence.getNameForWhichThisIsAQualifier(), occs.getNames().get(1));
43      }
44  
45      @Test
46      public void testSimpleVariableOccurrence() {
47          parseCode(TEST3);
48          List<ASTPrimaryExpression> nodes = acu.findDescendantsOfType(ASTPrimaryExpression.class);
49          NameFinder occs = new NameFinder(nodes.get(0));
50          assertEquals("x", occs.getNames().get(0).getImage());
51          assertFalse(occs.getNames().get(0).isThisOrSuper());
52          assertFalse(occs.getNames().get(0).isMethodOrConstructorInvocation());
53          assertTrue(occs.getNames().get(0).isOnLeftHandSide());
54      }
55  
56      @Test
57      public void testQualifiedOccurrence() {
58          parseCode(TEST4);
59          List<ASTPrimaryExpression> nodes = acu.findDescendantsOfType(ASTPrimaryExpression.class);
60          NameFinder occs = new NameFinder(nodes.get(0));
61          assertEquals("b", occs.getNames().get(0).getImage());
62          assertEquals("x", occs.getNames().get(1).getImage());
63      }
64      
65      @Test
66      public void testIsSelfAssignment(){
67          parseCode(TEST5);
68          List<ASTPrimaryExpression> nodes = acu.findDescendantsOfType(ASTPrimaryExpression.class);
69          NameFinder occs = new NameFinder(nodes.get(2));
70          assertTrue(occs.getNames().get(0).isSelfAssignment());
71  
72          parseCode(TEST6);
73          nodes = acu.findDescendantsOfType(ASTPrimaryExpression.class);
74          occs = new NameFinder(nodes.get(2));
75          assertTrue(occs.getNames().get(0).isSelfAssignment());
76      }
77  
78      @Test
79      public void testEnumStaticUsage() {
80  	parseCode(TEST_ENUM);
81  	List<ASTPrimaryExpression> nodes = acu.findDescendantsOfType(ASTPrimaryExpression.class);
82  
83  	NameFinder occs = new NameFinder(nodes.get(4));
84  	List<NameOccurrence> names = occs.getNames();
85  	assertEquals(3, names.size());
86  	assertEquals("myEnum", names.get(0).getImage());
87  	assertFalse(names.get(0).isMethodOrConstructorInvocation());
88  	assertEquals("desc", names.get(1).getImage());
89  	assertFalse(names.get(1).isMethodOrConstructorInvocation());
90  	assertEquals("equals", names.get(2).getImage());
91  	assertTrue(names.get(2).isMethodOrConstructorInvocation());
92      }
93  
94      public static final String TEST1 =
95              "public class Foo {" + PMD.EOL +
96              " void foo() {" + PMD.EOL +
97              "  super.x = 2;" + PMD.EOL +
98              " }" + PMD.EOL +
99              "}";
100 
101     public static final String TEST2 =
102             "public class Foo {" + PMD.EOL +
103             " void foo() {" + PMD.EOL +
104             "  this.x = 2;" + PMD.EOL +
105             " }" + PMD.EOL +
106             "}";
107 
108     public static final String TEST3 =
109             "public class Foo {" + PMD.EOL +
110             " void foo() {" + PMD.EOL +
111             "  x = 2;" + PMD.EOL +
112             " }" + PMD.EOL +
113             "}";
114 
115     public static final String TEST4 =
116             "public class Foo {" + PMD.EOL +
117             " void foo() {" + PMD.EOL +
118             "  b.x = 2;" + PMD.EOL +
119             " }" + PMD.EOL +
120             "}";
121 
122     public static final String TEST5 =
123         "public class Foo{" + PMD.EOL +
124         "    private int counter;" + PMD.EOL +
125         "    private Foo(){" + PMD.EOL +
126         "        counter = 0;" + PMD.EOL +
127         "    }" + PMD.EOL +
128         "    private int foo(){" + PMD.EOL +
129         "        if (++counter < 3) {" + PMD.EOL +
130         "            return 0;" + PMD.EOL +
131         "        }" + PMD.EOL +
132         "        return 1;" + PMD.EOL +
133         "    }" + PMD.EOL +
134         "}";
135     
136     public static final String TEST6 =
137         "public class Foo{" + PMD.EOL +
138         "    private int counter;" + PMD.EOL +
139         "    private Foo(){" + PMD.EOL +
140         "        counter = 0;" + PMD.EOL +
141         "    }" + PMD.EOL +
142         "    private int foo(){" + PMD.EOL +
143         "        if (++this.counter < 3) {" + PMD.EOL +
144         "            return 0;" + PMD.EOL +
145         "        }" + PMD.EOL +
146         "        return 1;" + PMD.EOL +
147         "    }" + PMD.EOL +
148         "}";
149 
150     public static final String TEST_ENUM =
151 	"public enum MyEnum {" + PMD.EOL +
152 	"  A(\"a\");" + PMD.EOL +
153 	"  private final String desc;" + PMD.EOL +
154 	"  private MyEnum(String desc) {" + PMD.EOL +
155 	"    this.desc = desc;" + PMD.EOL +
156 	"  }" + PMD.EOL +
157 	"  public static MyEnum byDesc(String desc) {" + PMD.EOL +
158 	"    for (MyEnum myEnum : value()) {" + PMD.EOL +
159 	"      if (myEnum.desc.equals(desc)) return myEnum;" + PMD.EOL +
160 	"    }" + PMD.EOL +
161 	"    return null;" + PMD.EOL +
162 	"  }" + PMD.EOL +
163 	" }";
164 
165     public static junit.framework.Test suite() {
166         return new junit.framework.JUnit4TestAdapter(NameOccurrencesTest.class);
167     }
168 }