blob: e740cb43dcc41763440a2c47cf14e1e2e60ec4f1 [file] [log] [blame]
/*
* Copyright (C) 2022 The Dagger Authors.
*
* 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 dagger.internal.codegen;
import static com.google.common.truth.Truth.assertThat;
import androidx.room.compiler.processing.XAnnotation;
import androidx.room.compiler.processing.XProcessingEnv;
import androidx.room.compiler.processing.XTypeElement;
import com.google.testing.compile.CompilationRule;
import com.squareup.javapoet.ClassName;
import dagger.Component;
import dagger.internal.codegen.javac.JavacPluginModule;
import dagger.internal.codegen.xprocessing.XAnnotations;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class XAnnotationsToStableStringTest {
static final class Foo {}
enum MyEnum {
V1,
V2
}
@interface SingleValueWithCustomNameAnnotation {
Class<?> classValue();
}
@interface SingleValueWithDefaultAnnotation {
Class<?> value() default Object.class;
}
@interface SingleValueAnnotation {
Class<?> value();
}
@interface MultiValueAnnotation {
MyEnum enumValue();
Class<?> classValue();
boolean booleanValue();
byte byteValue();
char charValue();
int intValue();
long longValue();
short shortValue();
float floatValue();
double doubleValue();
String stringValue();
String stringWithDefaultValue() default "Default value";
String[] stringWithMultipleArrayValue();
String[] stringWithSingleArrayValue();
SingleValueAnnotation[] singleValueAnnotations();
}
@SingleValueAnnotation(value = Foo.class)
@SingleValueWithDefaultAnnotation
@SingleValueWithCustomNameAnnotation(classValue = Foo.class)
@MultiValueAnnotation(
// Note: the value orders are purposely randomized for this test
doubleValue = 13.2,
longValue = 7L,
stringWithSingleArrayValue = {"STRING_VALUE1"},
byteValue = 3,
enumValue = MyEnum.V1,
charValue = 'c',
stringWithMultipleArrayValue = {"STRING_VALUE1", "STRING_VALUE2"},
shortValue = 9,
classValue = Foo.class,
stringValue = "STRING_VALUE1",
booleanValue = false,
floatValue = 11.1f,
singleValueAnnotations = {
@SingleValueAnnotation(Object.class),
@SingleValueAnnotation(Foo.class),
@SingleValueAnnotation(String.class)
},
intValue = 5)
interface Usage {}
@Rule public CompilationRule compilationRule = new CompilationRule();
@Inject XProcessingEnv processingEnv;
private final String testName = getClass().getCanonicalName();
@Before
public void setUp() {
TestComponent.create(compilationRule.getElements(), compilationRule.getTypes()).inject(this);
}
@Test
public void multiValueAnnotationTest() {
XTypeElement typeElement = processingEnv.requireTypeElement(Usage.class.getCanonicalName());
XAnnotation annotation = typeElement.getAnnotation(ClassName.get(MultiValueAnnotation.class));
assertThat(XAnnotations.toStableString(annotation))
.isEqualTo(
String.format(
"@%1$s.MultiValueAnnotation("
+ "enumValue=V1, "
+ "classValue=%1$s.Foo, "
+ "booleanValue=false, "
+ "byteValue=3, "
+ "charValue='c', "
+ "intValue=5, "
+ "longValue=7, "
+ "shortValue=9, "
+ "floatValue=11.1, "
+ "doubleValue=13.2, "
+ "stringValue=\"STRING_VALUE1\", "
+ "stringWithDefaultValue=\"Default value\", "
+ "stringWithMultipleArrayValue={\"STRING_VALUE1\", \"STRING_VALUE2\"}, "
+ "stringWithSingleArrayValue={\"STRING_VALUE1\"}, "
+ "singleValueAnnotations={"
+ "@%1$s.SingleValueAnnotation(java.lang.Object), "
+ "@%1$s.SingleValueAnnotation(%1$s.Foo), "
+ "@%1$s.SingleValueAnnotation(java.lang.String)"
+ "})",
testName));
}
@Test
public void singleValueAnnotationTest() {
XTypeElement typeElement = processingEnv.requireTypeElement(Usage.class.getCanonicalName());
XAnnotation annotation = typeElement.getAnnotation(ClassName.get(SingleValueAnnotation.class));
assertThat(XAnnotations.toStableString(annotation))
.isEqualTo(String.format("@%1$s.SingleValueAnnotation(%1$s.Foo)", testName));
}
@Test
public void singleValueWithDefaultAnnotationTest() {
XTypeElement typeElement = processingEnv.requireTypeElement(Usage.class.getCanonicalName());
XAnnotation annotation =
typeElement.getAnnotation(ClassName.get(SingleValueWithDefaultAnnotation.class));
assertThat(XAnnotations.toStableString(annotation))
.isEqualTo(
String.format("@%1$s.SingleValueWithDefaultAnnotation(java.lang.Object)", testName));
}
@Test
public void singleValueWithCustomNameAnnotationTest() {
XTypeElement typeElement = processingEnv.requireTypeElement(Usage.class.getCanonicalName());
XAnnotation annotation =
typeElement.getAnnotation(ClassName.get(SingleValueWithCustomNameAnnotation.class));
assertThat(XAnnotations.toStableString(annotation))
.isEqualTo(
String.format(
"@%1$s.SingleValueWithCustomNameAnnotation(classValue=%1$s.Foo)", testName));
}
@Singleton
@Component(modules = JavacPluginModule.class)
interface TestComponent {
static TestComponent create(Elements elements, Types types) {
return DaggerXAnnotationsToStableStringTest_TestComponent.builder()
.javacPluginModule(new JavacPluginModule(elements, types))
.build();
}
void inject(XAnnotationsToStableStringTest test);
}
}