1
2
3
4 package net.sourceforge.pmd.symboltable;
5
6 import static org.junit.Assert.assertEquals;
7 import static org.junit.Assert.assertFalse;
8 import net.sourceforge.pmd.PMD;
9 import net.sourceforge.pmd.lang.java.ast.ASTFormalParameter;
10 import net.sourceforge.pmd.lang.java.ast.ASTLocalVariableDeclaration;
11 import net.sourceforge.pmd.lang.java.ast.ASTName;
12 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix;
13 import net.sourceforge.pmd.lang.java.ast.ASTVariableDeclaratorId;
14 import net.sourceforge.pmd.lang.java.symboltable.LocalScope;
15 import net.sourceforge.pmd.lang.java.symboltable.MethodScope;
16 import net.sourceforge.pmd.lang.java.symboltable.NameDeclaration;
17 import net.sourceforge.pmd.lang.java.symboltable.NameOccurrence;
18 import net.sourceforge.pmd.lang.java.symboltable.VariableNameDeclaration;
19
20 import org.junit.Test;
21
22 import java.util.List;
23 import java.util.Map;
24 public class LocalScopeTest extends STBBaseTst {
25
26 @Test
27 public void testNameWithThisOrSuperIsNotFlaggedAsUnused() {
28 LocalScope scope = new LocalScope();
29 ASTName name = new ASTName(1);
30 name.setImage("foo");
31 ASTPrimaryPrefix prefix = new ASTPrimaryPrefix(2);
32 prefix.setUsesThisModifier();
33 name.jjtAddChild(prefix, 1);
34 NameOccurrence occ = new NameOccurrence(name, "foo");
35 scope.addVariableNameOccurrence(occ);
36 assertFalse(scope.getVariableDeclarations().keySet().iterator().hasNext());
37 }
38
39 @Test
40 public void testNameWithSuperIsNotFlaggedAsUnused() {
41 LocalScope scope = new LocalScope();
42 ASTName name = new ASTName(1);
43 name.setImage("foo");
44 ASTPrimaryPrefix prefix = new ASTPrimaryPrefix(2);
45 prefix.setUsesSuperModifier();
46 name.jjtAddChild(prefix, 1);
47 NameOccurrence occ = new NameOccurrence(name, "foo");
48 scope.addVariableNameOccurrence(occ);
49 assertFalse(scope.getVariableDeclarations().keySet().iterator().hasNext());
50 }
51
52 @Test
53 public void testLocalVariableDeclarationFound() {
54 parseCode(TEST1);
55 List nodes = acu.findDescendantsOfType(ASTVariableDeclaratorId.class);
56 ASTVariableDeclaratorId node = (ASTVariableDeclaratorId) nodes.get(0);
57 Map vars = node.getScope().getVariableDeclarations();
58 assertEquals(1, vars.size());
59 NameDeclaration decl = (NameDeclaration) vars.keySet().iterator().next();
60 assertEquals("b", decl.getImage());
61 }
62
63 @Test
64 public void testQualifiedNameOccurrence() {
65 parseCode(TEST2);
66 List nodes = acu.findDescendantsOfType(ASTVariableDeclaratorId.class);
67 ASTVariableDeclaratorId node = (ASTVariableDeclaratorId) nodes.get(0);
68 Map vars = node.getScope().getVariableDeclarations();
69 NameDeclaration decl = (NameDeclaration) vars.keySet().iterator().next();
70 NameOccurrence occ = (NameOccurrence) ((List) vars.get(decl)).get(0);
71 assertEquals("b", occ.getImage());
72 }
73
74 @Test
75 public void testPostfixUsageIsRecorded() {
76 parseCode(TEST3);
77 List nodes = acu.findDescendantsOfType(ASTVariableDeclaratorId.class);
78 ASTVariableDeclaratorId node = (ASTVariableDeclaratorId) nodes.get(0);
79 Map vars = node.getScope().getVariableDeclarations();
80 NameDeclaration decl = (NameDeclaration) vars.keySet().iterator().next();
81 List usages = (List) vars.get(decl);
82 NameOccurrence occ = (NameOccurrence) usages.get(0);
83 assertEquals(4, occ.getLocation().getBeginLine());
84 }
85
86 @Test
87 public void testLocalVariableTypesAreRecorded() {
88 parseCode(TEST1);
89 List nodes = acu.findDescendantsOfType(ASTVariableDeclaratorId.class);
90 Map vars = ((ASTVariableDeclaratorId) nodes.get(0)).getScope().getVariableDeclarations();
91 VariableNameDeclaration decl = (VariableNameDeclaration) vars.keySet().iterator().next();
92 assertEquals("Bar", decl.getTypeImage());
93 }
94
95 @Test
96 public void testMethodArgumentTypesAreRecorded() {
97 parseCode(TEST5);
98 List nodes = acu.findDescendantsOfType(ASTFormalParameter.class);
99 Map vars = ((ASTFormalParameter) nodes.get(0)).getScope().getVariableDeclarations();
100 VariableNameDeclaration decl = (VariableNameDeclaration) vars.keySet().iterator().next();
101 assertEquals("String", decl.getTypeImage());
102 }
103
104 @Test
105 public void testgetEnclosingMethodScope() {
106 parseCode(TEST4);
107 ASTLocalVariableDeclaration node = acu.findDescendantsOfType(ASTLocalVariableDeclaration.class).get(0);
108 LocalScope scope = (LocalScope) node.getScope();
109 MethodScope ms = scope.getEnclosingMethodScope();
110 assertEquals(2, ms.getVariableDeclarations().size());
111 }
112
113
114 public static final String TEST1 =
115 "public class Foo {" + PMD.EOL +
116 " void foo() {" + PMD.EOL +
117 " Bar b = new Bar();" + PMD.EOL +
118 " }" + PMD.EOL +
119 "}";
120
121 public static final String TEST2 =
122 "public class Foo {" + PMD.EOL +
123 " void foo() {" + PMD.EOL +
124 " Bar b = new Bar();" + PMD.EOL +
125 " b.buz = 2;" + PMD.EOL +
126 " }" + PMD.EOL +
127 "}";
128
129 public static final String TEST3 =
130 "public class Foo {" + PMD.EOL +
131 " void foo() {" + PMD.EOL +
132 " int x = 2;" + PMD.EOL +
133 " x++;" + PMD.EOL +
134 " }" + PMD.EOL +
135 "}";
136
137 public static final String TEST4 =
138 "public class Foo {" + PMD.EOL +
139 " void foo(String x, String z) { int y; }" + PMD.EOL +
140 "}";
141
142 public static final String TEST5 =
143 "public class Foo {" + PMD.EOL +
144 " void foo(String x);" + PMD.EOL +
145 "}";
146
147 public static junit.framework.Test suite() {
148 return new junit.framework.JUnit4TestAdapter(LocalScopeTest.class);
149 }
150 }