Câble le dispatch renderer RIG via deux subscribers auto-registered (split MOD bus pour AddLayers, FORGE bus pour RenderLivingEvent.Pre) — pas besoin de wiring explicite dans TiedUpMod. onAddLayers (MOD bus) : construit la map entityRendererProvider avec EntityType.PLAYER → TiedUpPlayerRenderer (Phase 2) ; poste PatchedRenderersEvent.Add pour extensions tierces. onRenderLiving (FORGE bus, priority HIGH) : filtre strict instanceof Player || AbstractTiedUpNpc (protège MCA villagers cf. V3-REW-10) ; vérifie patch.overrideRender() ; dispatche vers PatchedEntityRenderer et cancel l'event. Try/catch robuste : log WARN une seule fois par UUID sur exception, fallback vanilla (event non-canceled). 3 tests unitaires (pure-logic, sans MC runtime) : null-safety du filtre et idempotence du reset. Le dispatch complet sera validé Phase 2.8 runClient smoke test. Le biped armature étant identity (Phase 2.4 stub), le hook rendra le player effondré à l'origine dès qu'il s'active — attendu, warn déjà en place depuis Phase 2.5.
62 lines
2.0 KiB
Java
62 lines
2.0 KiB
Java
/*
|
|
* © 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");
|
|
}
|
|
}
|