Added test for QualifiedName

This commit is contained in:
oowekyala
2017-05-23 16:08:47 +02:00
parent 996a08fbd6
commit 8c0863a070
4 changed files with 246 additions and 16 deletions

View File

@ -45,7 +45,7 @@ public class ASTConstructorDeclaration extends AbstractJavaAccessNode implements
public QualifiedName getQualifiedName() {
ASTClassOrInterfaceDeclaration parent = this.getFirstParentOfType(ASTClassOrInterfaceDeclaration.class);
ASTFormalParameters params = this.getFirstChildOfType(ASTFormalParameters.class);
ASTFormalParameters params = this.getFirstDescendantOfType(ASTFormalParameters.class);
int numParams = params.jjtGetNumChildren();
String[] types = new String[numParams];

View File

@ -113,7 +113,7 @@ public class ASTMethodDeclaration extends AbstractJavaAccessNode implements DFAG
public QualifiedName getQualifiedName() {
QualifiedName parent = this.getFirstParentOfType(ASTClassOrInterfaceDeclaration.class).getQualifiedName();
ASTFormalParameters params = this.getFirstChildOfType(ASTFormalParameters.class);
ASTFormalParameters params = this.getFirstDescendantOfType(ASTFormalParameters.class);
int numParams = params.jjtGetNumChildren();
String[] types = new String[numParams];

View File

@ -11,13 +11,13 @@ import java.util.Arrays;
*/
public interface QualifiableNode {
char CLASS_DELIMITER = '$';
char METHOD_DELIMITER = '#';
char NESTED_CLASS_DELIMITER = ':';
char LEFT_PARAM_DELIMITER = '(';
char RIGHT_PARAM_DELIMITER = ')';
char PARAMLIST_DELIMITER = ',';
char PACKAGE_DELIMITER = '.';
char LEFT_CLASS_SEP = '$';
char METHOD_SEP = '#';
char NESTED_CLASS_SEP = ':';
char LEFT_PARAM_SEP = '(';
char RIGHT_PARAM_SEP = ')';
char PARAMLIST_SEP = ',';
char PACKAGE_SEP = '.';
QualifiedName getQualifiedName();
@ -83,21 +83,22 @@ public interface QualifiableNode {
return operation;
}
public void setOperation(String methodName, String[] paramTypes) {
StringBuilder sb = new StringBuilder();
sb.append(methodName);
sb.append(LEFT_PARAM_DELIMITER);
sb.append(LEFT_PARAM_SEP);
int last = paramTypes.length - 1;
for (int i = 0; i < last; i++) {
sb.append(paramTypes[i]);
sb.append(PARAMLIST_DELIMITER);
sb.append(PARAMLIST_SEP);
}
if (last > -1) {
sb.append(paramTypes[last]);
}
sb.append(RIGHT_PARAM_DELIMITER);
sb.append(RIGHT_PARAM_SEP);
this.operation = sb.toString();
}
@ -110,28 +111,57 @@ public interface QualifiableNode {
int last = packages.length - 1;
for (int i = 0; i < last; i++) {
sb.append(packages[i]);
sb.append(PACKAGE_DELIMITER);
sb.append(PACKAGE_SEP);
}
sb.append(packages[last]);
}
sb.append(CLASS_DELIMITER); // class delimiter is there anyway
sb.append(LEFT_CLASS_SEP); // class delimiter is there anyway
int last = classes.length - 1;
for (int i = 0; i < last; i++) {
sb.append(classes[i]);
sb.append(NESTED_CLASS_DELIMITER);
sb.append(NESTED_CLASS_SEP);
}
sb.append(classes[last]);
if (operation != null) {
sb.append(METHOD_DELIMITER);
sb.append(METHOD_SEP);
sb.append(operation);
}
return sb.toString();
}
@Override
public boolean equals(Object o) {
if (o instanceof QualifiedName) {
return this.toString().equals(o.toString());
} else if (o instanceof String) {
return this.toString().equals(o);
}
return false;
}
@Override
public int hashCode() {
int hash = 0;
if (packages != null) {
for (String p : packages) {
hash += p.hashCode();
}
}
for (String p : classes) {
if (p != null) {
hash += p.hashCode();
}
}
if (operation != null)
hash += operation.hashCode();
return hash;
}
}
}

