Skip to content

Commit

Permalink
test SubInheritanceHierarchyFunction
Browse files Browse the repository at this point in the history
  • Loading branch information
pvojtechovsky committed May 16, 2017
1 parent b4b7e5a commit 2824c03
Show file tree
Hide file tree
Showing 13 changed files with 200 additions and 0 deletions.
76 changes: 76 additions & 0 deletions src/test/java/spoon/test/refactoring/MethodsRefactoringTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package spoon.test.refactoring;

import static org.junit.Assert.*;

import java.io.File;
import java.util.List;

import org.junit.Test;

import spoon.reflect.declaration.CtType;
import spoon.reflect.factory.Factory;
import spoon.reflect.visitor.filter.SubInheritanceHierarchyFunction;
import spoon.test.refactoring.parameter.testclasses.IFaceB;
import spoon.test.refactoring.parameter.testclasses.IFaceK;
import spoon.test.refactoring.parameter.testclasses.IFaceL;
import spoon.test.refactoring.parameter.testclasses.TypeA;
import spoon.test.refactoring.parameter.testclasses.TypeB;
import spoon.test.refactoring.parameter.testclasses.TypeC;
import spoon.testing.utils.ModelUtils;

public class MethodsRefactoringTest {

@Test
public void testSubInheritanceHierarchyFunction() {
Factory factory = ModelUtils.build(new File("./src/test/java/spoon/test/refactoring/parameter/testclasses"));

List<String> allSubtypes = factory.Class().get(TypeA.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list();
checkContainsOnly(allSubtypes,
"spoon.test.refactoring.parameter.testclasses.TypeB",
"spoon.test.refactoring.parameter.testclasses.TypeB$1",
"spoon.test.refactoring.parameter.testclasses.TypeC");

allSubtypes = factory.Class().get(TypeB.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list();
checkContainsOnly(allSubtypes,
"spoon.test.refactoring.parameter.testclasses.TypeB$1",
"spoon.test.refactoring.parameter.testclasses.TypeC");

allSubtypes = factory.Class().get(TypeC.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list();
assertEquals(0, allSubtypes.size());

allSubtypes = factory.Interface().get(IFaceB.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list();
checkContainsOnly(allSubtypes,
"spoon.test.refactoring.parameter.testclasses.TypeB",
"spoon.test.refactoring.parameter.testclasses.TypeB$1",
"spoon.test.refactoring.parameter.testclasses.TypeB$1Local",
"spoon.test.refactoring.parameter.testclasses.TypeC",
"spoon.test.refactoring.parameter.testclasses.IFaceL",
"spoon.test.refactoring.parameter.testclasses.TypeL",
"spoon.test.refactoring.parameter.testclasses.TypeM"
);

allSubtypes = factory.Interface().get(IFaceL.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list();
checkContainsOnly(allSubtypes,
"spoon.test.refactoring.parameter.testclasses.TypeB$1Local",
"spoon.test.refactoring.parameter.testclasses.TypeL",
"spoon.test.refactoring.parameter.testclasses.TypeM"
);

allSubtypes = factory.Interface().get(IFaceK.class).map(new SubInheritanceHierarchyFunction()).map((CtType type)->type.getQualifiedName()).list();
checkContainsOnly(allSubtypes,
"spoon.test.refactoring.parameter.testclasses.TypeB$1Local",
"spoon.test.refactoring.parameter.testclasses.TypeL",
"spoon.test.refactoring.parameter.testclasses.TypeM",
"spoon.test.refactoring.parameter.testclasses.TypeK",
"spoon.test.refactoring.parameter.testclasses.TypeR",
"spoon.test.refactoring.parameter.testclasses.TypeS"
);
}

private void checkContainsOnly(List<String> foundNames, String... expectedNames) {
for (String name : expectedNames) {
assertTrue("The "+name+" not found", foundNames.remove(name));
}
assertTrue("Unexpected names found: "+foundNames, foundNames.isEmpty());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package spoon.test.refactoring.parameter.testclasses;

public interface IFaceB<T> {
@TestHierarchy("A_method1")
void method1(T p1);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package spoon.test.refactoring.parameter.testclasses;

public interface IFaceK {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package spoon.test.refactoring.parameter.testclasses;

public interface IFaceL extends IFaceB<Double> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package spoon.test.refactoring.parameter.testclasses;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.LOCAL_VARIABLE})
public @interface TestHierarchy {
/**
* @return the list of hierarchy names where this method belongs to.
*/
String[] value();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package spoon.test.refactoring.parameter.testclasses;

public class TypeA {

public TypeA() {
}

@TestHierarchy("A_method1")
public void method1(Exception p1) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package spoon.test.refactoring.parameter.testclasses;

public class TypeB extends TypeA implements IFaceB<Exception> {

public TypeB() {
}

private void anMethodWithAnonymousClass() {
new TypeB() {
@Override
@TestHierarchy("A_method1")
public void method1(Exception p1) {
super.method1(p1);
}
};
}

private void anMethodWithLambdaByParam(IFaceB ifaceB) {
//this lambda is an implementation IFaceB#method1
anMethodWithLambdaByParam(/*A_method1*/p->{});
}
private void anMethodWithLambda() {
//this lambda is an implementation IFaceB#method1
@TestHierarchy("A_method1")
IFaceB ifaceB = p->{};
ifaceB.method1(1);
}
private void anMethodWithLocalClass() {
class Local extends TypeL {
@Override
@TestHierarchy("A_method1")
public void method1(Double p1) {
super.method1(p1);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package spoon.test.refactoring.parameter.testclasses;

public class TypeC extends TypeB {
@Override
@TestHierarchy("A_method1")
public void method1(Exception p1) {
super.method1(p1);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package spoon.test.refactoring.parameter.testclasses;

public class TypeK implements IFaceK {

public TypeK() {
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package spoon.test.refactoring.parameter.testclasses;

public class TypeL extends TypeK implements IFaceL {
@Override
@TestHierarchy("A_method1")
public void method1(Double p1) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package spoon.test.refactoring.parameter.testclasses;

public class TypeM extends TypeL {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package spoon.test.refactoring.parameter.testclasses;

public class TypeR extends TypeK {
@TestHierarchy("R_method1")
public void method1(Double p1) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package spoon.test.refactoring.parameter.testclasses;

public class TypeS extends TypeR {
@Override
@TestHierarchy("R_method1")
public void method1(Double p1) {
}
}

0 comments on commit 2824c03

Please sign in to comment.