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

package com.tiedup.remake.v2.client;

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

import org.junit.jupiter.api.Test;

/**
 * Tests de {@link BondageStateHelpers}.
 *
 * <p><strong>Scope</strong> : null-safety uniquement. Les branches "happy
 * path" nécessitent :</p>
 * <ul>
 *   <li>Un {@code Player} réel (MC entité, bootstrap Forge),</li>
 *   <li>La capability {@code V2_BONDAGE_EQUIPMENT} attachée,</li>
 *   <li>Un {@code ItemStack} avec un {@code IV2BondageItem} registered.</li>
 * </ul>
 *
 * <p>Ces branches ne peuvent pas être testées en unitaire sans MC bootstrap.
 * Elles sont couvertes implicitement par les tests d'intégration manuels
 * (runClient) et les packet tests qui vérifient le sync capability.</p>
 *
 * <p>Les helpers sont pure Java sur le path null → false, donc chaque
 * test garantit qu'aucune NPE ne peut remonter vers {@code PlayerPatch}.</p>
 */
class BondageStateHelpersTest {

    @Test
    void isBound_nullPlayer_returnsFalse() {
        assertFalse(
            BondageStateHelpers.isBound(null),
            "isBound(null) doit renvoyer false sans NPE"
        );
    }

    @Test
    void isDogPoseActive_nullPlayer_returnsFalse() {
        assertFalse(
            BondageStateHelpers.isDogPoseActive(null),
            "isDogPoseActive(null) doit renvoyer false sans NPE"
        );
    }

    @Test
    void isStrugglingClient_nullPlayer_returnsFalse() {
        assertFalse(
            BondageStateHelpers.isStrugglingClient(null),
            "isStrugglingClient(null) doit renvoyer false sans NPE"
        );
    }

    @Test
    void isSleepingBound_nullPlayer_returnsFalse() {
        assertFalse(
            BondageStateHelpers.isSleepingBound(null),
            "isSleepingBound(null) doit renvoyer false sans NPE"
        );
    }

    @Test
    void isFallingBound_nullPlayer_returnsFalse() {
        assertFalse(
            BondageStateHelpers.isFallingBound(null),
            "isFallingBound(null) doit renvoyer false sans NPE"
        );
    }

    /**
     * Double-appel null ne doit pas leaker d'état (les helpers sont stateless,
     * mais on vérifie qu'aucun side-effect n'est introduit).
     */
    @Test
    void allHelpers_doubleCallNull_stillReturnsFalse() {
        for (int i = 0; i < 2; i++) {
            assertFalse(BondageStateHelpers.isBound(null));
            assertFalse(BondageStateHelpers.isDogPoseActive(null));
            assertFalse(BondageStateHelpers.isStrugglingClient(null));
            assertFalse(BondageStateHelpers.isSleepingBound(null));
            assertFalse(BondageStateHelpers.isFallingBound(null));
        }
    }
}