View File

@ -0,0 +1,200 @@
/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.java.ast;
import java.util.Set;
import net.sourceforge.pmd.lang.java.ParserTst;
import org.junit.Test;
import static net.sourceforge.pmd.lang.java.ast.QualifiableNode.LEFT_CLASS_SEP;
import static net.sourceforge.pmd.lang.java.ast.QualifiableNode.LEFT_PARAM_SEP;
import static net.sourceforge.pmd.lang.java.ast.QualifiableNode.METHOD_SEP;
import static net.sourceforge.pmd.lang.java.ast.QualifiableNode.NESTED_CLASS_SEP;
import static net.sourceforge.pmd.lang.java.ast.QualifiableNode.PACKAGE_SEP;
import static net.sourceforge.pmd.lang.java.ast.QualifiableNode.PARAMLIST_SEP;
import static net.sourceforge.pmd.lang.java.ast.QualifiableNode.RIGHT_PARAM_SEP;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
/**
* @author Clément Fournier
*/
public class QualifiedNameTest extends ParserTst {
@Test
public void testEmptyPackage() {
final String TEST = "class Foo {}";
Set<ASTClassOrInterfaceDeclaration> nodes = getNodes(ASTClassOrInterfaceDeclaration.class,
TEST);
for (ASTClassOrInterfaceDeclaration coid : nodes) {
QualifiableNode.QualifiedName qname = coid.getQualifiedName();
assertEquals(LEFT_CLASS_SEP + "Foo", qname.toString());
assertNull(qname.getPackages());
assertEquals(1, qname.getClasses().length);
assertNull(qname.getOperation());
}
}
@Test
public void testPackage() {
final String TEST = "package foo.bar; class Bzaz{}";
Set<ASTClassOrInterfaceDeclaration> nodes = getNodes(ASTClassOrInterfaceDeclaration.class,
TEST);
for (ASTClassOrInterfaceDeclaration coid : nodes) {
QualifiableNode.QualifiedName qname = coid.getQualifiedName();
assertEquals("foo" + PACKAGE_SEP + "bar" + LEFT_CLASS_SEP + "Bzaz", qname.toString());
assertEquals(2, qname.getPackages().length);
assertEquals(1, qname.getClasses().length);
assertNull(qname.getOperation());
}
}
@Test
public void testNestedClass() {
final String TEST = "package foo.bar; class Bzaz{ class Bor{ class Foo{}}}";
Set<ASTClassOrInterfaceDeclaration> nodes = getNodes(ASTClassOrInterfaceDeclaration.class,
TEST);
for (ASTClassOrInterfaceDeclaration coid : nodes) {
QualifiableNode.QualifiedName qname = coid.getQualifiedName();
switch (coid.getImage()) {
case "Foo":
assertEquals("foo" + PACKAGE_SEP + "bar" + LEFT_CLASS_SEP
+ "Bzaz" + NESTED_CLASS_SEP + "Bor" + NESTED_CLASS_SEP + "Foo",
qname.toString());
assertEquals(3, qname.getClasses().length);
break;
default:
break;
}
}
}
@Test
public void testNestedEmptyPackage() {
final String TEST = "class Bzaz{ class Bor{ class Foo{}}}";
Set<ASTClassOrInterfaceDeclaration> nodes = getNodes(ASTClassOrInterfaceDeclaration.class,
TEST);
for (ASTClassOrInterfaceDeclaration coid : nodes) {
QualifiableNode.QualifiedName qname = coid.getQualifiedName();
switch (coid.getImage()) {
case "Foo":
assertEquals(LEFT_CLASS_SEP
+ "Bzaz" + NESTED_CLASS_SEP + "Bor" + NESTED_CLASS_SEP + "Foo",
qname.toString());
assertNull(qname.getPackages());
assertEquals(3, qname.getClasses().length);
break;
default:
break;
}
}
}
@Test
public void testMethod() {
final String TEST = "package bar; class Bzaz{ public void foo(){}}";
Set<ASTMethodDeclaration> nodes = getNodes(ASTMethodDeclaration.class,
TEST);
for (ASTMethodDeclaration declaration : nodes) {
QualifiableNode.QualifiedName qname = declaration.getQualifiedName();
assertEquals("bar" + LEFT_CLASS_SEP
+ "Bzaz" + METHOD_SEP + "foo" + LEFT_PARAM_SEP + RIGHT_PARAM_SEP,
qname.toString());
assertNotNull(qname.getOperation());
assertEquals("foo" + LEFT_PARAM_SEP + RIGHT_PARAM_SEP, qname.getOperation());
}
}
@Test
public void testConstructor() {
final String TEST = "package bar; class Bzaz{ public Bzaz(){}}";
Set<ASTConstructorDeclaration> nodes = getNodes(ASTConstructorDeclaration.class,
TEST);
for (ASTConstructorDeclaration declaration : nodes) {
QualifiableNode.QualifiedName qname = declaration.getQualifiedName();
assertEquals("bar" + LEFT_CLASS_SEP
+ "Bzaz" + METHOD_SEP + "Bzaz" + LEFT_PARAM_SEP + RIGHT_PARAM_SEP,
qname.toString());
assertNotNull(qname.getOperation());
assertEquals("Bzaz" + LEFT_PARAM_SEP + RIGHT_PARAM_SEP, qname.getOperation());
}
}
@Test
public void testConstructorWithParams() {
final String TEST = "package bar; class Bzaz{ public Bzaz(int j, String k){}}";
Set<ASTConstructorDeclaration> nodes = getNodes(ASTConstructorDeclaration.class,
TEST);
for (ASTConstructorDeclaration declaration : nodes) {
QualifiableNode.QualifiedName qname = declaration.getQualifiedName();
assertEquals("bar" + LEFT_CLASS_SEP
+ "Bzaz" + METHOD_SEP + "Bzaz" + LEFT_PARAM_SEP + "int" + PARAMLIST_SEP + "String" + RIGHT_PARAM_SEP,
qname.toString());
assertNotNull(qname.getOperation());
assertEquals("Bzaz" + LEFT_PARAM_SEP + "int" + PARAMLIST_SEP + "String" + RIGHT_PARAM_SEP, qname.getOperation());
}
}
@Test
public void testEquals() {
final String TEST = "package bar; class Bzaz{ public foo() {} public Bzaz(int j, String k){}}";
Set<ASTConstructorDeclaration> nodes = getNodes(ASTConstructorDeclaration.class,
TEST);
for (ASTConstructorDeclaration declaration : nodes) {
QualifiableNode.QualifiedName qname = declaration.getQualifiedName();
assertEquals(qname, qname.toString());
}
}
@Test
public void testConstructorOverload() {
final String TEST = "package bar; class Bzaz{ public Bzaz(int j) {} public Bzaz(int j, String k){}}";
Set<ASTConstructorDeclaration> nodes = getNodes(ASTConstructorDeclaration.class,
TEST);
ASTConstructorDeclaration[] arr = nodes.toArray(new ASTConstructorDeclaration[2]);
assertNotEquals(arr[0].getQualifiedName(), arr[1].getQualifiedName());
}
@Test
public void testMethodOverload() {
final String TEST = "package bar; class Bzaz{ public void foo(String j) {} " +
"public void foo(int j){} public void foo(double k){}}";
Set<ASTMethodDeclaration> nodes = getNodes(ASTMethodDeclaration.class,
TEST);
ASTMethodDeclaration[] arr = nodes.toArray(new ASTMethodDeclaration[3]);
assertNotEquals(arr[0].getQualifiedName(), arr[1].getQualifiedName());
assertNotEquals(arr[1].getQualifiedName(), arr[2].getQualifiedName());
}
}