TesseractModelesTest.kt 66 lignes · 2036 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

/**
 * Résolution des modèles OCR : quelles langues sont réellement chargeables.
 *
 * Le cas « aucun modèle installé » est couvert par TesseractModelesAbsentsTest,
 * dans la source set `testFdroid` — la saveur `direct` embarque ses traineddata.
 */
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [31])
class TesseractModelesTest {

    private lateinit var context: Context
    private lateinit var prefs: PreferencesModeles

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

    private fun poserModele(langue: String) {
        val dossier = File(context.filesDir, "tesseract/tessdata").apply { mkdirs() }
        File(dossier, "$langue.traineddata").writeBytes(ByteArray(20_000))
    }

    private fun moteur() = TesseractOcrEngine(context, prefs)

    @Test
    fun `les deux langues par defaut sont chargees quand elles sont la`() {
        poserModele("fra")
        poserModele("eng")

        assertEquals(listOf("fra", "eng"), moteur().languesActives())
    }

    @Test
    fun `la selection de l'utilisateur pilote les langues chargees`() {
        poserModele("fra")
        poserModele("deu")
        prefs.setLanguesSelectionnees(setOf("deu"))

        assertEquals(listOf("deu"), moteur().languesActives())
    }

    @Test
    fun `l'ordre suit le catalogue et non l'ordre de selection`() {
        poserModele("pol")
        poserModele("fra")
        prefs.setLanguesSelectionnees(setOf("pol", "fra"))

        assertEquals(listOf("fra", "pol"), moteur().languesActives())
    }
}