feat(03-05): ajoute 4 champs Visual* optionnels + round-trip tests (Task 1)

- GravityFlipRegion: VisualColor/VisualMode/VisualRefreshMs/VisualOpacity
  avec defaults (#00FFFF, Outline, 1000, 0.5), getters/setters, javadoc.
- CODEC: 4 KeyedCodec optionnels (pas de validator nonNull) => back-compat
  legacy regions.json.
- 2 tests round-trip (custom + defaults quand champs absents).
This commit is contained in:
2026-04-23 14:52:42 +02:00
parent d43aa4a98c
commit 0069d4c47e
2 changed files with 72 additions and 0 deletions
@@ -144,6 +144,41 @@ class GravityFlipRegionCodecTest {
assertFalse(decoded.isAffectItems());
}
// ---------- Plan 03-05 : 4 visualization fields ----------
@Test
void roundTripPreservesVisualFields() {
GravityFlipRegion src = baseRegion();
src.setVisualColor("#FF8800");
src.setVisualMode("Faces");
src.setVisualRefreshMs(500);
src.setVisualOpacity(0.75);
GravityFlipRegion decoded = roundTrip(src);
assertEquals("#FF8800", decoded.getVisualColor());
assertEquals("Faces", decoded.getVisualMode());
assertEquals(500, decoded.getVisualRefreshMs());
assertEquals(0.75, decoded.getVisualOpacity(), 1e-9);
}
@Test
void roundTripPreservesVisualDefaultsWhenFieldsAbsent() {
// Region construite via constructeur legacy 3-arg — simule un regions.json legacy
// (ni 03-04 ni 03-05 présents).
GravityFlipRegion src = new GravityFlipRegion(
"legacy-viz",
new Box(new Vector3d(0, 0, 0), new Vector3d(1, 1, 1)),
true);
GravityFlipRegion decoded = roundTrip(src);
assertEquals("#00FFFF", decoded.getVisualColor(), "default VisualColor=#00FFFF (cyan)");
assertEquals("Outline", decoded.getVisualMode(), "default VisualMode=Outline");
assertEquals(1000, decoded.getVisualRefreshMs(), "default VisualRefreshMs=1000");
assertEquals(0.5, decoded.getVisualOpacity(), 1e-9, "default VisualOpacity=0.5");
}
private static GravityFlipRegion baseRegion() {
return new GravityFlipRegion(
"r",