package spoon.test.delete; import org.junit.Test; import spoon.reflect.code.CtAssignment; import spoon.reflect.code.CtCase; import spoon.reflect.code.CtIf; import spoon.reflect.code.CtStatement; import spoon.reflect.code.CtSwitch; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtAnonymousExecutable; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtConstructor; import spoon.reflect.declaration.CtMethod; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtParameter; import spoon.reflect.factory.Factory; import spoon.reflect.visitor.filter.TypeFilter; import spoon.test.delete.testclasses.Adobada; import java.lang.annotation.Annotation; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static spoon.testing.utils.ModelUtils.build; public class DeleteTest { @Test public void testDeleteAStatementInAnonymousExecutable() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final List<CtAnonymousExecutable> anonymousExecutables = adobada.getAnonymousExecutables(); final CtAnonymousExecutable instanceExec = anonymousExecutables.get(0); assertEquals(2, instanceExec.getBody().getStatements().size()); final CtStatement statement = instanceExec.getBody().getStatement(1); statement.delete(); assertEquals(1, instanceExec.getBody().getStatements().size()); assertFalse(instanceExec.getBody().getStatements().contains(statement)); } @Test public void testDeleteAStatementInStaticAnonymousExecutable() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final List<CtAnonymousExecutable> anonymousExecutables = adobada.getAnonymousExecutables(); final CtAnonymousExecutable staticExec = anonymousExecutables.get(1); assertEquals(2, staticExec.getBody().getStatements().size()); final CtStatement statement = staticExec.getBody().getStatement(1); statement.delete(); assertEquals(1, staticExec.getBody().getStatements().size()); assertFalse(staticExec.getBody().getStatements().contains(statement)); } @Test public void testDeleteAStatementInConstructor() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final CtConstructor<Adobada> constructor = adobada.getConstructor(); assertEquals(3, constructor.getBody().getStatements().size()); final CtStatement statement = constructor.getBody().getStatement(1); statement.delete(); assertEquals(2, constructor.getBody().getStatements().size()); assertFalse(constructor.getBody().getStatements().contains(statement)); } @Test public void testDeleteAStatementInMethod() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final CtMethod method = adobada.getMethod("m"); assertEquals(2, method.getBody().getStatements().size()); final CtStatement statement = method.getBody().getStatement(1); statement.delete(); assertEquals(1, method.getBody().getStatements().size()); assertFalse(method.getBody().getStatements().contains(statement)); } @Test public void testDeleteReturn() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final CtMethod method = adobada.getMethod("m2"); assertEquals(1, method.getBody().getStatements().size()); final CtStatement statement = method.getBody().getStatement(0); statement.delete(); assertEquals(0, method.getBody().getStatements().size()); assertFalse(method.getBody().getStatements().contains(statement)); } @Test public void testDeleteStatementInCase() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final CtMethod method = adobada.getMethod("m3"); final CtCase aCase = method.getElements(new TypeFilter<>(CtCase.class)).get(0); assertEquals(2, aCase.getStatements().size()); final CtStatement statement = aCase.getStatements().get(1); statement.delete(); assertEquals(1, aCase.getStatements().size()); assertFalse(aCase.getStatements().contains(statement)); } @Test public void testDeleteACaseOfASwitch() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final CtMethod method = adobada.getMethod("m3"); final CtSwitch aSwitch = method.getElements(new TypeFilter<>(CtSwitch.class)).get(0); final CtCase aCase = (CtCase) aSwitch.getCases().get(1); assertEquals(2, aSwitch.getCases().size()); aCase.delete(); assertEquals(1, aSwitch.getCases().size()); assertFalse(aSwitch.getCases().contains(aCase)); } @Test public void testDeleteMethod() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final CtMethod method = adobada.getMethod("m4", factory.Type().INTEGER_PRIMITIVE, factory.Type().FLOAT_PRIMITIVE, factory.Type().STRING); int n = adobada.getMethods().size(); // deleting m4 method.delete(); assertEquals(n - 1, adobada.getMethods().size()); assertFalse(adobada.getMethods().contains(method)); } @Test public void testDeleteParameterOfMethod() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final CtMethod method = adobada.getMethod("m4", factory.Type().INTEGER_PRIMITIVE, factory.Type().FLOAT_PRIMITIVE, factory.Type().STRING); final CtParameter param = (CtParameter) method.getParameters().get(1); assertEquals(3, method.getParameters().size()); param.delete(); assertEquals(2, method.getParameters().size()); assertFalse(method.getParameters().contains(param)); } @Test public void testDeleteBodyOfAMethod() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final CtMethod method = adobada.getMethod("m"); assertNotNull(method.getBody()); method.getBody().delete(); assertNull(method.getBody()); } @Test public void testDeleteAnnotationOnAClass() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); assertEquals(1, adobada.getAnnotations().size()); final CtAnnotation<? extends Annotation> annotation = adobada.getAnnotations().get(0); annotation.delete(); assertEquals(0, adobada.getAnnotations().size()); assertFalse(adobada.getAnnotations().contains(annotation)); } @Test public void testDeleteAClassTopLevel() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final CtPackage aPackage = adobada.getParent(CtPackage.class); assertEquals(1, aPackage.getTypes().size()); adobada.delete(); assertEquals(0, aPackage.getTypes().size()); assertFalse(aPackage.getTypes().contains(adobada)); } @Test public void testDeleteConditionInACondition() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final CtMethod method = adobada.getMethod("m4", factory.Type().INTEGER_PRIMITIVE, factory.Type().FLOAT_PRIMITIVE, factory.Type().STRING); final CtIf anIf = method.getElements(new TypeFilter<>(CtIf.class)).get(0); assertNotNull(anIf.getCondition()); anIf.getCondition().delete(); assertNull(anIf.getCondition()); } @Test public void testDeleteChainOfAssignment() throws Exception { final Factory factory = build(Adobada.class); final CtClass<Adobada> adobada = factory.Class().get(Adobada.class); final CtMethod method = adobada.getMethod("m4", factory.Type().INTEGER_PRIMITIVE, factory.Type().FLOAT_PRIMITIVE, factory.Type().STRING); final CtAssignment chainOfAssignment = method.getElements(new TypeFilter<>(CtAssignment.class)).get(0); assertNotNull(chainOfAssignment.getAssignment()); chainOfAssignment.getAssignment().delete(); assertNull(chainOfAssignment.getAssignment()); } }