blob: c3effca5a2b0ab388e74357738eaf16406c47522 [file] [log] [blame]
/*
* Copyright (C) 2015 Square, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.squareup.javapoet;
import com.google.testing.compile.CompilationRule;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nullable;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.util.Elements;
import org.junit.Before;
import org.junit.Rule;
import javax.lang.model.element.Modifier;
import org.junit.Test;
import static com.google.common.truth.Truth.assertThat;
import static com.squareup.javapoet.TestUtil.findFirst;
import static javax.lang.model.util.ElementFilter.fieldsIn;
import static javax.lang.model.util.ElementFilter.methodsIn;
import static org.junit.Assert.fail;
public class ParameterSpecTest {
@Rule public final CompilationRule compilation = new CompilationRule();
private Elements elements;
@Before public void setUp() {
elements = compilation.getElements();
}
private TypeElement getElement(Class<?> clazz) {
return elements.getTypeElement(clazz.getCanonicalName());
}
@Test public void equalsAndHashCode() {
ParameterSpec a = ParameterSpec.builder(int.class, "foo").build();
ParameterSpec b = ParameterSpec.builder(int.class, "foo").build();
assertThat(a.equals(b)).isTrue();
assertThat(a.hashCode()).isEqualTo(b.hashCode());
assertThat(a.toString()).isEqualTo(b.toString());
a = ParameterSpec.builder(int.class, "i").addModifiers(Modifier.STATIC).build();
b = ParameterSpec.builder(int.class, "i").addModifiers(Modifier.STATIC).build();
assertThat(a.equals(b)).isTrue();
assertThat(a.hashCode()).isEqualTo(b.hashCode());
assertThat(a.toString()).isEqualTo(b.toString());
}
@Test public void nullAnnotationsAddition() {
try {
ParameterSpec.builder(int.class, "foo").addAnnotations(null);
fail();
} catch (Exception e) {
assertThat(e.getMessage())
.isEqualTo("annotationSpecs == null");
}
}
final class VariableElementFieldClass {
String name;
}
@Test public void fieldVariableElement() {
TypeElement classElement = getElement(VariableElementFieldClass.class);
List<VariableElement> methods = fieldsIn(elements.getAllMembers(classElement));
VariableElement element = findFirst(methods, "name");
try {
ParameterSpec.get(element);
fail();
} catch (IllegalArgumentException exception) {
assertThat(exception).hasMessageThat().isEqualTo("element is not a parameter");
}
}
final class VariableElementParameterClass {
public void foo(@Nullable final String bar) {
}
}
@Test public void parameterVariableElement() {
TypeElement classElement = getElement(VariableElementParameterClass.class);
List<ExecutableElement> methods = methodsIn(elements.getAllMembers(classElement));
ExecutableElement element = findFirst(methods, "foo");
VariableElement parameterElement = element.getParameters().get(0);
assertThat(ParameterSpec.get(parameterElement).toString())
.isEqualTo("@javax.annotation.Nullable java.lang.String arg0");
}
@Test public void addNonFinalModifier() {
List<Modifier> modifiers = new ArrayList<>();
modifiers.add(Modifier.FINAL);
modifiers.add(Modifier.PUBLIC);
try {
ParameterSpec.builder(int.class, "foo")
.addModifiers(modifiers);
fail();
} catch (Exception e) {
assertThat(e.getMessage()).isEqualTo("unexpected parameter modifier: public");
}
}
@Test public void modifyAnnotations() {
ParameterSpec.Builder builder = ParameterSpec.builder(int.class, "foo")
.addAnnotation(Override.class)
.addAnnotation(SuppressWarnings.class);
builder.annotations.remove(1);
assertThat(builder.build().annotations).hasSize(1);
}
@Test public void modifyModifiers() {
ParameterSpec.Builder builder = ParameterSpec.builder(int.class, "foo")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC);
builder.modifiers.remove(1);
assertThat(builder.build().modifiers).containsExactly(Modifier.PUBLIC);
}
}