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

package com.tiedup.remake.rig.anim;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.Test;

/**
 * Tests de {@link LivingMotion#isSame} — en particulier la symetrie speciale
 * IDLE == INACTION definie dans le code source.
 *
 * Aucun MC runtime requis — LivingMotions est un enum Java pur.
 * Note : le chargement de LivingMotions trigger ExtendableEnumManager.assign()
 * qui utilise TiedUpRigConstants.LOGGER (LogUtils, SLF4J pur) — pas de
 * bootstrap Forge requis.
 */
class LivingMotionIsSameTest {

    /**
     * IDLE.isSame(INACTION) doit etre true selon le contrat du code source.
     * Ce comportement special est utilise par RigAnimationTickHandler pour
     * ne pas re-trigger l'animation idle quand la motion courante est INACTION.
     */
    @Test
    void idle_isSame_inaction_returnsTrue() {
        assertTrue(LivingMotions.IDLE.isSame(LivingMotions.INACTION),
            "IDLE.isSame(INACTION) doit etre true (alias semantique)");
    }

    /** Symetrie : INACTION.isSame(IDLE) aussi. */
    @Test
    void inaction_isSame_idle_returnsTrue() {
        assertTrue(LivingMotions.INACTION.isSame(LivingMotions.IDLE),
            "INACTION.isSame(IDLE) doit etre true (symetrique)");
    }

    /** Une motion quelconque est identique a elle-meme. */
    @Test
    void walk_isSame_walk_returnsTrue() {
        assertTrue(LivingMotions.WALK.isSame(LivingMotions.WALK));
    }

    /** WALK != IDLE — isSame doit retourner false. */
    @Test
    void walk_isSame_idle_returnsFalse() {
        assertFalse(LivingMotions.WALK.isSame(LivingMotions.IDLE),
            "WALK.isSame(IDLE) doit etre false");
    }

    /** IDLE != RUN — pas d'alias entre autres motions. */
    @Test
    void idle_isSame_run_returnsFalse() {
        assertFalse(LivingMotions.IDLE.isSame(LivingMotions.RUN));
    }

    /** DEATH != DEATH_other — verification que l'alias IDLE/INACTION est exclusif. */
    @Test
    void death_isSame_walk_returnsFalse() {
        assertFalse(LivingMotions.DEATH.isSame(LivingMotions.WALK));
    }

    /**
     * Verification que tous les enums ont un universalOrdinal unique (pas de
     * collision dans ExtendableEnumManager.assign).
     * BUG potentiel : si deux enums avaient le meme nom lowercase, assign()
     * throwrait IllegalArgumentException. Ce test verifie qu'il n'y a pas de
     * doublon en triggerant le chargement de la classe.
     */
    @Test
    void allLivingMotions_haveUniqueOrdinals() {
        LivingMotions[] values = LivingMotions.values();
        long uniqueOrdinals = java.util.Arrays.stream(values)
            .mapToInt(LivingMotions::universalOrdinal)
            .distinct()
            .count();
        org.junit.jupiter.api.Assertions.assertEquals(
            values.length, uniqueOrdinals,
            "Chaque LivingMotions doit avoir un universalOrdinal unique"
        );
    }
}
