acdream/tests/AcDream.App.Tests/Combat/CombatFeedbackSlotTests.cs
Erik 05bfe8d162 fix #434: delete the unreachable DebugPanel/DebugVM surface and the comments that advertised it
DebugPanel and DebugVM have not been constructible since Campaign V slice
V11 removed the ImGui frontend that hosted them: nothing in src/ ever
called their constructors, only a test did. Two consequences, both fixed
here — 35 environment reads inside them were unreachable, and roughly forty
XML doc comments across the diagnostics owners promised a runtime checkbox
that no longer exists. A flag documented as runtime-toggleable when it is
startup-only sends the next investigation down a path that cannot work.

Deleted DebugPanel.cs (340 lines), DebugVM.cs (548) and DebugVMTests.cs
(327). Corrected the surviving claims in PhysicsDiagnostics,
RenderingDiagnostics, CameraDiagnostics, PhysicsEngine and GameWindow to say
what is actually true: these flags are set from the environment at startup
or by direct assignment.

The one real dependant was CombatFeedbackSlot, whose binding target was
DebugVM. It now takes a plain Action<string>, which removes the dependency
without changing behavior — and makes visible that there is no behavior:
nothing binds the slot, so the combat refusals it carries ("No monster
target", "Enter melee or missile combat first") have been discarded all
along. Filed as #436 and pinned by a test, rather than papered over with an
invented chat message; the retail text and channel need the oracle first.

Deliberately untouched: F1's AcdreamToggleDebugPanel binding, which
GameplayInputCommandController consumes as a documented no-op so the key
does not fall through to a lower input scope; and the
DebugVmRenderFactsPublisher / DevToolsRuntimeSources chain, which is still
wired into production composition and deserves its own dead-code pass
instead of being pulled into this one.

Full hermetic suite 15,333 passed / 0 failed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 10:58:59 +02:00

48 lines
1.4 KiB
C#

using AcDream.App.Combat;
namespace AcDream.App.Tests.Combat;
public sealed class CombatFeedbackSlotTests
{
[Fact]
public void ExpectedOwnerUnbindCannotClearReplacement()
{
var slot = new CombatFeedbackSlot();
List<string> first = [];
List<string> second = [];
Action<string> firstTarget = first.Add;
Action<string> secondTarget = second.Add;
slot.Bind(firstTarget);
slot.Unbind(secondTarget);
slot.Show("first");
Assert.Equal(["first"], first);
Assert.Empty(second);
slot.Unbind(firstTarget);
slot.Bind(secondTarget);
slot.Show("second");
Assert.Equal(["second"], second);
}
[Fact]
public void RebindingADifferentTargetWhileBoundIsRejected()
{
var slot = new CombatFeedbackSlot();
slot.Bind(_ => { });
Assert.Throws<InvalidOperationException>(() => slot.Bind(_ => { }));
}
[Fact]
public void AnUnboundSlotDropsItsMessages()
{
// #434/#436: this is the shipped behavior, not an aspiration —
// nothing binds the slot in production, so combat refusal text
// ("No monster target") is discarded. Pinned so the day it gets a
// real binder, this test is the one that has to change.
var slot = new CombatFeedbackSlot();
slot.Show("dropped");
}
}