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 static org.junit.Assert.fail;
10  
11  import java.util.Iterator;
12  import java.util.List;
13  import java.util.Map;
14  
15  import net.sourceforge.pmd.PMD;
16  import net.sourceforge.pmd.lang.java.ast.ASTBlock;
17  import net.sourceforge.pmd.lang.java.ast.ASTCatchStatement;
18  import net.sourceforge.pmd.lang.java.ast.ASTEqualityExpression;
19  import net.sourceforge.pmd.lang.java.ast.ASTInitializer;
20  import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclaration;
21  import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId;
22  import net.sourceforge.pmd.lang.java.ast.JavaNode;
23  import net.sourceforge.pmd.lang.java.symboltable.NameOccurrence;
24  import net.sourceforge.pmd.lang.java.symboltable.Scope;
25  import net.sourceforge.pmd.lang.java.symboltable.VariableNameDeclaration;
26  
27  import org.junit.Test;
28  public class AcceptanceTest extends STBBaseTst {
29  
30      @Test
31      public void testClashingSymbols() {
32          parseCode(TEST1);
33      }
34  
35      @Test
36      public void testInitializer() {
37          parseCode(TEST_INITIALIZERS);
38          ASTInitializer a = acu.findDescendantsOfType(ASTInitializer.class).get(0);
39          assertFalse(a.isStatic());
40          a = acu.findDescendantsOfType(ASTInitializer.class).get(1);
41          assertTrue(a.isStatic());
42      }
43  
44      @Test
45      public void testCatchBlocks() {
46          parseCode(TEST_CATCH_BLOCKS);
47          ASTCatchStatement c = acu.findDescendantsOfType(ASTCatchStatement.class).get(0);
48          ASTBlock a = c.findDescendantsOfType(ASTBlock.class).get(0);
49          Scope s = a.getScope();
50          Map<VariableNameDeclaration, List<NameOccurrence>> vars = s.getParent().getVariableDeclarations();
51          assertEquals(1, vars.size());
52          VariableNameDeclaration v = vars.keySet().iterator().next();
53          assertEquals("e", v.getImage());
54          assertEquals(1, (vars.get(v)).size());
55      }
56  
57      @Test
58      public void testEq() {
59          parseCode(TEST_EQ);
60          ASTEqualityExpression e = acu.findDescendantsOfType(ASTEqualityExpression.class).get(0);
61          ASTMethodDeclaration method = e.getFirstParentOfType(ASTMethodDeclaration.class);
62          Scope s = method.getScope();
63          Map<VariableNameDeclaration, List<NameOccurrence>> m = s.getVariableDeclarations();
64          assertEquals(2, m.size());
65          for (Map.Entry<VariableNameDeclaration, List<NameOccurrence>> entry : m.entrySet()) {
66              VariableNameDeclaration vnd = entry.getKey();
67              List<NameOccurrence> usages = entry.getValue();
68  
69              if (vnd.getImage().equals("a") || vnd.getImage().equals("b")) {
70                  assertEquals(1, usages.size());
71                  assertEquals(3, usages.get(0).getLocation().getBeginLine());
72              } else {
73                  fail("Unkown variable " + vnd);
74              }
75          }
76      }
77  
78      @Test
79      public void testFieldFinder() {
80          parseCode(TEST_FIELD);
81  //        System.out.println(TEST_FIELD);
82  
83          ASTVariableDeclaratorId declaration = acu.findDescendantsOfType(ASTVariableDeclaratorId.class).get(1);
84          assertEquals(3, declaration.getBeginLine());
85          assertEquals("bbbbbbbbbb", declaration.getImage());
86          assertEquals(1, declaration.getUsages().size());
87          NameOccurrence no = declaration.getUsages().get(0);
88          JavaNode location = no.getLocation();
89          assertEquals(6, location.getBeginLine());
90  //        System.out.println("variable " + declaration.getImage() + " is used here: " + location.getImage());
91      }
92  
93      @Test
94      public void testDemo() {
95          parseCode(TEST_DEMO);
96  //        System.out.println(TEST_DEMO);
97          ASTMethodDeclaration node = acu.findDescendantsOfType(ASTMethodDeclaration.class).get(0);
98          Scope s = node.getScope();
99          Map<VariableNameDeclaration, List<NameOccurrence>> m = s.getVariableDeclarations();
100         for (Iterator<VariableNameDeclaration> i = m.keySet().iterator(); i.hasNext();) {
101             VariableNameDeclaration d = i.next();
102             assertEquals("buz", d.getImage());
103             assertEquals("ArrayList", d.getTypeImage());
104             List<NameOccurrence> u = m.get(d);
105             assertEquals(1, u.size());
106             NameOccurrence o = u.get(0);
107             int beginLine = o.getLocation().getBeginLine();
108             assertEquals(3, beginLine);
109 
110 //            System.out.println("Variable: " + d.getImage());
111 //            System.out.println("Type: " + d.getTypeImage());
112 //            System.out.println("Usages: " + u.size());
113 //            System.out.println("Used in line " + beginLine);
114         }
115     }
116 
117     @Test
118     public void testEnum() {
119 	parseCode(NameOccurrencesTest.TEST_ENUM);
120 
121 	ASTVariableDeclaratorId vdi = acu.findDescendantsOfType(ASTVariableDeclaratorId.class).get(0);
122 	List<NameOccurrence> usages = vdi.getUsages();
123 	assertEquals(2, usages.size());
124 	assertEquals(5, usages.get(0).getLocation().getBeginLine());
125 	assertEquals(9, usages.get(1).getLocation().getBeginLine());
126     }
127 
128     @Test
129     public void testInnerOuterClass() {
130         parseCode(TEST_INNER_CLASS);
131         ASTVariableDeclaratorId vdi = acu.findDescendantsOfType(ASTVariableDeclaratorId.class).get(0);
132         List<NameOccurrence> usages = vdi.getUsages();
133         assertEquals(2, usages.size());
134         assertEquals(5, usages.get(0).getLocation().getBeginLine());
135         assertEquals(10, usages.get(1).getLocation().getBeginLine());
136     }
137 
138     private static final String TEST_DEMO =
139             "public class Foo  {" + PMD.EOL +
140             " void bar(ArrayList buz) { " + PMD.EOL +
141             "  buz.add(\"foo\");" + PMD.EOL +
142             " } " + PMD.EOL +
143             "}" + PMD.EOL;
144 
145     private static final String TEST_EQ =
146             "public class Foo  {" + PMD.EOL +
147             " boolean foo(String a, String b) { " + PMD.EOL +
148             "  return a == b; " + PMD.EOL +
149             " } " + PMD.EOL +
150             "}" + PMD.EOL;
151 
152     private static final String TEST1 =
153             "import java.io.*;" + PMD.EOL +
154             "public class Foo  {" + PMD.EOL +
155             " void buz( ) {" + PMD.EOL +
156             "  Object o = new Serializable() { int x; };" + PMD.EOL +
157             "  Object o1 = new Serializable() { int x; };" + PMD.EOL +
158             " }" + PMD.EOL +
159             "}" + PMD.EOL;
160 
161     private static final String TEST_INITIALIZERS =
162             "public class Foo  {" + PMD.EOL +
163             " {} " + PMD.EOL +
164             " static {} " + PMD.EOL +
165             "}" + PMD.EOL;
166 
167     private static final String TEST_CATCH_BLOCKS =
168             "public class Foo  {" + PMD.EOL +
169             " void foo() { " + PMD.EOL +
170             "  try { " + PMD.EOL +
171             "  } catch (Exception e) { " + PMD.EOL +
172             "   e.printStackTrace(); " + PMD.EOL +
173             "  } " + PMD.EOL +
174             " } " + PMD.EOL +
175             "}" + PMD.EOL;
176 
177     private static final String TEST_FIELD =
178             "public class MyClass {" + PMD.EOL +
179             " private int aaaaaaaaaa; " + PMD.EOL +
180             " boolean bbbbbbbbbb = MyClass.ASCENDING; " + PMD.EOL +
181             " private int zzzzzzzzzz;" + PMD.EOL +
182             " private void doIt() {" + PMD.EOL +
183             "  if (bbbbbbbbbb) {" + PMD.EOL +
184             "  }" + PMD.EOL +
185             " }" + PMD.EOL +
186             "}" + PMD.EOL;
187 
188     public static final String TEST_INNER_CLASS =
189             "public class Outer {" + PMD.EOL +
190             "  private static class Inner {" + PMD.EOL +
191             "    private int i;" + PMD.EOL +
192             "    private Inner(int i) {" + PMD.EOL +
193             "      this.i = i;" + PMD.EOL +
194             "    }" + PMD.EOL +
195             "  }" + PMD.EOL +
196             "  public int modify(int i) {" + PMD.EOL +
197             "    Inner in = new Inner(i);" + PMD.EOL +
198             "    return in.i;" + PMD.EOL +
199             "  }" + PMD.EOL +
200             "}" + PMD.EOL;
201 
202     public static junit.framework.Test suite() {
203         return new junit.framework.JUnit4TestAdapter(AcceptanceTest.class);
204     }
205 }