TesseractAssetsEmbarquesTest.kt 57 lignes · 1939 octets
package fr.ebii.card2vcf.ocr

import android.content.Context
import androidx.test.core.app.ApplicationProvider
import fr.ebii.card2vcf.modeles.PreferencesModeles
import org.junit.Before
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import java.io.File
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue

/**
 * La saveur `direct` doit rester autonome : sur un `filesDir` vierge, les traineddata
 * embarqués sont recopiés et l'OCR fonctionne sans le moindre téléchargement.
 */
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [31])
class TesseractAssetsEmbarquesTest {

    private lateinit var context: Context

    @Before
    fun setUp() {
        context = ApplicationProvider.getApplicationContext()
        context.filesDir.deleteRecursively()
    }

    @Test
    fun `la saveur direct embarque bien les traineddata`() {
        val assets = context.assets.list("tesseract/tessdata").orEmpty()
        assertTrue(
            assets.any { it.endsWith(".traineddata") },
            "aucun traineddata embarqué : ${assets.joinToString()}",
        )
    }

    @Test
    fun `sur un filesDir vierge les modeles sont recopies depuis les assets`() {
        val langues = TesseractOcrEngine(context, PreferencesModeles(context)).languesActives()

        assertEquals(listOf("fra", "eng"), langues)
        val dossier = File(context.filesDir, "tesseract/tessdata")
        assertTrue(File(dossier, "fra.traineddata").isFile)
        assertTrue(File(dossier, "eng.traineddata").isFile)
    }

    @Test
    fun `la recopie depuis les assets marque la variante et non external`() {
        TesseractOcrEngine(context, PreferencesModeles(context)).languesActives()

        val stamp = File(context.filesDir, "tesseract/tessdata/.card2vcf-tessdata-variant")
        assertEquals("fast", stamp.readText().trim())
    }
}