1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2015 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.functional.cycle; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import static com.google.common.truth.Truth.assertThat; 20*f585d8a3SJacky Wang 21*f585d8a3SJacky Wang import dagger.functional.cycle.Cycles.A; 22*f585d8a3SJacky Wang import dagger.functional.cycle.Cycles.BindsCycleComponent; 23*f585d8a3SJacky Wang import dagger.functional.cycle.Cycles.C; 24*f585d8a3SJacky Wang import dagger.functional.cycle.Cycles.ChildCycleComponent; 25*f585d8a3SJacky Wang import dagger.functional.cycle.Cycles.CycleComponent; 26*f585d8a3SJacky Wang import dagger.functional.cycle.Cycles.CycleMapComponent; 27*f585d8a3SJacky Wang import dagger.functional.cycle.Cycles.S; 28*f585d8a3SJacky Wang import dagger.functional.cycle.Cycles.SelfCycleComponent; 29*f585d8a3SJacky Wang import org.junit.Test; 30*f585d8a3SJacky Wang import org.junit.runner.RunWith; 31*f585d8a3SJacky Wang import org.junit.runners.JUnit4; 32*f585d8a3SJacky Wang 33*f585d8a3SJacky Wang @RunWith(JUnit4.class) 34*f585d8a3SJacky Wang public class CycleTest { 35*f585d8a3SJacky Wang @Test providerIndirectionSelfCycle()36*f585d8a3SJacky Wang public void providerIndirectionSelfCycle() { 37*f585d8a3SJacky Wang SelfCycleComponent selfCycleComponent = DaggerCycles_SelfCycleComponent.create(); 38*f585d8a3SJacky Wang S s = selfCycleComponent.s(); 39*f585d8a3SJacky Wang assertThat(s.sProvider.get()).isNotNull(); 40*f585d8a3SJacky Wang } 41*f585d8a3SJacky Wang 42*f585d8a3SJacky Wang @Test providerIndirectionCycle()43*f585d8a3SJacky Wang public void providerIndirectionCycle() { 44*f585d8a3SJacky Wang CycleComponent cycleComponent = DaggerCycles_CycleComponent.create(); 45*f585d8a3SJacky Wang A a = cycleComponent.a(); 46*f585d8a3SJacky Wang C c = cycleComponent.c(); 47*f585d8a3SJacky Wang assertThat(c.aProvider.get()).isNotNull(); 48*f585d8a3SJacky Wang assertThat(a.b.c.aProvider.get()).isNotNull(); 49*f585d8a3SJacky Wang assertThat(a.e.d.b.c.aProvider.get()).isNotNull(); 50*f585d8a3SJacky Wang } 51*f585d8a3SJacky Wang 52*f585d8a3SJacky Wang @Test lazyIndirectionSelfCycle()53*f585d8a3SJacky Wang public void lazyIndirectionSelfCycle() { 54*f585d8a3SJacky Wang SelfCycleComponent selfCycleComponent = DaggerCycles_SelfCycleComponent.create(); 55*f585d8a3SJacky Wang S s = selfCycleComponent.s(); 56*f585d8a3SJacky Wang assertThat(s.sLazy.get()).isNotNull(); 57*f585d8a3SJacky Wang } 58*f585d8a3SJacky Wang 59*f585d8a3SJacky Wang @Test lazyIndirectionCycle()60*f585d8a3SJacky Wang public void lazyIndirectionCycle() { 61*f585d8a3SJacky Wang CycleComponent cycleComponent = DaggerCycles_CycleComponent.create(); 62*f585d8a3SJacky Wang A a = cycleComponent.a(); 63*f585d8a3SJacky Wang C c = cycleComponent.c(); 64*f585d8a3SJacky Wang assertThat(c.aLazy.get()).isNotNull(); 65*f585d8a3SJacky Wang assertThat(a.b.c.aLazy.get()).isNotNull(); 66*f585d8a3SJacky Wang assertThat(a.e.d.b.c.aLazy.get()).isNotNull(); 67*f585d8a3SJacky Wang } 68*f585d8a3SJacky Wang 69*f585d8a3SJacky Wang @Test subcomponentIndirectionCycle()70*f585d8a3SJacky Wang public void subcomponentIndirectionCycle() { 71*f585d8a3SJacky Wang ChildCycleComponent childCycleComponent = DaggerCycles_CycleComponent.create().child(); 72*f585d8a3SJacky Wang A a = childCycleComponent.a(); 73*f585d8a3SJacky Wang assertThat(a.b.c.aProvider.get()).isNotNull(); 74*f585d8a3SJacky Wang assertThat(a.e.d.b.c.aProvider.get()).isNotNull(); 75*f585d8a3SJacky Wang } 76*f585d8a3SJacky Wang 77*f585d8a3SJacky Wang @Test providerMapIndirectionCycle()78*f585d8a3SJacky Wang public void providerMapIndirectionCycle() { 79*f585d8a3SJacky Wang CycleMapComponent cycleMapComponent = DaggerCycles_CycleMapComponent.create(); 80*f585d8a3SJacky Wang assertThat(cycleMapComponent.y()).isNotNull(); 81*f585d8a3SJacky Wang assertThat(cycleMapComponent.y().mapOfProvidersOfX).containsKey("X"); 82*f585d8a3SJacky Wang assertThat(cycleMapComponent.y().mapOfProvidersOfX.get("X")).isNotNull(); 83*f585d8a3SJacky Wang assertThat(cycleMapComponent.y().mapOfProvidersOfX.get("X").get()).isNotNull(); 84*f585d8a3SJacky Wang assertThat(cycleMapComponent.y().mapOfProvidersOfX.get("X").get().y).isNotNull(); 85*f585d8a3SJacky Wang assertThat(cycleMapComponent.y().mapOfProvidersOfX).hasSize(1); 86*f585d8a3SJacky Wang assertThat(cycleMapComponent.y().mapOfProvidersOfY).containsKey("Y"); 87*f585d8a3SJacky Wang assertThat(cycleMapComponent.y().mapOfProvidersOfY.get("Y")).isNotNull(); 88*f585d8a3SJacky Wang assertThat(cycleMapComponent.y().mapOfProvidersOfY.get("Y").get()).isNotNull(); 89*f585d8a3SJacky Wang assertThat(cycleMapComponent.y().mapOfProvidersOfY.get("Y").get().mapOfProvidersOfX).hasSize(1); 90*f585d8a3SJacky Wang assertThat(cycleMapComponent.y().mapOfProvidersOfY.get("Y").get().mapOfProvidersOfY).hasSize(1); 91*f585d8a3SJacky Wang assertThat(cycleMapComponent.y().mapOfProvidersOfY).hasSize(1); 92*f585d8a3SJacky Wang } 93*f585d8a3SJacky Wang 94*f585d8a3SJacky Wang /** 95*f585d8a3SJacky Wang * Tests that a cycle where a {@code @Binds} binding depends on a binding that has to be deferred 96*f585d8a3SJacky Wang * works. 97*f585d8a3SJacky Wang */ 98*f585d8a3SJacky Wang @Test cycleWithDeferredBinds()99*f585d8a3SJacky Wang public void cycleWithDeferredBinds() { 100*f585d8a3SJacky Wang BindsCycleComponent bindsCycleComponent = DaggerCycles_BindsCycleComponent.create(); 101*f585d8a3SJacky Wang assertThat(bindsCycleComponent.bar()).isNotNull(); 102*f585d8a3SJacky Wang } 103*f585d8a3SJacky Wang } 104