1 /** 2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html 3 */ 4 package test.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.ast.ASTFormalParameter; 10 import net.sourceforge.pmd.ast.ASTLocalVariableDeclaration; 11 import net.sourceforge.pmd.ast.ASTName; 12 import net.sourceforge.pmd.ast.ASTPrimaryPrefix; 13 import net.sourceforge.pmd.ast.ASTVariableDeclaratorId; 14 import net.sourceforge.pmd.symboltable.LocalScope; 15 import net.sourceforge.pmd.symboltable.MethodScope; 16 import net.sourceforge.pmd.symboltable.NameDeclaration; 17 import net.sourceforge.pmd.symboltable.NameOccurrence; 18 import net.sourceforge.pmd.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.findChildrenOfType(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.findChildrenOfType(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.findChildrenOfType(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.findChildrenOfType(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.findChildrenOfType(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.findChildrenOfType(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 }