package spoon.test.intercession; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import spoon.Launcher; import spoon.processing.FactoryAccessor; import spoon.reflect.ast.IntercessionScanner; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtType; import spoon.reflect.declaration.CtTypedElement; import spoon.reflect.declaration.ModifierKind; import spoon.reflect.factory.Factory; import spoon.reflect.factory.FactoryImpl; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.Query; import spoon.reflect.visitor.filter.TypeFilter; import spoon.support.DefaultCoreFactory; import spoon.support.StandardEnvironment; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.List; import static org.junit.Assert.fail; import static spoon.test.parent.ParentContractTest.createCompatibleObject; // contract: one can call all setters with null as parameter (no problem with parent) @RunWith(Parameterized.class) public class IntercessionContractTest { @Parameterized.Parameters(name = "{1}") public static Collection<Object[]> data() throws Exception { final Launcher launcher = new Launcher(); final Factory factory = launcher.getFactory(); launcher.getEnvironment().setNoClasspath(true); // all metamodel interfaces. launcher.addInputResource("./src/main/java/spoon/reflect/code"); launcher.addInputResource("./src/main/java/spoon/reflect/declaration"); launcher.addInputResource("./src/main/java/spoon/reflect/reference"); launcher.buildModel(); final List<Object[]> values = new ArrayList<>(); new IntercessionScanner(launcher.getFactory()) { @Override protected boolean isToBeProcessed(CtMethod<?> candidate) { return (candidate.getSimpleName().startsWith("set") // || candidate.getSimpleName().startsWith("add")) // && takeSetterForCtElement(candidate); // } @Override protected void process(CtMethod<?> element) { values.add(new Object[] { createCompatibleObject(element.getDeclaringType().getReference()), element.getReference().getActualMethod() }); } }.scan(launcher.getModel().getRootPackage()); return values; } @Parameterized.Parameter(0) public Object instance; @Parameterized.Parameter(1) public Method toTest; @Test public void testContract() throws Throwable { Factory factory = new FactoryImpl(new DefaultCoreFactory(),new StandardEnvironment()); Object element = instance; if (element instanceof FactoryAccessor) { ((FactoryAccessor) element).setFactory(factory); } // we invoke the setter toTest.invoke(element, new Object[] { null }); } }