AlphabetIndexTest.swift 67 lignes · 2800 octets
import XCTest
@testable import Card2vcf

final class AlphabetIndexTest: XCTestCase {
    private func contact(
        _ id: Int64,
        lastName: String? = nil,
        firstName: String? = nil,
        fullName: String? = nil,
        company: String? = nil,
        createdAt: Int64 = 0
    ) -> CrmContactEntity {
        CrmContactEntity(
            id: id,
            fullName: fullName,
            firstName: firstName,
            lastName: lastName,
            company: company,
            createdAt: createdAt
        )
    }

    func testSectionLetterAzAndHash() {
        XCTAssertEqual("A", AlphabetIndex.sectionLetter("alice"))
        XCTAssertEqual("Z", AlphabetIndex.sectionLetter("  zebra"))
        XCTAssertEqual("#", AlphabetIndex.sectionLetter(""))
        XCTAssertEqual("#", AlphabetIndex.sectionLetter("  "))
        XCTAssertEqual("#", AlphabetIndex.sectionLetter("Émile"))
        XCTAssertEqual("#", AlphabetIndex.sectionLetter("9ops"))
    }

    func testSortKeyFallbacks() {
        let withLast = contact(1, lastName: "Dupont", fullName: "Jean Dupont")
        let onlyFull = contact(2, fullName: "Solo")
        XCTAssertEqual("Dupont", AlphabetIndex.sortKey(withLast, sort: .lastName))
        XCTAssertEqual("Solo", AlphabetIndex.sortKey(onlyFull, sort: .lastName))
        XCTAssertEqual("Solo", AlphabetIndex.sortKey(onlyFull, sort: .firstName))
        XCTAssertEqual("", AlphabetIndex.sortKey(contact(3), sort: .company))
        XCTAssertEqual("00000000000000000042", AlphabetIndex.sortKey(contact(4, createdAt: 42), sort: .createdAt))
    }

    func testGroupByLastNameSections() {
        let contacts = [
            contact(1, lastName: "Bernard"),
            contact(2, lastName: "Adams"),
            contact(3, lastName: "Dupont"),
            contact(4, lastName: "123"),
        ]
        let grouped = AlphabetIndex.group(contacts: contacts, sort: .lastName)
        XCTAssertEqual(["A", "B", "D", "#"], grouped.map { $0.letter })
        XCTAssertEqual([2], grouped.first { $0.letter == "A" }?.contacts.map { $0.id })
        XCTAssertEqual([1], grouped.first { $0.letter == "B" }?.contacts.map { $0.id })
        XCTAssertEqual([3], grouped.first { $0.letter == "D" }?.contacts.map { $0.id })
        XCTAssertEqual([4], grouped.first { $0.letter == "#" }?.contacts.map { $0.id })
    }

    func testCreatedAtFlatChronoDescNoAzSections() {
        let contacts = [
            contact(1, lastName: "A", createdAt: 10),
            contact(2, lastName: "B", createdAt: 30),
            contact(3, lastName: "C", createdAt: 20),
        ]
        let grouped = AlphabetIndex.group(contacts: contacts, sort: .createdAt)
        XCTAssertEqual(1, grouped.count)
        XCTAssertEqual([2, 3, 1], grouped[0].contacts.map { $0.id })
    }
}