175565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti/*
275565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * Copyright (C) 2007-2010 Júlio Vilmar Gesser.
375565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * Copyright (C) 2011, 2013-2016 The JavaParser Team.
475565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti *
575565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * This file is part of JavaParser.
675565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti *
775565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * JavaParser can be used either under the terms of
875565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * a) the GNU Lesser General Public License as published by
975565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti *     the Free Software Foundation, either version 3 of the License, or
1075565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti *     (at your option) any later version.
1175565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * b) the terms of the Apache License
1275565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti *
1375565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * You should have received a copy of both licenses in LICENCE.LGPL and
1475565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * LICENCE.APACHE. Please refer to those files for details.
1575565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti *
1675565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * JavaParser is distributed in the hope that it will be useful,
1775565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * but WITHOUT ANY WARRANTY; without even the implied warranty of
1875565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1975565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * GNU Lesser General Public License for more details.
2075565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti */
2175565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
22140ec181289990affd436cc4320c9abb59314f8aFederico Tomassettipackage com.github.javaparser.printer.lexicalpreservation.transformations.ast.body;
2375565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
2475565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassettiimport com.github.javaparser.ast.Modifier;
251ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassettiimport com.github.javaparser.ast.NodeList;
2675565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassettiimport com.github.javaparser.ast.body.AnnotationMemberDeclaration;
27907aca107a26ba902127213aa530261d4d40ea77Federico Tomassettiimport com.github.javaparser.ast.expr.IntegerLiteralExpr;
281ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassettiimport com.github.javaparser.ast.expr.Name;
291ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassettiimport com.github.javaparser.ast.expr.NormalAnnotationExpr;
30140ec181289990affd436cc4320c9abb59314f8aFederico Tomassettiimport com.github.javaparser.printer.lexicalpreservation.AbstractLexicalPreservingTest;
3175565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassettiimport org.junit.Test;
3275565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
3375565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassettiimport java.util.EnumSet;
3475565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
35323364614fbfb579d4d2e82a7f80414d2c11944bFederico Tomassettiimport static com.github.javaparser.utils.Utils.EOL;
3675565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassettiimport static org.junit.Assert.assertEquals;
37530169d1045593c598adb7ab63334c62de2fa141Federico Tomassettiimport static org.junit.Assert.assertTrue;
3875565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
3975565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti/**
4075565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti * Transforming AnnotationMemberDeclaration and verifying the LexicalPreservation works as expected.
4175565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti */
4275565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassettipublic class AnnotationMemberDeclarationTransformationsTest extends AbstractLexicalPreservingTest {
4375565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
44c5c19b4b5f1a3c3b4ed52001f0cd28225e211ca7Federico Tomassetti    protected AnnotationMemberDeclaration consider(String code) {
4575565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti        considerCode("@interface AD { " + code + " }");
46872ea1cf8fce25fc8ad7390eb8779ad878f2f1d4Danny van Bruggen        return cu.getAnnotationDeclarationByName("AD").get().getMember(0).asAnnotationMemberDeclaration();
4775565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti    }
4875565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
49907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    // Name
50907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti
5175565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti    @Test
521016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void changingName() {
5375565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti        AnnotationMemberDeclaration md = consider("int foo();");
5475565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti        md.setName("bar");
5575565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti        assertTransformedToString("int bar();", md);
5675565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti    }
5775565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
5875565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti    // Type
5975565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
60907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    @Test
611016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void changingType() {
62907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        AnnotationMemberDeclaration md = consider("int foo();");
63907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        md.setType("String");
64907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        assertTransformedToString("String foo();", md);
65907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    }
66907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti
6775565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti    // Modifiers
6875565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
69907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    @Test
701016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void addingModifiers() {
71907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        AnnotationMemberDeclaration md = consider("int foo();");
72907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        md.setModifiers(EnumSet.of(Modifier.PUBLIC));
73907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        assertTransformedToString("public int foo();", md);
74907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    }
75907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti
76907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    @Test
771016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void removingModifiers() {
78907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        AnnotationMemberDeclaration md = consider("public int foo();");
79907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        md.setModifiers(EnumSet.noneOf(Modifier.class));
80907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        assertTransformedToString("int foo();", md);
81907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    }
82907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti
83907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    @Test
841016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void replacingModifiers() {
85907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        AnnotationMemberDeclaration md = consider("public int foo();");
86907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        md.setModifiers(EnumSet.of(Modifier.PROTECTED));
87907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        assertTransformedToString("protected int foo();", md);
88907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    }
89907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti
9075565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti    // Default value
9175565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
92907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    @Test
931016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void addingDefaultValue() {
94907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        AnnotationMemberDeclaration md = consider("int foo();");
95907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        md.setDefaultValue(new IntegerLiteralExpr("10"));
96907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        assertTransformedToString("int foo() default 10;", md);
97907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    }
98907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti
99907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    @Test
1001016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void removingDefaultValue() {
101907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        AnnotationMemberDeclaration md = consider("int foo() default 10;");
102907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        assertEquals(true, md.getDefaultValue().get().remove());
103907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        assertTransformedToString("int foo();", md);
104907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    }
105907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti
106907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    @Test
1071016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void replacingDefaultValue() {
108907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        AnnotationMemberDeclaration md = consider("int foo() default 10;");
109907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        md.setDefaultValue(new IntegerLiteralExpr("11"));
110907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti        assertTransformedToString("int foo() default 11;", md);
111907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti    }
112907aca107a26ba902127213aa530261d4d40ea77Federico Tomassetti
11375565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti    // Annotations
11475565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
1151ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti    @Test
1161016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void addingAnnotation() {
1171ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti        AnnotationMemberDeclaration it = consider("int foo();");
1181ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti        it.addAnnotation("myAnno");
1191016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen        assertTransformedToString("@myAnno()" + EOL + "int foo();", it);
1201ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti    }
1211ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti
1221ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti    @Test
1231016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void addingTwoAnnotations() {
1241016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen        AnnotationMemberDeclaration it = consider("int foo();");
1251016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen        it.addAnnotation("myAnno");
1261016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen        it.addAnnotation("myAnno2");
1271016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen        assertTransformedToString("@myAnno()" + EOL + "@myAnno2()" + EOL + "int foo();", it);
1281016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    }
1291016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen
1301016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    @Test
1311016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void removingAnnotationOnSomeLine() {
1321ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti        AnnotationMemberDeclaration it = consider("@myAnno int foo();");
1331ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti        it.getAnnotations().remove(0);
1341ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti        assertTransformedToString("int foo();", it);
1351ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti    }
1361ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti
1371ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti    @Test
1381016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void removingAnnotationOnPrevLine() {
139323364614fbfb579d4d2e82a7f80414d2c11944bFederico Tomassetti        AnnotationMemberDeclaration it = consider("@myAnno" + EOL + "int foo();");
1401ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti        it.getAnnotations().remove(0);
1411ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti        assertTransformedToString("int foo();", it);
1421ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti    }
1431ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti
1441ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti    @Test
1451016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void replacingAnnotation() {
1461ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti        AnnotationMemberDeclaration it = consider("@myAnno int foo();");
1471ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti        it.getAnnotations().set(0, new NormalAnnotationExpr(new Name("myOtherAnno"), new NodeList<>()));
148ed7f4a6532043b5ac8c8da55923fbd91f72ec574Federico Tomassetti        assertTransformedToString("@myOtherAnno() int foo();", it);
1491ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti    }
1501ad5ce425842135b0e71f371a54e7ce7446fdc4dFederico Tomassetti
15175565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti    // Javadoc
15275565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti
153530169d1045593c598adb7ab63334c62de2fa141Federico Tomassetti    @Test
1541016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void addingJavadoc() {
155530169d1045593c598adb7ab63334c62de2fa141Federico Tomassetti        AnnotationMemberDeclaration it = consider("int foo();");
156ec6b8a24af3e65b6d869ee96d00daca12f7247feFederico Tomassetti        it.setJavadocComment("Cool this annotation!");
1578e1dfeb3c2c1c651b5b14bd5c5ff155ea8e30bd5Danny van Bruggen        assertTransformedToString("@interface AD { /** Cool this annotation!*/" + EOL +
158530169d1045593c598adb7ab63334c62de2fa141Federico Tomassetti                "int foo(); }", it.getParentNode().get());
159530169d1045593c598adb7ab63334c62de2fa141Federico Tomassetti    }
160530169d1045593c598adb7ab63334c62de2fa141Federico Tomassetti
161530169d1045593c598adb7ab63334c62de2fa141Federico Tomassetti    @Test
1621016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void removingJavadoc() {
1638e1dfeb3c2c1c651b5b14bd5c5ff155ea8e30bd5Danny van Bruggen        AnnotationMemberDeclaration it = consider("/** Cool this annotation!*/ int foo();");
164f75eb59f8930d3d53864470e115772345f40363cFederico Tomassetti        assertTrue(it.getJavadocComment().get().remove());
165530169d1045593c598adb7ab63334c62de2fa141Federico Tomassetti        assertTransformedToString("@interface AD {  int foo(); }", it.getParentNode().get());
166530169d1045593c598adb7ab63334c62de2fa141Federico Tomassetti    }
167530169d1045593c598adb7ab63334c62de2fa141Federico Tomassetti
168530169d1045593c598adb7ab63334c62de2fa141Federico Tomassetti    @Test
1691016ea6bead76127375a4c7b98c82b28fc133f0bDanny van Bruggen    public void replacingJavadoc() {
1708e1dfeb3c2c1c651b5b14bd5c5ff155ea8e30bd5Danny van Bruggen        AnnotationMemberDeclaration it = consider("/** Cool this annotation!*/ int foo();");
171ec6b8a24af3e65b6d869ee96d00daca12f7247feFederico Tomassetti        it.setJavadocComment("Super extra cool this annotation!!!");
1728e1dfeb3c2c1c651b5b14bd5c5ff155ea8e30bd5Danny van Bruggen        assertTransformedToString("@interface AD { /** Super extra cool this annotation!!!*/ int foo(); }", it.getParentNode().get());
173530169d1045593c598adb7ab63334c62de2fa141Federico Tomassetti    }
174530169d1045593c598adb7ab63334c62de2fa141Federico Tomassetti
17575565287a0809c7734b1e8ed12e18fd27c0f68caFederico Tomassetti}
176