-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
adding fragment integration tests (#77)
- Loading branch information
Showing
3 changed files
with
232 additions
and
1 deletion.
There are no files selected for viewing
228 changes: 228 additions & 0 deletions
228
tangle-fragment-tests/src/test/java/tangle/inject/tests/FragmentIntegrationTest.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,228 @@ | ||
package tangle.inject.tests | ||
|
||
import androidx.fragment.app.Fragment | ||
import androidx.fragment.app.FragmentFactory | ||
import io.kotest.matchers.shouldBe | ||
import io.kotest.matchers.string.shouldContain | ||
import org.jetbrains.kotlin.utils.addToStdlib.cast | ||
import org.junit.jupiter.api.Test | ||
import tangle.fragment.TangleFragmentProviderMap | ||
import tangle.inject.test.utils.* | ||
import javax.inject.Provider | ||
import kotlin.reflect.KProperty1 | ||
|
||
interface FragmentComponent { | ||
@get:TangleFragmentProviderMap | ||
val tangleProviderMap: Map<Class<out Fragment>, @JvmSuppressWildcards Fragment> | ||
val providerMap: Map<Class<out Fragment>, @JvmSuppressWildcards Fragment> | ||
val fragmentFactory: FragmentFactory | ||
} | ||
|
||
class FragmentIntegrationTest : BaseTest() { | ||
|
||
@Test | ||
fun `fragment with FragmentInjectFactory is multi-bound into TangleFragmentProviderMap`() = | ||
compileWithDagger( | ||
""" | ||
package tangle.inject.tests | ||
import com.squareup.anvil.annotations.MergeComponent | ||
import androidx.fragment.app.Fragment | ||
import tangle.fragment.* | ||
import tangle.inject.* | ||
import javax.inject.* | ||
@ContributesFragment(Unit::class) | ||
class MyFragment @FragmentInject constructor() : Fragment() { | ||
@FragmentInjectFactory | ||
interface Factory { | ||
fun create(@TangleParam("name") name: String): MyFragment | ||
} | ||
} | ||
@Singleton | ||
@MergeComponent(Unit::class) | ||
interface AppComponent : FragmentComponent | ||
""" | ||
) { | ||
|
||
val component = daggerAppComponent.createFunction() | ||
.invoke(null) | ||
.cast<FragmentComponent>() | ||
|
||
val fragment = component.tangleProviderMap[myFragmentClass]!! | ||
|
||
fragment::class.java shouldBe myFragmentClass | ||
} | ||
|
||
@Test | ||
fun `fragment with FragmentInjectFactory can be created by TangleFragmentFactory`() = | ||
compileWithDagger( | ||
""" | ||
package tangle.inject.tests | ||
import com.squareup.anvil.annotations.MergeComponent | ||
import androidx.fragment.app.Fragment | ||
import tangle.fragment.* | ||
import tangle.inject.* | ||
import javax.inject.* | ||
@ContributesFragment(Unit::class) | ||
class MyFragment @FragmentInject constructor() : Fragment() { | ||
@FragmentInjectFactory | ||
interface Factory { | ||
fun create(@TangleParam("name") name: String): MyFragment | ||
} | ||
} | ||
@Singleton | ||
@MergeComponent(Unit::class) | ||
interface AppComponent : FragmentComponent | ||
""" | ||
) { | ||
|
||
val component = daggerAppComponent.createFunction() | ||
.invoke(null) | ||
.cast<FragmentComponent>() | ||
|
||
val factory = component.fragmentFactory | ||
|
||
factory.instantiate( | ||
classLoader, | ||
myFragmentClass.canonicalName!! | ||
)::class.java shouldBe myFragmentClass | ||
} | ||
|
||
@Test | ||
fun `fragment with FragmentInjectFactory cannot be injected as Provider`() = | ||
compileWithDagger( | ||
""" | ||
package tangle.inject.tests | ||
import com.squareup.anvil.annotations.MergeComponent | ||
import androidx.fragment.app.Fragment | ||
import tangle.fragment.* | ||
import tangle.inject.* | ||
import javax.inject.* | ||
@ContributesFragment(Unit::class) | ||
class MyFragment @FragmentInject constructor() : Fragment() { | ||
@FragmentInjectFactory | ||
interface Factory { | ||
fun create(@TangleParam("name") name: String): MyFragment | ||
} | ||
} | ||
@Singleton | ||
@MergeComponent(Unit::class) | ||
interface AppComponent : FragmentComponent { | ||
val fragmentProvider: Provider<MyFragment> | ||
} | ||
""", | ||
shouldFail = true | ||
) { | ||
|
||
messages shouldContain "[Dagger/MissingBinding] tangle.inject.tests.MyFragment " + | ||
"cannot be provided without an @Inject constructor or an @Provides-annotated method." | ||
} | ||
|
||
@Test | ||
fun `fragment with normal Inject constructor is multi-bound into unqualified map`() = | ||
compileWithDagger( | ||
""" | ||
package tangle.inject.tests | ||
import com.squareup.anvil.annotations.MergeComponent | ||
import androidx.fragment.app.Fragment | ||
import tangle.fragment.* | ||
import tangle.inject.* | ||
import javax.inject.* | ||
@ContributesFragment(Unit::class) | ||
class MyFragment @Inject constructor() : Fragment() | ||
@Singleton | ||
@MergeComponent(Unit::class) | ||
interface AppComponent : FragmentComponent | ||
""" | ||
) { | ||
|
||
val component = daggerAppComponent.createFunction() | ||
.invoke(null) | ||
.cast<FragmentComponent>() | ||
|
||
val fragment = component.providerMap[myFragmentClass]!! | ||
|
||
fragment::class.java shouldBe myFragmentClass | ||
} | ||
|
||
@Test | ||
fun `fragment with normal Inject constructor can be created by TangleFragmentFactory`() = | ||
compileWithDagger( | ||
""" | ||
package tangle.inject.tests | ||
import com.squareup.anvil.annotations.MergeComponent | ||
import androidx.fragment.app.Fragment | ||
import tangle.fragment.* | ||
import tangle.inject.* | ||
import javax.inject.* | ||
@ContributesFragment(Unit::class) | ||
class MyFragment @Inject constructor(): Fragment() | ||
@Singleton | ||
@MergeComponent(Unit::class) | ||
interface AppComponent : FragmentComponent | ||
""" | ||
) { | ||
|
||
val component = daggerAppComponent.createFunction() | ||
.invoke(null) | ||
.cast<FragmentComponent>() | ||
|
||
val factory = component.fragmentFactory | ||
|
||
factory.instantiate( | ||
classLoader, | ||
myFragmentClass.canonicalName!! | ||
)::class.java shouldBe myFragmentClass | ||
} | ||
|
||
@Test | ||
fun `fragment with normal Inject constructor can be injected as Provider`() = | ||
compileWithDagger( | ||
""" | ||
package tangle.inject.tests | ||
import com.squareup.anvil.annotations.MergeComponent | ||
import androidx.fragment.app.Fragment | ||
import tangle.fragment.* | ||
import tangle.inject.* | ||
import javax.inject.* | ||
@ContributesFragment(Unit::class) | ||
class MyFragment @Inject constructor() : Fragment() | ||
@Singleton | ||
@MergeComponent(Unit::class) | ||
interface AppComponent : FragmentComponent { | ||
val myFragmentProvider: Provider<MyFragment> | ||
} | ||
""" | ||
) { | ||
|
||
val component = daggerAppComponent.createFunction() | ||
.invoke(null) | ||
.cast<FragmentComponent>() | ||
val fragment = component::class.property("myFragmentProvider") | ||
.cast<KProperty1<FragmentComponent, Provider<Fragment>>>() | ||
.get(component) | ||
.invokeGet() | ||
|
||
fragment::class.java shouldBe myFragmentClass | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters