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

package com.tiedup.remake.rig.render;

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

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

/**
 * Tests du dispatch engine RIG — scope limité au code pur qui ne dépend pas
 * d'une instance {@code EntityType} / {@code Entity} Minecraft (tests pure-logic,
 * voir {@code build.gradle}).
 *
 * <p>Les cas couverts ici vérouillent les protections défensives (null-safety
 * du filtre d'entité, propreté du reset de registry entre appels {@code AddLayers}).
 * Le dispatch complet (instancier un renderer, traiter un event {@code RenderLivingEvent.Pre})
 * ne peut pas être testé sans MC runtime — ce sera validé Phase 2.7+ via
 * runClient smoke test.</p>
 */
class TiedUpRenderEngineTest {

	@BeforeEach
	void setUp() {
		TiedUpRenderEngine.resetForTest();
	}

	@AfterEach
	void tearDown() {
		TiedUpRenderEngine.resetForTest();
	}

	@Test
	void isEligibleForDispatchRejectsNull() {
		assertFalse(TiedUpRenderEngine.isEligibleForDispatch(null),
			"null entity must NOT be eligible — NPE guard upstream of instanceof chain");
	}

	@Test
	void providerMapStartsEmpty() {
		// hasProviderFor doit dériver l'état courant — sans AddLayers fired, la
		// map est vide donc tous les EntityType (non testables ici sans MC
		// runtime) retournent false. On valide au minimum le contrat null-safe.
		assertFalse(TiedUpRenderEngine.hasProviderFor(null),
			"null entity type must not crash, must return false");
	}

	@Test
	void resetForTestClearsState() {
		TiedUpRenderEngine.resetForTest();
		// Après reset, la map est vide — les helpers d'inspection retournent
		// false. Une invocation supplémentaire de reset doit rester idempotente
		// (pas de NPE sur structures pré-reset).
		TiedUpRenderEngine.resetForTest();
		assertFalse(TiedUpRenderEngine.hasProviderFor(null),
			"state reset must be idempotent and leave the engine in a clean slate");
	}
}
