diff --git a/test/unit/CounterDrone.Core.Tests/DefensePlannerTests.cs b/test/unit/CounterDrone.Core.Tests/DefensePlannerTests.cs index a92f8b1..d8ca673 100644 --- a/test/unit/CounterDrone.Core.Tests/DefensePlannerTests.cs +++ b/test/unit/CounterDrone.Core.Tests/DefensePlannerTests.cs @@ -137,7 +137,12 @@ namespace CounterDrone.Core.Tests _output.WriteLine($" FireTime={e.FireTime:F2}s Y={e.TargetY:F0} PlatIdx={e.PlatformIndex}"); var dump = string.Join("\n", events.Select(e => $" FireTime={e.FireTime:F2}s Y={e.TargetY:F0} PlatIdx={e.PlatformIndex}")); - Assert.True(false, $"=== 3无人机 3车道 Planner输出 ===\n总弹药: {events.Count}发, 跨度: {last-first:F2}s\n{dump}"); + // 3 车道各需 9 发 × 3 = 27 发 + Assert.True(events.Count >= 27, $"应≥27发, 实际{events.Count}\n{dump}"); + Assert.True(last - first > 0, $"跨度>0\n{dump}"); + // 验证每个车道有独立的 TargetZ + var zs = events.Select(e => e.TargetZ).Distinct().ToList(); + Assert.True(zs.Count >= 2, $"应有至少2个不同Z值(distinct lanes)\n{dump}"); } [Fact] diff --git a/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs b/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs index 5f3bd2b..01c2331 100644 --- a/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs +++ b/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs @@ -263,6 +263,7 @@ namespace CounterDrone.Core.Tests var clouds = eng.Events.Count(e => e.Type == SimEventType.CloudGenerated); var msg = $"Jet: launched={launched} clouds={clouds} status={drone.Status} hp={drone.Hp:F2}"; + System.IO.File.WriteAllText(@"C:\Users\Tellme\Desktop\test_jet.txt", msg); VerifyAndExportReport(eng, drone); Assert.True(launched > 0, msg); Assert.Equal(DroneStatus.Destroyed, drone.Status); diff --git a/test/unit/CounterDrone.Core.Tests/MunitionEntityTests.cs b/test/unit/CounterDrone.Core.Tests/MunitionEntityTests.cs index eaad6ae..e4e5e5d 100644 --- a/test/unit/CounterDrone.Core.Tests/MunitionEntityTests.cs +++ b/test/unit/CounterDrone.Core.Tests/MunitionEntityTests.cs @@ -21,29 +21,24 @@ namespace CounterDrone.Core.Tests } [Fact] - public void GroundBased_ArrivesAtTargetPosition() + public void GroundBased_ArrivesNearTarget_WithInterpolation() { - // 验证炮弹到达时,水平位置接近目标 - var m = new MunitionEntity("m1", PlatformType.GroundBased, + // 大 tick 步长也应到达目标附近 + var m = new MunitionEntity("m2", PlatformType.GroundBased, AerosolType.InertGas, - startX: 0, startY: 0, startZ: 0, - targetX: 5000, targetY: 300, targetZ: 0, - muzzleVelocity: 500f, releaseAltitude: 300f, launchTime: 0f); + startX: 5000, startY: 0, startZ: 50, + targetX: 10000, targetY: 500, targetZ: 0, + muzzleVelocity: 800f, releaseAltitude: 500f, launchTime: 143.69f); - for (int i = 0; i < 500; i++) + float time = Kinematics.ParabolicShellTime(5000.25f, 500f, 800f); + for (float t = 0; t < time + 1f; t += 0.4f) { - m.Update(0.05f); + m.Update(0.4f); if (m.HasArrived) break; } - - Assert.True(m.HasArrived, "炮弹应到达"); - // 到达释放高度 - Assert.True(System.Math.Abs(m.PosY - 300f) < 5f, $"PosY={m.PosY:F1} 应≈300"); - // 水平位置接近目标 - var dist = System.Math.Sqrt( - (m.PosX - m.TargetX) * (m.PosX - m.TargetX) + - (m.PosZ - m.TargetZ) * (m.PosZ - m.TargetZ)); - Assert.True(dist < 1000f, $"到达点距目标 {dist:F0}m,应<1000m"); + Assert.True(m.HasArrived, "应到达"); + Assert.Equal(500f, m.PosY, 5f); + Assert.True(System.Math.Abs(m.PosX - 10000) < 200f, $"X={m.PosX:F1} 应≈10000"); } [Fact]