Adds the first-tick bootstrap diff: ToLoadNear for the (2*near+1)^2 inner window, ToLoadFar for the outer annulus up to FarRadius. Uses Chebyshev distance, matching existing Recenter convention. Also renames the single-tier RecenterTo → RecenterToSingleTier to free the canonical name for the upcoming two-tier overload (T5). Updates StreamingRegionTests and StreamingController to call the renamed method. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
37 lines
1.4 KiB
C#
37 lines
1.4 KiB
C#
using AcDream.App.Streaming;
|
||
using Xunit;
|
||
|
||
namespace AcDream.Core.Tests.Streaming;
|
||
|
||
public class StreamingRegionTwoTierTests
|
||
{
|
||
[Fact]
|
||
public void Constructor_TwoRadii_ExposesNearAndFarRadii()
|
||
{
|
||
var region = new StreamingRegion(centerX: 100, centerY: 100, nearRadius: 4, farRadius: 12);
|
||
|
||
Assert.Equal(4, region.NearRadius);
|
||
Assert.Equal(12, region.FarRadius);
|
||
Assert.Equal(100, region.CenterX);
|
||
Assert.Equal(100, region.CenterY);
|
||
// Radius (used by existing single-radius hysteresis math) must alias to
|
||
// FarRadius — the outer ring drives "everything currently loaded" bookkeeping.
|
||
// If a future change mistakenly aliases Radius to NearRadius, hysteresis
|
||
// becomes (NearRadius+2) for the far-tier unload, which is wrong.
|
||
Assert.Equal(region.FarRadius, region.Radius);
|
||
}
|
||
|
||
[Fact]
|
||
public void RecenterTo_FirstTick_SplitsLoadIntoNearAndFar()
|
||
{
|
||
// near=1, far=3 → near window is 3×3=9, far window is 7×7-3×3=40 LBs.
|
||
var region = new StreamingRegion(centerX: 100, centerY: 100, nearRadius: 1, farRadius: 3);
|
||
var diff = region.ComputeFirstTickDiff();
|
||
|
||
Assert.Equal(9, diff.ToLoadNear.Count);
|
||
Assert.Equal(40, diff.ToLoadFar.Count);
|
||
Assert.Empty(diff.ToPromote);
|
||
Assert.Empty(diff.ToDemote);
|
||
Assert.Empty(diff.ToUnload);
|
||
}
|
||
}
|