ContactHeuristicParserTest.swift 66 lignes · 2559 octets
import XCTest
@testable import Card2vcf

final class ContactHeuristicParserTest: XCTestCase {

    func testParseCarteDimoBruitee() {
        let text = """
        dimo
        SOFTWARE &—
        Jean Pau! GENOUX
        Directeur Général/CEO
        jpgenoux@dimosoftware.com
        Mobile : +33 (0)6 74 64 05 44 / Tél. : +33 (0)4 72 86 O1 92
        Siège Social
        561, alée des Noisetiers - 69 760 Limonest - France
        Lyon - Paris - Nantes - Biarritz - Madrid — Toronto
        www.dimosoftware.fr
        """
        let ocr = OcrPostProcessor.process(text)
        let card = ContactHeuristicParser.parse(ocr)

        XCTAssertEqual("Jean Paul Genoux", card.fullName)
        XCTAssertEqual("Jean Paul", card.firstName)
        XCTAssertEqual("Genoux", card.lastName)
        XCTAssertTrue(card.jobTitle!.range(of: "Directeur", options: .caseInsensitive) != nil)
        XCTAssertTrue(
            card.company!.range(of: "Software", options: .caseInsensitive) != nil
                || card.company!.range(of: "dimo", options: .caseInsensitive) != nil
        )
        XCTAssertTrue(card.emails.contains("jpgenoux@dimosoftware.com"))
        XCTAssertTrue(card.phones.contains { $0.hasSuffix("674640544") })
        XCTAssertTrue(card.phones.contains { $0.contains("472860192") })
        XCTAssertTrue(card.website!.contains("dimosoftware.fr"))
        XCTAssertNotNil(card.address)
        XCTAssertTrue(card.address!.contains("Noisetiers") || card.address!.contains("Limonest"))
    }

    func testSplitNomAvecNomFamilleMajuscules() {
        let (first, last, full) = ContactHeuristicParser.splitPersonName("Marie CURIE")
        XCTAssertEqual("Marie", first)
        XCTAssertEqual("Curie", last)
        XCTAssertEqual("Marie Curie", full)
    }

    func testSocieteDepuisEmail() {
        XCTAssertEqual("Dimo Software", ContactHeuristicParser.companyFromEmailDomain("jp@dimosoftware.com"))
    }

    func testMergeSansLlmRemplitQuandMemeLesChamps() {
        let ocr = OcrPostProcessor.process(
            """
            Acme SAS
            Alice Martin
            CEO
            alice@acme.fr
            01 23 45 67 89
            10 rue de Paris 75001 Paris
            """
        )
        let merged = ContactDraftMerge.merge(llm: nil, ocr: ocr)
        XCTAssertEqual("Alice Martin", merged.fullName)
        XCTAssertTrue(merged.emails.contains("alice@acme.fr"))
        XCTAssertTrue(merged.jobTitle!.range(of: "CEO", options: .caseInsensitive) != nil)
        XCTAssertNotNil(merged.company)
    }
}