ImageRepository: add unit tests for setColorMode
This commit is contained in:
@@ -16,6 +16,10 @@ package org.fairscan.app.data
|
|||||||
|
|
||||||
import kotlinx.collections.immutable.PersistentList
|
import kotlinx.collections.immutable.PersistentList
|
||||||
import kotlinx.collections.immutable.toPersistentList
|
import kotlinx.collections.immutable.toPersistentList
|
||||||
|
import kotlinx.coroutines.coroutineScope
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
import kotlinx.coroutines.test.TestScope
|
import kotlinx.coroutines.test.TestScope
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
import org.assertj.core.api.Assertions.assertThat
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
@@ -28,6 +32,7 @@ import org.fairscan.app.domain.Rotation.R270
|
|||||||
import org.fairscan.app.domain.Rotation.R90
|
import org.fairscan.app.domain.Rotation.R90
|
||||||
import org.fairscan.imageprocessing.ColorMode
|
import org.fairscan.imageprocessing.ColorMode
|
||||||
import org.fairscan.imageprocessing.ColorMode.COLOR
|
import org.fairscan.imageprocessing.ColorMode.COLOR
|
||||||
|
import org.fairscan.imageprocessing.ColorMode.GRAYSCALE
|
||||||
import org.fairscan.imageprocessing.Point
|
import org.fairscan.imageprocessing.Point
|
||||||
import org.fairscan.imageprocessing.Quad
|
import org.fairscan.imageprocessing.Quad
|
||||||
import org.junit.Rule
|
import org.junit.Rule
|
||||||
@@ -54,19 +59,22 @@ class ImageRepositoryTest {
|
|||||||
return _filesDir!!
|
return _filesDir!!
|
||||||
}
|
}
|
||||||
|
|
||||||
fun repo(): ImageRepository {
|
fun repo(
|
||||||
val transformations = object : ImageTransformations {
|
rotate: (Jpeg, Int, Int) -> Jpeg = { input, _, _ -> input },
|
||||||
override fun rotate(input: Jpeg, rotationDegrees: Int, jpegQuality: Int): Jpeg {
|
resize: (Jpeg, Int) -> Jpeg = { input, _ -> jpeg(input.bytes[0]) },
|
||||||
return input
|
process: (Jpeg, PageMetadata, ColorMode) -> Jpeg = { _, _, _ ->
|
||||||
}
|
throw UnsupportedOperationException()
|
||||||
override fun resize(input: Jpeg, maxSize: Int): Jpeg {
|
|
||||||
return jpeg(input.bytes[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun process(source: Jpeg, metadata: PageMetadata, colorMode: ColorMode): Jpeg {
|
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
): ImageRepository {
|
||||||
|
val transformations = object : ImageTransformations {
|
||||||
|
override fun rotate(input: Jpeg, rotationDegrees: Int, jpegQuality: Int): Jpeg =
|
||||||
|
rotate(input, rotationDegrees, jpegQuality)
|
||||||
|
override fun resize(input: Jpeg, maxSize: Int): Jpeg =
|
||||||
|
resize(input, maxSize)
|
||||||
|
override fun process(source: Jpeg, metadata: PageMetadata, colorMode: ColorMode): Jpeg =
|
||||||
|
process(source, metadata, colorMode)
|
||||||
|
}
|
||||||
|
|
||||||
return ImageRepository(getFilesDir(), transformations, 200, testScope)
|
return ImageRepository(getFilesDir(), transformations, 200, testScope)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,6 +235,52 @@ class ImageRepositoryTest {
|
|||||||
assertThat(repo.imageIds()).isEmpty()
|
assertThat(repo.imageIds()).isEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun setColorMode_should_process_and_update_metadata() = runTest {
|
||||||
|
val jpeg1 = jpeg(10)
|
||||||
|
val repo = repo(
|
||||||
|
process = { jpeg ,meta, mode ->
|
||||||
|
assertThat(mode).isEqualTo(GRAYSCALE)
|
||||||
|
jpeg(41)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
repo.add(jpeg1, jpeg(20), metadata1, COLOR)
|
||||||
|
assertThat(repo.pages().first().colorMode).isEqualTo(COLOR)
|
||||||
|
val id = repo.pages().first().id
|
||||||
|
repo.setColorMode(id, GRAYSCALE)
|
||||||
|
assertThat(repo.pages().first().colorMode).isEqualTo(GRAYSCALE)
|
||||||
|
val key = PageViewKey(id, R0, GRAYSCALE)
|
||||||
|
assertThat(repo.jpegBytes(key)?.bytes).isEqualTo(byteArrayOf(41))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun setColorMode_should_not_run_twice_in_parallel() = runTest {
|
||||||
|
var processCalls = 0
|
||||||
|
val repo = repo(
|
||||||
|
process = { _, _, _ ->
|
||||||
|
processCalls++
|
||||||
|
runBlocking { delay(10) }
|
||||||
|
jpeg(1)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
repo.add(jpeg(10), jpeg(20), metadata1, COLOR)
|
||||||
|
val id = repo.imageIds().first()
|
||||||
|
coroutineScope {
|
||||||
|
launch { repo.setColorMode(id, GRAYSCALE) }
|
||||||
|
launch { repo.setColorMode(id, GRAYSCALE) }
|
||||||
|
}
|
||||||
|
val key = PageViewKey(id, R0, GRAYSCALE)
|
||||||
|
assertThat(repo.jpegBytes(key)?.bytes).isEqualTo(byteArrayOf(1))
|
||||||
|
assertThat(processCalls).isEqualTo(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun setColorMode_unknown_id_should_do_nothing() = runTest {
|
||||||
|
val repo = repo()
|
||||||
|
repo.setColorMode("x", GRAYSCALE)
|
||||||
|
assertThat(repo.imageIds()).isEmpty()
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun movePage() = runTest {
|
fun movePage() = runTest {
|
||||||
val repo = repo()
|
val repo = repo()
|
||||||
@@ -260,7 +314,7 @@ class ImageRepositoryTest {
|
|||||||
val metadata = PageV2("1", 0, 0, quad, isColored).toMetadata()
|
val metadata = PageV2("1", 0, 0, quad, isColored).toMetadata()
|
||||||
assertThat(metadata).isNotNull()
|
assertThat(metadata).isNotNull()
|
||||||
assertThat(metadata!!.autoColorMode).isEqualTo(
|
assertThat(metadata!!.autoColorMode).isEqualTo(
|
||||||
if (isColored) COLOR else ColorMode.GRAYSCALE
|
if (isColored) COLOR else GRAYSCALE
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user