diff --git a/src/test/java/spoon/test/method_overriding/MethodOverriddingTest.java b/src/test/java/spoon/test/method_overriding/MethodOverriddingTest.java new file mode 100644 index 00000000000..fd788f3d29a --- /dev/null +++ b/src/test/java/spoon/test/method_overriding/MethodOverriddingTest.java @@ -0,0 +1,74 @@ +package spoon.test.method_overriding; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; + +import org.junit.Test; + +import spoon.reflect.declaration.CtMethod; +import spoon.reflect.factory.Factory; +import spoon.reflect.visitor.filter.TypeFilter; +import spoon.testing.utils.ModelUtils; + +import static org.junit.Assert.*; + +public class MethodOverriddingTest { + + @Test + public void testMethodOverride() { + checkMethodOverride((m1, m2)->m1.isOverriding(m2)); + } + @Test + public void testMethodOverrideByReference() { + checkMethodOverride((m1, m2)->m1.getReference().isOverriding(m2.getReference())); + } + + private void checkMethodOverride(BiFunction, CtMethod, Boolean> isOverriding) { + Factory factory = ModelUtils.build(new File("src/test/java/spoon/test/method_overriding/testclasses").listFiles()); + Map> methodsByName = new HashMap<>(); + factory.getModel().getRootPackage().filterChildren(new TypeFilter<>(CtMethod.class)).forEach((CtMethod m)->{ + List methods = methodsByName.get(m.getSimpleName()); + if(methods==null) { + methods = new ArrayList<>(); + methodsByName.put(m.getSimpleName(), methods); + } + methods.add(m); + }); + for (Map.Entry> e : methodsByName.entrySet()) { + combine(e.getValue(), 0, isOverriding); + } + } + + private void combine(List value, int start, BiFunction, CtMethod, Boolean> isOverriding) { + CtMethod m1 = value.get(start); + if(start+1, CtMethod, Boolean> isOverriding) { + assertTrue(descr(m1)+" overriding "+descr(m2), isOverriding.apply(m1, m2)); + assertFalse(descr(m2)+" NOT overriding "+descr(m1), isOverriding.apply(m2, m1)); + } + private void checkNotOverride(CtMethod m1, CtMethod m2, BiFunction, CtMethod, Boolean> isOverriding) { + assertFalse(descr(m1)+" NOT overriding "+descr(m2), isOverriding.apply(m1, m2)); + assertFalse(descr(m2)+" NOT overriding "+descr(m1), isOverriding.apply(m2, m1)); + } + + private String descr(CtMethod m) { + return m.getDeclaringType().getSimpleName()+"#"+m.getSimpleName(); + } +} diff --git a/src/test/java/spoon/test/method_overriding/testclasses/A.java b/src/test/java/spoon/test/method_overriding/testclasses/A.java new file mode 100644 index 00000000000..806f083d6a2 --- /dev/null +++ b/src/test/java/spoon/test/method_overriding/testclasses/A.java @@ -0,0 +1,24 @@ +package spoon.test.method_overriding.testclasses; + +import java.util.List; + +public class A { + + public A() { + } + + A m1(C c){ + return null; + } + + > T m2(C c){ + return null; + } + + void m3(List c){ + } + void m4(List> c){ + } + void m5(U u) { + } +} diff --git a/src/test/java/spoon/test/method_overriding/testclasses/B.java b/src/test/java/spoon/test/method_overriding/testclasses/B.java new file mode 100644 index 00000000000..8e400c69652 --- /dev/null +++ b/src/test/java/spoon/test/method_overriding/testclasses/B.java @@ -0,0 +1,32 @@ +package spoon.test.method_overriding.testclasses; + +import java.util.List; + +public class B extends A { + + public B() { + } + + @Override + B m1(C c){ + return null; + } + + @Override + > T m2(C c){ + return null; + } + + @Override + void m3(List c){ + } + + @Override + void m5(S u) { + super.m5(u); + } + + @Override + void m4(List> c) { + } +} diff --git a/src/test/java/spoon/test/method_overriding/testclasses/C.java b/src/test/java/spoon/test/method_overriding/testclasses/C.java new file mode 100644 index 00000000000..1092b3ed4de --- /dev/null +++ b/src/test/java/spoon/test/method_overriding/testclasses/C.java @@ -0,0 +1,37 @@ +package spoon.test.method_overriding.testclasses; + +import java.io.FilterInputStream; +import java.io.InputStream; +import java.util.List; + +public class C extends B { + + public C() { + } + + @Override + B m1(C c){ + return null; + } + + @Override + B m2(C c){ + return null; + } + + @Override + void m3(List c) { + // TODO Auto-generated method stub + super.m3(c); + } + + @Override + void m4(List> c){ + } + + @Override + void m5(InputStream u) { + super.m5(u); + } + +} diff --git a/src/test/java/spoon/test/method_overriding/testclasses/D.java b/src/test/java/spoon/test/method_overriding/testclasses/D.java new file mode 100644 index 00000000000..de6abf6a520 --- /dev/null +++ b/src/test/java/spoon/test/method_overriding/testclasses/D.java @@ -0,0 +1,24 @@ +package spoon.test.method_overriding.testclasses; + +import java.util.List; + +public class D extends B { + + public D() { + } + + @Override + B m1(C c){ + return null; + } + + @Override + D m2(C c){ + return null; + } + + @Override + void m4(List> c){ + } + +} diff --git a/src/test/java/spoon/test/method_overriding/testclasses/IA.java b/src/test/java/spoon/test/method_overriding/testclasses/IA.java new file mode 100644 index 00000000000..c9faf955ef9 --- /dev/null +++ b/src/test/java/spoon/test/method_overriding/testclasses/IA.java @@ -0,0 +1,5 @@ +package spoon.test.method_overriding.testclasses; + +public interface IA { + +}