app/src/androidTest/kotlin/space/subread/dictionary/DictionariesTest.kt (4043 bytes)
1 package space.subread.dictionary 2 3 import androidx.test.core.app.ApplicationProvider 4 import androidx.test.ext.junit.runners.AndroidJUnit4 5 import org.junit.After 6 import org.junit.Assert.assertEquals 7 import org.junit.Assert.assertTrue 8 import org.junit.Before 9 import org.junit.Test 10 import org.junit.runner.RunWith 11 import space.subread.dictionary.core.DictionaryIndex 12 import space.subread.dictionary.core.Lookup 13 import java.io.ByteArrayInputStream 14 import java.io.ByteArrayOutputStream 15 import java.util.zip.ZipEntry 16 import java.util.zip.ZipOutputStream 17 18 /** The import into SQLite and the lookup through it, on a device. */ 19 @RunWith(AndroidJUnit4::class) 20 class DictionariesTest { 21 22 private val context = ApplicationProvider.getApplicationContext<android.content.Context>() 23 private lateinit var dictionaries: Dictionaries 24 25 @Before 26 fun open() { 27 context.deleteDatabase("test.db") 28 dictionaries = Dictionaries(context, "test.db") 29 } 30 31 @After 32 fun close() { 33 dictionaries.close() 34 context.deleteDatabase("test.db") 35 } 36 37 private fun zip(vararg files: Pair<String, String>): ByteArray { 38 val bytes = ByteArrayOutputStream() 39 ZipOutputStream(bytes).use { out -> 40 for ((name, body) in files) { 41 out.putNextEntry(ZipEntry(name)) 42 out.write(body.toByteArray()) 43 out.closeEntry() 44 } 45 } 46 return bytes.toByteArray() 47 } 48 49 private val termBank = """[ 50 ["食べる","たべる","v1","v1",10,["to eat"],1,"P"], 51 ["食べ物","たべもの","n","",5,["food"],2,""], 52 ["物","もの","n","",1,["thing"],3,""] 53 ]""" 54 55 private val metaBank = """[["食べる","freq",{"value":100,"displayValue":"100"}],["食べる","pitch",{"reading":"たべる","pitches":[{"position":2}]}]]""" 56 57 @Test 58 fun importThenLookup() { 59 val index = DictionaryIndex("Test", "1", 3) 60 val counts = ArrayList<Int>() 61 val info = dictionaries.import(index, ByteArrayInputStream(zip("term_bank_1.json" to termBank, "term_meta_bank_1.json" to metaBank))) { counts.add(it) } 62 // Three terms and two meta rows. 63 assertEquals(5, info.terms) 64 assertEquals(listOf(info), dictionaries.list()) 65 66 val found = Lookup.find("食べ物を食べた", 4, dictionaries) 67 assertEquals("食べる", found.first().stored.term.expression) 68 assertEquals(listOf("past"), found.first().reasons) 69 // A kana text finds the reading. 70 assertEquals("食べ物", Lookup.find("たべもの", 0, dictionaries).first().stored.term.expression) 71 72 val meta = dictionaries.meta("食べる") 73 assertEquals(listOf("freq", "pitch"), meta.map { it.meta.mode }) 74 } 75 76 @Test 77 fun aDisabledDictionaryIsNotSearched() { 78 val info = dictionaries.import(DictionaryIndex("Test", "1", 3), ByteArrayInputStream(zip("term_bank_1.json" to termBank))) {} 79 dictionaries.setEnabled(info.id, false) 80 assertTrue(Lookup.find("食べる", 0, dictionaries).isEmpty()) 81 assertTrue(!dictionaries.anyEnabled()) 82 } 83 84 @Test 85 fun deleteRemovesTheTermsToo() { 86 val info = dictionaries.import(DictionaryIndex("Test", "1", 3), ByteArrayInputStream(zip("term_bank_1.json" to termBank, "term_meta_bank_1.json" to metaBank))) {} 87 dictionaries.delete(info.id) 88 assertTrue(dictionaries.list().isEmpty()) 89 assertTrue(dictionaries.terms(listOf("食べる")).isEmpty()) 90 assertTrue(dictionaries.meta("食べる").isEmpty()) 91 } 92 93 @Test 94 fun orderFollowsMoveUp() { 95 val a = dictionaries.import(DictionaryIndex("A", "1", 3), ByteArrayInputStream(zip("term_bank_1.json" to "[]"))) {} 96 val b = dictionaries.import(DictionaryIndex("B", "1", 3), ByteArrayInputStream(zip("term_bank_1.json" to "[]"))) {} 97 assertEquals(listOf(a.id, b.id), dictionaries.list().map { it.id }) 98 dictionaries.moveUp(b.id) 99 assertEquals(listOf(b.id, a.id), dictionaries.list().map { it.id }) 100 } 101 }