1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2017 The Dagger Authors. 3*f585d8a3SJacky Wang * 4*f585d8a3SJacky Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5*f585d8a3SJacky Wang * you may not use this file except in compliance with the License. 6*f585d8a3SJacky Wang * You may obtain a copy of the License at 7*f585d8a3SJacky Wang * 8*f585d8a3SJacky Wang * http://www.apache.org/licenses/LICENSE-2.0 9*f585d8a3SJacky Wang * 10*f585d8a3SJacky Wang * Unless required by applicable law or agreed to in writing, software 11*f585d8a3SJacky Wang * distributed under the License is distributed on an "AS IS" BASIS, 12*f585d8a3SJacky Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*f585d8a3SJacky Wang * See the License for the specific language governing permissions and 14*f585d8a3SJacky Wang * limitations under the License. 15*f585d8a3SJacky Wang */ 16*f585d8a3SJacky Wang 17*f585d8a3SJacky Wang package dagger.internal.codegen; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import static com.google.common.truth.Truth.assertThat; 20*f585d8a3SJacky Wang import static dagger.internal.codegen.xprocessing.XProcessingEnvs.getPrimitiveIntType; 21*f585d8a3SJacky Wang 22*f585d8a3SJacky Wang import androidx.room.compiler.processing.XProcessingEnv; 23*f585d8a3SJacky Wang import androidx.room.compiler.processing.XType; 24*f585d8a3SJacky Wang import com.google.testing.compile.CompilationRule; 25*f585d8a3SJacky Wang import com.squareup.javapoet.ClassName; 26*f585d8a3SJacky Wang import dagger.Component; 27*f585d8a3SJacky Wang import dagger.internal.codegen.javac.JavacPluginModule; 28*f585d8a3SJacky Wang import dagger.internal.codegen.javapoet.Expression; 29*f585d8a3SJacky Wang import javax.inject.Inject; 30*f585d8a3SJacky Wang import javax.inject.Singleton; 31*f585d8a3SJacky Wang import org.junit.Before; 32*f585d8a3SJacky Wang import org.junit.Rule; 33*f585d8a3SJacky Wang import org.junit.Test; 34*f585d8a3SJacky Wang import org.junit.runner.RunWith; 35*f585d8a3SJacky Wang import org.junit.runners.JUnit4; 36*f585d8a3SJacky Wang 37*f585d8a3SJacky Wang @RunWith(JUnit4.class) 38*f585d8a3SJacky Wang public class ExpressionTest { 39*f585d8a3SJacky Wang @Rule public CompilationRule compilationRule = new CompilationRule(); 40*f585d8a3SJacky Wang 41*f585d8a3SJacky Wang @Inject XProcessingEnv processingEnv; 42*f585d8a3SJacky Wang 43*f585d8a3SJacky Wang interface Supertype {} 44*f585d8a3SJacky Wang 45*f585d8a3SJacky Wang interface Subtype extends Supertype {} 46*f585d8a3SJacky Wang 47*f585d8a3SJacky Wang @Before setUp()48*f585d8a3SJacky Wang public void setUp() { 49*f585d8a3SJacky Wang DaggerExpressionTest_TestComponent.builder() 50*f585d8a3SJacky Wang .javacPluginModule( 51*f585d8a3SJacky Wang new JavacPluginModule(compilationRule.getElements(), compilationRule.getTypes())) 52*f585d8a3SJacky Wang .build() 53*f585d8a3SJacky Wang .inject(this); 54*f585d8a3SJacky Wang } 55*f585d8a3SJacky Wang 56*f585d8a3SJacky Wang @Test castTo()57*f585d8a3SJacky Wang public void castTo() { 58*f585d8a3SJacky Wang XType subtype = type(Subtype.class); 59*f585d8a3SJacky Wang XType supertype = type(Supertype.class); 60*f585d8a3SJacky Wang Expression expression = Expression.create(subtype, "new $T() {}", subtype.getTypeName()); 61*f585d8a3SJacky Wang 62*f585d8a3SJacky Wang Expression castTo = expression.castTo(supertype); 63*f585d8a3SJacky Wang 64*f585d8a3SJacky Wang assertThat(castTo.type().getTypeName()).isEqualTo(supertype.getTypeName()); 65*f585d8a3SJacky Wang assertThat(castTo.codeBlock().toString()) 66*f585d8a3SJacky Wang .isEqualTo( 67*f585d8a3SJacky Wang "(dagger.internal.codegen.ExpressionTest.Supertype) " 68*f585d8a3SJacky Wang + "new dagger.internal.codegen.ExpressionTest.Subtype() {}"); 69*f585d8a3SJacky Wang } 70*f585d8a3SJacky Wang 71*f585d8a3SJacky Wang @Test box()72*f585d8a3SJacky Wang public void box() { 73*f585d8a3SJacky Wang XType primitiveInt = getPrimitiveIntType(processingEnv); 74*f585d8a3SJacky Wang 75*f585d8a3SJacky Wang Expression primitiveExpression = Expression.create(primitiveInt, "5"); 76*f585d8a3SJacky Wang Expression boxedExpression = primitiveExpression.box(); 77*f585d8a3SJacky Wang 78*f585d8a3SJacky Wang assertThat(boxedExpression.codeBlock().toString()).isEqualTo("(java.lang.Integer) 5"); 79*f585d8a3SJacky Wang assertThat(boxedExpression.type().getTypeName()).isEqualTo(type(Integer.class).getTypeName()); 80*f585d8a3SJacky Wang } 81*f585d8a3SJacky Wang type(Class<?> clazz)82*f585d8a3SJacky Wang private XType type(Class<?> clazz) { 83*f585d8a3SJacky Wang return processingEnv.requireType(ClassName.get(clazz)); 84*f585d8a3SJacky Wang } 85*f585d8a3SJacky Wang 86*f585d8a3SJacky Wang @Singleton 87*f585d8a3SJacky Wang @Component(modules = JavacPluginModule.class) 88*f585d8a3SJacky Wang interface TestComponent { inject(ExpressionTest test)89*f585d8a3SJacky Wang void inject(ExpressionTest test); 90*f585d8a3SJacky Wang } 91*f585d8a3SJacky Wang } 92