Skip to content

Instantly share code, notes, and snippets.

View arkivanov's full-sized avatar

Arkadii Ivanov arkivanov

View GitHub Profile
@arkivanov
arkivanov / TestKittenDataSource.kt
Created July 28, 2020 11:38
TestKittenDataSource
internal class TestKittenDataSource(
private val scheduler: TestScheduler
) : KittenDataSource {
private var images by AtomicReference<List<String>?>(null)
private var seed by AtomicInt()
override fun load(limit: Int, page: Int): Maybe<String> =
singleFromFunction { images }
.notNull()
.map {
@arkivanov
arkivanov / KittenComponent.kt
Created July 28, 2020 11:35
KittenComponent public API
internal class KittenComponent internal constructor(dataSource: KittenDataSource) {
constructor() : this(KittenDataSource())
fun onViewCreated(view: KittenView) { /* ... */ }
fun onStart() { /* ... */ }
fun onStop() { /* ... */ }
fun onViewDestroyed() { /* ... */ }
@arkivanov
arkivanov / KittenStoreTest.kt
Created July 28, 2020 11:34
KittenStoreTest5
@Test
fun isLoading_true_WHEN_loading() {
networkScheduler.isManualProcessing = true
network.generateImages()
val store = store()
assertTrue(store.state.isLoading)
}
@arkivanov
arkivanov / KittenStoreTest.kt
Created July 28, 2020 11:33
KittenStoreTest4
@Test
fun reloads_images_WHEN_Intent_Reload() {
network.generateImages()
val store = store()
val newImages = network.generateImages()
store.onNext(Intent.Reload)
assertEquals(State.Data.Images(urls = newImages), store.state.data)
}
@arkivanov
arkivanov / KittenStoreTest.kt
Created July 28, 2020 11:32
KittenStoreTest3
@Test
fun loads_images_WHEN_created() {
val images = network.generateImages()
val store = store()
assertEquals(State.Data.Images(urls = images), store.state.data)
}
@arkivanov
arkivanov / KittenStoreTest.kt
Created July 28, 2020 11:31
KittenStoreTest2
class KittenStoreTest {
private val network = TestKittenStoreNetwork()
private val parser = TestKittenStoreParser()
private fun store(): KittenStore = KittenStoreImpl(network, parser)
@BeforeTest
fun before() {
overrideSchedulers(main = { TestScheduler() })
}
@arkivanov
arkivanov / KittenStoreTest.kt
Created July 28, 2020 11:30
KittenStoreTest1
class KittenStoreTest {
private val parser = TestKittenStoreParser()
private val networkScheduler = TestScheduler()
private val network = TestKittenStoreNetwork(networkScheduler)
private fun store(): KittenStore = KittenStoreImpl(network, parser)
// ...
}
@arkivanov
arkivanov / TestKittenStoreParser.kt
Created July 28, 2020 11:27
TestKittenStoreParser
class TestKittenStoreParser : KittenStoreImpl.Parser {
override fun parse(json: String): Maybe<List<String>> =
json
.toSingle()
.filter { it != "" }
.map { it.split(SEPARATOR) }
.observeOn(TestScheduler())
private companion object {
private const val SEPARATOR = ";"
@arkivanov
arkivanov / KittenStoreImpl.kt
Created July 28, 2020 11:25
KittenStore.Parser
interface Parser {
fun parse(json: String): Maybe<List<String>>
}
@arkivanov
arkivanov / TestKittenStoreNetwork.kt
Created July 28, 2020 11:22
TestKittenStoreNetwork
class TestKittenStoreNetwork(
private val scheduler: TestScheduler
) : KittenStoreImpl.Network {
var images: List<String>? by AtomicReference<List<String>?>(null)
private var seed: Int by AtomicInt()
override fun load(): Maybe<String> =
singleFromFunction { images }
.notNull()
.map { it.joinToString(separator = SEPARATOR) }