AlphabetIndexTest.kt 72 lignes · 2773 octets
package fr.ebii.card2vcf.crm

import fr.ebii.card2vcf.data.CrmContactEntity
import kotlin.test.Test
import kotlin.test.assertEquals

class AlphabetIndexTest {
    private fun contact(
        id: Long,
        lastName: String? = null,
        firstName: String? = null,
        fullName: String? = null,
        company: String? = null,
        createdAt: Long = 0L,
    ) = CrmContactEntity(
        id = id,
        lastName = lastName,
        firstName = firstName,
        fullName = fullName,
        company = company,
        createdAt = createdAt,
    )

    @Test
    fun sectionLetterAzAndHash() {
        assertEquals('A', AlphabetIndex.sectionLetter("alice"))
        assertEquals('Z', AlphabetIndex.sectionLetter("  zebra"))
        assertEquals('#', AlphabetIndex.sectionLetter(""))
        assertEquals('#', AlphabetIndex.sectionLetter("  "))
        assertEquals('#', AlphabetIndex.sectionLetter("Émile"))
        assertEquals('#', AlphabetIndex.sectionLetter("9ops"))
    }

    @Test
    fun sortKeyFallbacks() {
        val withLast = contact(1, lastName = "Dupont", fullName = "Jean Dupont")
        val onlyFull = contact(2, fullName = "Solo")
        assertEquals("Dupont", AlphabetIndex.sortKey(withLast, ContactSort.LAST_NAME))
        assertEquals("Solo", AlphabetIndex.sortKey(onlyFull, ContactSort.LAST_NAME))
        assertEquals("Solo", AlphabetIndex.sortKey(onlyFull, ContactSort.FIRST_NAME))
        assertEquals("", AlphabetIndex.sortKey(contact(3), ContactSort.COMPANY))
        assertEquals("00000000000000000042", AlphabetIndex.sortKey(contact(4, createdAt = 42), ContactSort.CREATED_AT))
    }

    @Test
    fun groupByLastNameSections() {
        val contacts = listOf(
            contact(1, lastName = "Bernard"),
            contact(2, lastName = "Adams"),
            contact(3, lastName = "Dupont"),
            contact(4, lastName = "123"),
        )
        val grouped = AlphabetIndex.group(contacts, ContactSort.LAST_NAME)
        assertEquals(listOf('A', 'B', 'D', '#'), grouped.keys.toList())
        assertEquals(listOf(2L), grouped['A']!!.map { it.id })
        assertEquals(listOf(1L), grouped['B']!!.map { it.id })
        assertEquals(listOf(3L), grouped['D']!!.map { it.id })
        assertEquals(listOf(4L), grouped['#']!!.map { it.id })
    }

    @Test
    fun createdAtFlatChronoDescNoAzSections() {
        val contacts = listOf(
            contact(1, lastName = "A", createdAt = 10),
            contact(2, lastName = "B", createdAt = 30),
            contact(3, lastName = "C", createdAt = 20),
        )
        val grouped = AlphabetIndex.group(contacts, ContactSort.CREATED_AT)
        assertEquals(1, grouped.size)
        assertEquals(listOf(2L, 3L, 1L), grouped.values.single().map { it.id })
    }
}