blob: 703b8144896a01eda1275e100acdfd951421a34f [file] [log] [blame]
// Copyright 2017 The Bazel Authors. All rights reserved.
//
// 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.google.devtools.build.android.desugar;
import static com.google.common.truth.Truth.assertThat;
import com.google.common.collect.Iterables;
import com.google.devtools.build.android.desugar.testdata.java8.InterfaceMethodParameters;
import com.google.devtools.build.android.desugar.testdata.java8.InterfaceMethodWithParam;
import com.google.devtools.build.android.desugar.testdata.java8.InterfaceMethodWithParam.MethodInvocations;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Variant of {@link DesugarJava8FunctionalTest} that expects default and static interface methods
* to be desugared
*/
@RunWith(JUnit4.class)
public final class DesugarDefaultMethodsFunctionalTest extends DesugarJava8FunctionalTest {
public DesugarDefaultMethodsFunctionalTest() {
super(/*expectBridgesFromSeparateTarget*/ true, /*expectDefaultMethods*/ false);
}
@Test
public void staticMethodsAreAbsentFromInterfaceBytecode() {
List<Method> staticMethods =
Arrays.stream(InterfaceMethodParameters.class.getDeclaredMethods())
.filter(method -> Modifier.isStatic(method.getModifiers()))
.collect(Collectors.toList());
assertThat(staticMethods).isEmpty();
}
@Test
public void defaultMethodsAreAbsentFromInterfaceBytecode() {
List<Method> defaultMethods =
Arrays.stream(InterfaceMethodParameters.class.getDeclaredMethods())
.filter(Method::isDefault)
.collect(Collectors.toList());
assertThat(defaultMethods).isEmpty();
}
@Test
public void invokeInterfaceStaticMethod() {
assertThat(InterfaceMethodWithParam.MethodInvocations.simpleComputeStatic(1234))
.isEqualTo(1234L);
}
@Test
public void invokeInterfaceDefaultMethod() {
assertThat(InterfaceMethodWithParam.MethodInvocations.simpleComputeDefault(1234))
.isEqualTo(1234L);
}
@Test
public void parameterNamesArePreservedOnDesugaredDefaultMethods() throws Exception {
Method desugaredDefaultMethod = MethodInvocations.inspectDesugaredDefaultMethod();
assertThat(desugaredDefaultMethod.getParameters()[0].getName())
.isEqualTo("v12525d61e4b10b3e27bc280dd61e56728e3e8c27");
}
@Test
public void parameterAnnotationsArePreservedOnDesugaredDefaultMethods() throws Exception {
Method desugaredDefaultMethod = MethodInvocations.inspectDesugaredDefaultMethod();
Annotation[][] parameterAnnotations = desugaredDefaultMethod.getParameterAnnotations();
assertThat(parameterAnnotations).hasLength(1);
assertThat(parameterAnnotations[0]).hasLength(1);
assertThat(parameterAnnotations[0][0]).isInstanceOf(InterfaceMethodWithParam.Foo.class);
}
@Test
public void methodAnnotationsArePreservedOnDesugaredDefaultMethods() throws Exception {
Method method = MethodInvocations.inspectDesugaredDefaultMethod();
List<Annotation> annotations = Arrays.asList(method.getAnnotations());
Annotation parameterAnnotation = Iterables.getOnlyElement(annotations);
assertThat(parameterAnnotation).isInstanceOf(InterfaceMethodWithParam.Foo.class);
InterfaceMethodWithParam.Foo fooInstance = (InterfaceMethodWithParam.Foo) parameterAnnotation;
assertThat(fooInstance.value()).isEqualTo("custom-attr-value-2");
}
@Test
public void methodReturnTypeAnnotationsArePreservedOnDesugaredDefaultMethods() throws Exception {
Method method = MethodInvocations.inspectDesugaredDefaultMethod();
List<Annotation> annotations = Arrays.asList(method.getAnnotatedReturnType().getAnnotations());
assertThat(Iterables.getOnlyElement(annotations))
.isInstanceOf(InterfaceMethodWithParam.TyFoo.class);
}
@Test
public void typeAnnotationsArePreservedOnDesugaredDefaultMethods() throws Exception {
Method desugaredDefaultMethod = MethodInvocations.inspectDesugaredDefaultMethod();
List<Parameter> parameters = Arrays.asList(desugaredDefaultMethod.getParameters());
List<Annotation> typeAnnotations =
Arrays.asList(Iterables.getOnlyElement(parameters).getAnnotatedType().getAnnotations());
assertThat(Iterables.getOnlyElement(typeAnnotations))
.isInstanceOf(InterfaceMethodWithParam.TyFoo.class);
}
/** Test for b/129719629. */
@Test
public void parameterNamesArePreservedOnStaticMethodCompanions() throws Exception {
Method method = InterfaceMethodWithParam.MethodInvocations.inspectCompanionOfStaticMethod();
assertThat(method.getParameters()).hasLength(1);
assertThat(method.getParameters()[0].getName())
.isEqualTo("v4897b02fddeda3bb31bc15b3cad0f6febc61508");
}
@Test
public void parameterAnnotationsArePreservedOnStaticMethodCompanions() throws Exception {
Method method = InterfaceMethodWithParam.MethodInvocations.inspectCompanionOfStaticMethod();
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
assertThat(parameterAnnotations).hasLength(1);
assertThat(parameterAnnotations[0]).hasLength(1);
assertThat(parameterAnnotations[0][0]).isInstanceOf(InterfaceMethodWithParam.Foo.class);
}
@Test
public void methodParameterAnnotationsArePreservedOnStaticMethodCompanions() throws Exception {
Method method = InterfaceMethodWithParam.MethodInvocations.inspectCompanionOfStaticMethod();
Annotation[] parameterAnnotations = method.getAnnotations();
assertThat(parameterAnnotations).hasLength(1);
assertThat(parameterAnnotations[0]).isInstanceOf(InterfaceMethodWithParam.Foo.class);
}
@Test
public void typeAnnotationsArePreservedOnStaticMethodCompanions() throws Exception {
Method method = InterfaceMethodWithParam.MethodInvocations.inspectCompanionOfStaticMethod();
List<Parameter> parameterAnnotations = Arrays.asList(method.getParameters());
List<Annotation> typeAnnoations =
Arrays.asList(
Iterables.getOnlyElement(parameterAnnotations).getAnnotatedType().getAnnotations());
assertThat(Iterables.getOnlyElement(typeAnnoations))
.isInstanceOf(InterfaceMethodWithParam.TyFoo.class);
}
@Test
public void methodReturnTypeAnnotationsArePreservedOnStaticMethodCompanions() throws Exception {
Method method = InterfaceMethodWithParam.MethodInvocations.inspectCompanionOfStaticMethod();
List<Annotation> returnTypeAnnotations =
Arrays.asList(method.getAnnotatedReturnType().getAnnotations());
assertThat(Iterables.getOnlyElement(returnTypeAnnotations))
.isInstanceOf(InterfaceMethodWithParam.TyFoo.class);
}
/** Test for b/129719629. */
@Test
public void parameterNamesAreOmittedOnDefaultMethodCompanions() throws Exception {
Method method =
InterfaceMethodWithParam.MethodInvocations.inspectCompanionMethodOfDefaultMethod();
assertThat(method.getParameters()).hasLength(2);
assertThat(method.getParameters()[1].getName())
.isNotEqualTo("v12525d61e4b10b3e27bc280dd61e56728e3e8c27");
}
@Test
public void parameterAnnotationsAreOmittedOnDefaultMethodCompanions() throws Exception {
Method method =
InterfaceMethodWithParam.MethodInvocations.inspectCompanionMethodOfDefaultMethod();
assertThat(method.getParameterAnnotations()).hasLength(2);
assertThat(method.getParameterAnnotations()[0]).isEmpty();
assertThat(method.getParameterAnnotations()[1]).isEmpty();
}
@Test
public void methodAnnotationsArePreservedOnDefaultMethodCompanions() throws Exception {
Method method =
InterfaceMethodWithParam.MethodInvocations.inspectCompanionMethodOfDefaultMethod();
List<Annotation> annotations = Arrays.asList(method.getAnnotations());
Annotation methodAnnotation = Iterables.getOnlyElement(annotations);
assertThat(methodAnnotation).isInstanceOf(InterfaceMethodWithParam.Foo.class);
InterfaceMethodWithParam.Foo fooInstance = (InterfaceMethodWithParam.Foo) methodAnnotation;
assertThat(fooInstance.value()).isEqualTo("custom-attr-value-2");
}
@Test
public void methodReturnTypeAnnotationsAreOmittedOnDefaultMethodCompanions() throws Exception {
Method method =
InterfaceMethodWithParam.MethodInvocations.inspectCompanionMethodOfDefaultMethod();
Annotation[] methodReturnTypeAnnotations = method.getAnnotatedReturnType().getAnnotations();
assertThat(methodReturnTypeAnnotations).isEmpty();
}
@Test
public void parameterTypeAnnotationsAreOmittedOnDefaultMethodCompanion() throws Exception {
Method method =
InterfaceMethodWithParam.MethodInvocations.inspectCompanionMethodOfDefaultMethod();
List<Parameter> parameterAnnotations = Arrays.asList(method.getParameters());
assertThat(parameterAnnotations).hasSize(2);
assertThat(parameterAnnotations.get(0).getAnnotatedType().getAnnotations()).isEmpty();
assertThat(parameterAnnotations.get(1).getAnnotatedType().getAnnotations()).isEmpty();
}
}