ApercuTacheTest.swift 74 lignes · 2866 octets
import XCTest
@testable import Card2vcf

/// Logique d'affichage de la carte kanban, extraite de la vue pour être
/// testable — même principe que `KanbanFilter`. Miroir de `ApercuTacheTest.kt`.
final class ApercuTacheTest: XCTestCase {
    private func tache(
        debut: String? = nil,
        duree: Int? = nil,
        etiquette: String? = nil,
        sousTaches: String = "[]"
    ) -> TacheEntity {
        TacheEntity(
            localId: 1,
            titre: "T",
            debut: debut,
            dureeJours: duree,
            etiquette: etiquette,
            sousTachesJson: sousTaches
        )
    }

    func testPeriodeEnJoursOuvresDuProjet() {
        // Vendredi 2026-01-09 + 3 jours ouvrés.
        let t = tache(debut: "2026-01-09", duree: 3)
        XCTAssertEqual("09/01 → 13/01", ApercuTache.periode(t, joursOuvres: 5))
        XCTAssertEqual("09/01 → 11/01", ApercuTache.periode(t, joursOuvres: 7))
    }

    func testPasDePeriodeSansDate() {
        XCTAssertNil(ApercuTache.periode(tache(duree: 3), joursOuvres: 5))
    }

    func testUneDateIllisibleNeFaitPasTomberLEcran() {
        XCTAssertNil(ApercuTache.periode(tache(debut: "pas-une-date"), joursOuvres: 5))
    }

    func testAvancementDesSousTaches() {
        let json = #"[{"id":"a","titre":"A","fait":true},{"id":"b","titre":"B","fait":false}]"#
        let avancement = ApercuTache.avancement(tache(sousTaches: json))
        XCTAssertEqual(1, avancement?.faites)
        XCTAssertEqual(2, avancement?.total)
        XCTAssertNil(ApercuTache.avancement(tache()), "aucune sous-tâche = rien à afficher")
    }

    func testSousTachesIllisiblesIgnorees() {
        XCTAssertNil(ApercuTache.avancement(tache(sousTaches: "{pas du json")))
    }

    func testRetardMesureContreLEcheance() {
        let t = tache(debut: "2026-01-09", duree: 3) // finit le 13 en rythme 5
        XCTAssertTrue(ApercuTache.enRetard(t, joursOuvres: 5, echeance: "2026-01-12"))
        XCTAssertFalse(ApercuTache.enRetard(t, joursOuvres: 5, echeance: "2026-01-13"))
        XCTAssertFalse(ApercuTache.enRetard(t, joursOuvres: 5, echeance: nil))
        XCTAssertFalse(ApercuTache.enRetard(tache(), joursOuvres: 5, echeance: "2026-01-01"))
    }

    func testCouleurSuitLEtiquette() {
        XCTAssertEqual("#8B5CF6", ApercuTache.couleur(tache(etiquette: "câblage")))
        XCTAssertNil(ApercuTache.couleur(tache()))
    }

    func testReglagesDUnProjetSansPlanification() {
        XCTAssertEqual(ReglagesPlanification(), ReglagesPlanification.de(nil))
        var projet = ProjetEntity()
        projet.planification = true
        projet.joursOuvres = 5
        projet.echeance = "2026-09-30"
        XCTAssertEqual(
            ReglagesPlanification(active: true, joursOuvres: 5, echeance: "2026-09-30"),
            ReglagesPlanification.de(projet)
        )
    }
}