blob: 63d8a55ea2f94bb62f2a458ff14eba7025b727da [file] [log] [blame]
/*
* Copyright (C) 2007-2010 JĂșlio Vilmar Gesser.
* Copyright (C) 2011, 2013-2016 The JavaParser Team.
*
* This file is part of JavaParser.
*
* JavaParser can be used either under the terms of
* a) the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* b) the terms of the Apache License
*
* You should have received a copy of both licenses in LICENCE.LGPL and
* LICENCE.APACHE. Please refer to those files for details.
*
* JavaParser is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*/
package com.github.javaparser.printer.lexicalpreservation.transformations.ast.body;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.type.PrimitiveType;
import com.github.javaparser.ast.type.TypeParameter;
import com.github.javaparser.printer.lexicalpreservation.AbstractLexicalPreservingTest;
import org.junit.jupiter.api.Test;
import static com.github.javaparser.StaticJavaParser.parseClassOrInterfaceType;
import static com.github.javaparser.ast.Modifier.Keyword.PROTECTED;
import static com.github.javaparser.ast.Modifier.Keyword.PUBLIC;
import static com.github.javaparser.ast.Modifier.createModifierList;
import static com.github.javaparser.utils.Utils.EOL;
/**
* Transforming ClassOrInterfaceDeclaration and verifying the LexicalPreservation works as expected.
*/
class ClassOrInterfaceDeclarationTransformationsTest extends AbstractLexicalPreservingTest {
protected ClassOrInterfaceDeclaration consider(String code) {
considerCode(code);
return cu.getType(0).asClassOrInterfaceDeclaration();
}
// Name
@Test
void settingName() {
ClassOrInterfaceDeclaration cid = consider("class A {}");
cid.setName("B");
assertTransformedToString("class B {}", cid);
}
// isInterface
@Test
void classToInterface() {
ClassOrInterfaceDeclaration cid = consider("class A {}");
cid.setInterface(true);
assertTransformedToString("interface A {}", cid);
}
@Test
void interfaceToClass() {
ClassOrInterfaceDeclaration cid = consider("interface A {}");
cid.setInterface(false);
assertTransformedToString("class A {}", cid);
}
// typeParameters
@Test
void addingTypeParameterWhenThereAreNone() {
ClassOrInterfaceDeclaration cid = consider("class A {}");
cid.addTypeParameter("T");
assertTransformedToString("class A<T> {}", cid);
}
@Test
void addingTypeParameterAsFirstWhenThereAreSome() {
ClassOrInterfaceDeclaration cid = consider("class A<U> {}");
cid.getTypeParameters().addFirst(new TypeParameter("T", new NodeList<>()));
assertTransformedToString("class A<T, U> {}", cid);
}
@Test
void addingTypeParameterAsLastWhenThereAreSome() {
ClassOrInterfaceDeclaration cid = consider("class A<U> {}");
cid.addTypeParameter("T");
assertTransformedToString("class A<U, T> {}", cid);
}
// extendedTypes
@Test
void addingExtendedTypes() {
ClassOrInterfaceDeclaration cid = consider("class A {}");
cid.addExtendedType("Foo");
assertTransformedToString("class A extends Foo {}", cid);
}
@Test
void removingExtendedTypes() {
ClassOrInterfaceDeclaration cid = consider("public class A extends Foo {}");
cid.getExtendedTypes().remove(0);
assertTransformedToString("public class A {}", cid);
}
@Test
void replacingExtendedTypes() {
ClassOrInterfaceDeclaration cid = consider("public class A extends Foo {}");
cid.getExtendedTypes().set(0, parseClassOrInterfaceType("Bar"));
assertTransformedToString("public class A extends Bar {}", cid);
}
// implementedTypes
@Test
void addingImplementedTypes() {
ClassOrInterfaceDeclaration cid = consider("class A {}");
cid.addImplementedType("Foo");
assertTransformedToString("class A implements Foo {}", cid);
}
@Test
void removingImplementedTypes() {
ClassOrInterfaceDeclaration cid = consider("public class A implements Foo {}");
cid.getImplementedTypes().remove(0);
assertTransformedToString("public class A {}", cid);
}
@Test
void replacingImplementedTypes() {
ClassOrInterfaceDeclaration cid = consider("public class A implements Foo {}");
cid.getImplementedTypes().set(0, parseClassOrInterfaceType("Bar"));
assertTransformedToString("public class A implements Bar {}", cid);
}
// Modifiers
@Test
void addingModifiers() {
ClassOrInterfaceDeclaration cid = consider("class A {}");
cid.setModifiers(createModifierList(PUBLIC));
assertTransformedToString("public class A {}", cid);
}
@Test
void removingModifiers() {
ClassOrInterfaceDeclaration cid = consider("public class A {}");
cid.setModifiers(new NodeList<>());
assertTransformedToString("class A {}", cid);
}
@Test
void replacingModifiers() {
ClassOrInterfaceDeclaration cid = consider("public class A {}");
cid.setModifiers(createModifierList(PROTECTED));
assertTransformedToString("protected class A {}", cid);
}
// members
@Test
void addingField() {
ClassOrInterfaceDeclaration cid = consider("class A {}");
cid.addField("int", "foo");
assertTransformedToString("class A {" + EOL + " int foo;" + EOL + "}", cid);
}
@Test
void removingField() {
ClassOrInterfaceDeclaration cid = consider("public class A { int foo; }");
cid.getMembers().remove(0);
assertTransformedToString("public class A { }", cid);
}
@Test
void replacingFieldWithAnotherField() {
ClassOrInterfaceDeclaration cid = consider("public class A {float f;}");
cid.getMembers().set(0, new FieldDeclaration(new NodeList<>(), new VariableDeclarator(PrimitiveType.intType(), "bar")));
assertTransformedToString("public class A {int bar;}", cid);
}
// Annotations
@Test
void removingAnnotations() {
ClassOrInterfaceDeclaration cid = consider(
"@Value" + EOL +
"public class A {}");
cid.getAnnotationByName("Value").get().remove();
assertTransformedToString("public class A {}", cid);
}
@Test
void removingAnnotationsWithSpaces() {
ClassOrInterfaceDeclaration cid = consider(
" @Value " + EOL +
"public class A {}");
cid.getAnnotationByName("Value").get().remove();
assertTransformedToString("public class A {}", cid);
}
// Javadoc
}