using System.Linq;
using AcDream.Core.Physics;
using DatReaderWriter;
using DatReaderWriter.Options;
using Xunit;
using Xunit.Abstractions;
namespace AcDream.Core.Tests.Conformance;
///
/// Diagnostic (always passes): for each captured retail doorway transition, print
/// what acdream computes — PointInCell(seed), PointInCell(picked), and the
/// FindCellList result — so the P0→P1 divergence is precisely characterized
/// (real pick-criterion divergence vs a test/sphere artifact).
///
public class ThresholdDivergenceDiagnosticTests
{
private readonly ITestOutputHelper _out;
public ThresholdDivergenceDiagnosticTests(ITestOutputHelper output) => _out = output;
[Fact]
public void Diagnose_ThresholdTransitions()
{
var datDir = ConformanceDats.ResolveDatDir();
if (datDir is null) { _out.WriteLine("SKIP: dats unavailable"); return; }
var fixturePath = System.IO.Path.Combine(ConformanceDats.FixturesDir, "find-cell-list-threshold.log");
if (!System.IO.File.Exists(fixturePath)) { _out.WriteLine("SKIP: capture pending"); return; }
using var dats = new DatCollection(datDir, DatAccessType.Read);
var cache = new PhysicsDataCache();
var cells = new System.Collections.Generic.Dictionary();
for (uint low = 0x016Fu; low <= 0x0175u; low++)
{
uint id = ConformanceDats.HoltburgLandblock | low;
cells[id] = ConformanceDats.LoadEnvCell(dats, cache, id);
}
bool In(uint id, System.Numerics.Vector3 p) =>
cells.TryGetValue(id, out var c) && c.PointInCell(p);
foreach (var pick in RetailTrace.ParseAll(System.IO.File.ReadAllLines(fixturePath)))
{
uint ours = CellTransit.FindCellList(cache, pick.Position, 0.4f, pick.SeedCellId);
_out.WriteLine(
$"seed=0x{pick.SeedCellId & 0xFFFF:X4} pos=({pick.Position.X:F2},{pick.Position.Y:F2},{pick.Position.Z:F2}) " +
$"retail=0x{pick.PickedCellId & 0xFFFF:X4} acdream=0x{ours & 0xFFFF:X4} " +
$"{(ours == pick.PickedCellId ? "MATCH" : "DIVERGE")} | " +
$"inSeed={(In(pick.SeedCellId, pick.Position) ? 1 : 0)} " +
$"in0170={(In(0xA9B40170u, pick.Position) ? 1 : 0)} " +
$"in0171={(In(0xA9B40171u, pick.Position) ? 1 : 0)}");
}
}
}