🙈 Ignore sone.properties file
[Sone.git] / src / test / kotlin / net / pterodactylus / sone / test / Guice.kt
1 package net.pterodactylus.sone.test
2
3 import com.google.inject.Injector
4 import com.google.inject.Module
5 import com.google.inject.name.*
6 import org.mockito.*
7 import javax.inject.Provider
8 import kotlin.reflect.KClass
9
10 fun <T : Any> KClass<T>.isProvidedBy(instance: T) = Module { it.bind(this.java).toProvider(Provider<T> { instance }) }
11 fun <T : Any> KClass<T>.withNameIsProvidedBy(instance: T, name: String) = Module { it.bind(this.java).annotatedWith(Names.named(name)).toProvider(Provider<T> { instance }) }
12 fun <T : Any> KClass<T>.isProvidedBy(provider: com.google.inject.Provider<T>) = Module { it.bind(this.java).toProvider(provider) }
13 fun <T : Any> KClass<T>.isProvidedBy(provider: KClass<out Provider<T>>) = Module { it.bind(this.java).toProvider(provider.java) }
14 inline fun <reified T : Any> KClass<T>.isProvidedByMock() = Module { it.bind(this.java).toProvider(Provider<T> { mock() }) }
15 inline fun <reified T : Any> KClass<T>.isProvidedByDeepMock() = Module { it.bind(this.java).toProvider(Provider<T> { deepMock() }) }
16
17 inline fun <reified T : Any> Injector.getInstance() = getInstance(T::class.java)!!
18
19 fun <T : Any> supply(javaClass: Class<T>): Source<T> = object : Source<T> {
20         override fun fromInstance(instance: T) = Module { it.bind(javaClass).toInstance(instance) }
21         override fun byInstance(instance: T) = Module { it.bind(javaClass).toProvider(Provider<T> { instance }) }
22         override fun byProvider(provider: com.google.inject.Provider<T>) = Module { it.bind(javaClass).toProvider(provider) }
23         override fun byProvider(provider: Class<Provider<T>>) = Module { it.bind(javaClass).toProvider(provider) }
24         override fun byMock() = Module { it.bind(javaClass).toInstance(Mockito.mock(javaClass)) }
25 }
26
27 interface Source<T : Any> {
28         fun fromInstance(instance: T): Module
29         fun byInstance(instance: T): Module
30         fun byProvider(provider: com.google.inject.Provider<T>): Module
31         fun byProvider(provider: Class<Provider<T>>): Module
32         fun byMock(): Module
33 }