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

package com.tiedup.remake.rig.util;

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

import org.junit.jupiter.api.Test;

/**
 * Tests de {@link TimePairList} : creation, isTimeInPairs, bornes.
 *
 * Classe completement pure Java — aucune dependance MC ou Forge.
 */
class TimePairListTest {

    /** Un nombre impair d'arguments doit lever IllegalArgumentException. */
    @Test
    void create_oddNumberOfArgs_throwsIllegalArgument() {
        assertThrows(IllegalArgumentException.class,
            () -> TimePairList.create(0.0f, 1.0f, 2.0f),
            "create() avec nombre impair d'args doit lever IllegalArgumentException");
    }

    /** Aucune paire (create()) : rien n'est dans les paires. */
    @Test
    void create_empty_nothingIsInPairs() {
        TimePairList list = TimePairList.create();
        assertFalse(list.isTimeInPairs(0.5f),
            "Liste vide : aucun temps ne doit etre dans les paires");
    }

    /** Temps dans une paire [0.0, 1.0]. */
    @Test
    void isTimeInPairs_timeInsidePair_returnsTrue() {
        TimePairList list = TimePairList.create(0.0f, 1.0f);
        assertTrue(list.isTimeInPairs(0.0f), "0.0 est la borne de debut (inclusive)");
        assertTrue(list.isTimeInPairs(0.5f), "0.5 est dans [0.0, 1.0)");
    }

    /**
     * La borne de fin est EXCLUSIVE (code : time >= begin && time < end).
     * Temps = 1.0 ne doit PAS etre dans la paire [0.0, 1.0).
     */
    @Test
    void isTimeInPairs_exactEndBound_returnsFalse() {
        TimePairList list = TimePairList.create(0.0f, 1.0f);
        assertFalse(list.isTimeInPairs(1.0f),
            "La borne de fin est exclusive : 1.0 ne doit pas etre dans [0.0, 1.0)");
    }

    /** Temps avant toute paire. */
    @Test
    void isTimeInPairs_beforeFirstPair_returnsFalse() {
        TimePairList list = TimePairList.create(0.5f, 1.0f);
        assertFalse(list.isTimeInPairs(0.2f),
            "0.2 < 0.5 ne doit pas etre dans [0.5, 1.0)");
    }

    /** Deux paires non-contigues — le trou entre elles ne doit pas matcher. */
    @Test
    void isTimeInPairs_gapBetweenPairs_returnsFalse() {
        TimePairList list = TimePairList.create(0.0f, 0.3f, 0.7f, 1.0f);
        assertFalse(list.isTimeInPairs(0.5f),
            "0.5 est dans le trou entre [0.0,0.3) et [0.7,1.0)");
    }

    /** Temps dans la deuxieme paire d'une liste multi-paires. */
    @Test
    void isTimeInPairs_secondPair_returnsTrue() {
        TimePairList list = TimePairList.create(0.0f, 0.3f, 0.7f, 1.0f);
        assertTrue(list.isTimeInPairs(0.8f),
            "0.8 est dans la deuxieme paire [0.7, 1.0)");
    }

    /** Valeur negative — hors de [0.5, 1.0). */
    @Test
    void isTimeInPairs_negativeTime_returnsFalse() {
        TimePairList list = TimePairList.create(0.5f, 1.0f);
        assertFalse(list.isTimeInPairs(-0.1f));
    }
}
