package jp.juggler.subwaytooter.api import androidx.test.platform.app.InstrumentationRegistry import androidx.test.runner.AndroidJUnit4 import jp.juggler.subwaytooter.api.entity.* import jp.juggler.subwaytooter.table.SavedAccount import jp.juggler.util.JsonObject import jp.juggler.util.jsonObject import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class TestDuplicateMap { private val parser = TootParser( InstrumentationRegistry.getInstrumentation().targetContext, SavedAccount( db_id = 1, acctArg = "user1@host1", apiHostArg = null ) ) private fun genStatus( parser: TootParser, accountJson: JsonObject, statusId: String, uri: String, url: String? ): TootStatus { val itemJson = jsonObject { put("account", accountJson) put("id", statusId) put("uri", uri) if (url != null) put("url", url) } return TootStatus(parser, itemJson) } private fun testDuplicateStatus(): ArrayList { val generatedItems = ArrayList() fun checkStatus( map: DuplicateMap, parser: TootParser, accountJson: JsonObject, statusId: String, uri: String, url: String? ) { val item = genStatus(parser, accountJson, statusId, uri, url) assertNotNull(item) generatedItems.add(item) assertEquals(false, map.isDuplicate(item)) assertEquals(true, map.isDuplicate(item)) } val account1Json = jsonObject { put("username", "user1") put("acct", "user1") put("id", 1L) put("url", "http://${parser.apiHost}/@user1") } val account1 = TootAccount(parser, account1Json) assertNotNull(account1) val map = DuplicateMap() // 普通のステータス checkStatus( map, parser, account1Json, "s1", "http://${parser.apiHost}/@${account1.username}/1", "http://${parser.apiHost}/@${account1.username}/1" ) // 別のステータス checkStatus( map, parser, account1Json, "s2", "http://${parser.apiHost}/@${account1.username}/2", "http://${parser.apiHost}/@${account1.username}/2" ) // URIは必須になったので、URIなしのテストは行わない // 今度はURLがない checkStatus( map, parser, account1Json, "s4", "http://${parser.apiHost}/@${account1.username}/4", null //"http://${parser.apiHost}/@${account1.username}/4" ) // 今度はIDがおかしい checkStatus( map, parser, account1Json, "", "http://${parser.apiHost}/@${account1.username}/5", "http://${parser.apiHost}/@${account1.username}/5" ) return generatedItems } private fun testDuplicateNotification(): ArrayList { val generatedItems = ArrayList() fun checkNotification( map: DuplicateMap, parser: TootParser, id: String ) { val itemJson = JsonObject() itemJson.apply { put("type", TootNotification.TYPE_MENTION) put("id", id) } val item = TootNotification(parser, itemJson) assertNotNull(item) generatedItems.add(item) assertEquals(false, map.isDuplicate(item)) assertEquals(true, map.isDuplicate(item)) } val map = DuplicateMap() checkNotification(map, parser, "n0") checkNotification(map, parser, "n1") checkNotification(map, parser, "n2") checkNotification(map, parser, "n3") return generatedItems } private fun testDuplicateReport(): ArrayList { val generatedItems = ArrayList() fun checkReport( map: DuplicateMap, id: String ) { val item = TootReport(JsonObject().apply { put("id", id) put("action_taken", "eat") }) assertNotNull(item) generatedItems.add(item) assertEquals(false, map.isDuplicate(item)) assertEquals(true, map.isDuplicate(item)) } val map = DuplicateMap() checkReport(map, "r0") checkReport(map, "r1") checkReport(map, "r2") checkReport(map, "r3") return generatedItems } private fun testDuplicateAccount(): ArrayList { val generatedItems = ArrayList() fun checkAccount( map: DuplicateMap, parser: TootParser, id: String ) { val itemJson = JsonObject() itemJson.apply { put("username", "user$id") put("acct", "user$id") put("id", id) put("url", "http://${parser.apiHost}/@user$id") } val item = TootAccountRef.notNull(parser, TootAccount(parser, itemJson)) assertNotNull(item) generatedItems.add(item) assertEquals(false, map.isDuplicate(item)) assertEquals(true, map.isDuplicate(item)) // 二回目はtrueになる } val map = DuplicateMap() checkAccount(map, parser, "a0") checkAccount(map, parser, "a1") checkAccount(map, parser, "a2") checkAccount(map, parser, "a3") return generatedItems } @Test fun testFilterList() { val statusItems = testDuplicateStatus() val notiItems = testDuplicateNotification() val reportItems = testDuplicateReport() val accountItems = testDuplicateAccount() var map = DuplicateMap() var dst = map.filterDuplicate(statusItems) assertEquals("statusItems", statusItems.size, dst.size) map = DuplicateMap() dst = map.filterDuplicate(notiItems) assertEquals("notiItems", notiItems.size, dst.size) map = DuplicateMap() dst = map.filterDuplicate(reportItems) assertEquals("reportItems", reportItems.size, dst.size) map = DuplicateMap() dst = map.filterDuplicate(accountItems) assertEquals("accountItems", accountItems.size, dst.size) val totalItems = ArrayList() totalItems.addAll(statusItems) totalItems.addAll(notiItems) totalItems.addAll(reportItems) totalItems.addAll(accountItems) map = DuplicateMap() dst = map.filterDuplicate(totalItems) assertEquals("totalItems", totalItems.size, dst.size) val dst2 = map.filterDuplicate(totalItems) assertEquals(0, dst2.size) } }