/*
 * © 2026 TiedUp! Remake Contributors, distributed under GPLv3.
 */

package com.tiedup.remake.rig.tick;

import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

/**
 * Tests de {@link RigAnimationTickHandler} — uniquement la logique pure Java
 * accessible sans MC runtime.
 *
 * Ce qui est SKIP ici (et pourquoi) :
 * - onClientTick : necessite Minecraft.getInstance() / ClientLevel / Player —
 *   impossible sans bootstrap Forge.
 * - tickPlayer : necessite TiedUpCapabilities.getEntityPatch() qui utilise
 *   LazyOptional (Forge runtime) + un Player reel.
 * - maybePlayIdle : necessite ClientAnimator + LivingEntityPatch (Forge
 *   capability + MC class hierarchy).
 *
 * Ce qui est couvert :
 * - resetLoggedErrors() : expose explicitement pour les tests (Javadoc l'indique).
 *   Verifie que la methode est idempotente et ne throw pas.
 */
class RigAnimationTickHandlerTest {

    @AfterEach
    void cleanUp() {
        RigAnimationTickHandler.resetLoggedErrors();
    }

    /**
     * resetLoggedErrors() doit etre un no-op sur un set deja vide.
     * Double-appel ne doit pas throw.
     */
    @Test
    void resetLoggedErrors_idempotent_doesNotThrow() {
        assertDoesNotThrow(() -> {
            RigAnimationTickHandler.resetLoggedErrors();
            RigAnimationTickHandler.resetLoggedErrors();
        }, "Double resetLoggedErrors() ne doit pas throw");
    }

    /**
     * Verifie que la constante MAX_LOGGED_UUIDS guard est coherente avec le
     * comportement documente : le set est reinitialisable. Ce test appelle
     * reset, puis reverifie que reset fonctionne, garantissant que le set
     * n'est pas final non-clearable.
     *
     * Pattern : si ConcurrentHashMap.newKeySet() etait remplace par un Set
     * immutable par erreur de refacto, ce test detecterait le throw.
     */
    @Test
    void resetLoggedErrors_afterReset_secondResetStillDoesNotThrow() {
        assertDoesNotThrow(() -> {
            RigAnimationTickHandler.resetLoggedErrors();
        });

        // Second reset simule la sequence F3+T reload (appelee deux fois
        // si deux resource-packs swappent rapidement).
        assertDoesNotThrow(() -> {
            RigAnimationTickHandler.resetLoggedErrors();
        }, "Second reset doit rester idempotent (simulation F3+T double-reload)");
    }
}
