CounterDroneBackend/src/CounterDrone.Core/TestPathProvider.cs
tian d8470bad30 Phase 10: 探测实时链路开发 + planner 诊断 + 硬编码消除
- 3D球冠探测: IsInCoverage, DetectionEntity, Tick 第5步扫描
- 探测融合: EarliestDetection 采样法, break 修复
- planner 诊断: HasInterceptWindow 拦截窗口检查
- TryGenerateFireEvents 返回拒绝原因
- Summary 含失败原因+建议值(探测范围/弧长)
- PlanningFailed 事件: 引擎在规划失败时发出事件
- 硬编码消除: Phase2Duration→AmmunitionSpec
  ExpansionFactor/TimingSafetyMargin→PlannerConfig
  速度从 waypoint.Speed 读取(不用 TypicalSpeed)
- TestData 改为从 seeded 数据库读取(不再内嵌 JSON)
- 默认数据加 3D球冠参数,巡航导弹速度300→200
  空基航路10km→20km, 位置调整
- 222 测试全通过
2026-06-16 14:10:23 +08:00

68 lines
2.1 KiB
C#

using System;
using System.IO;
using System.Reflection;
namespace CounterDrone.Core
{
/// <summary>IPathProvider 的实现,用于单元测试环境</summary>
public class TestPathProvider : IPathProvider
{
private readonly string _root;
public TestPathProvider(string rootDir)
{
_root = rootDir;
Directory.CreateDirectory(_root);
CopyDataFiles();
}
/// <summary>从项目 data/ 目录复制 defaults.json 和 planner_config.json 到测试根目录</summary>
private void CopyDataFiles()
{
var sourceDir = FindProjectDataDirectory();
if (sourceDir == null) return;
foreach (var file in new[] { "defaults.json", "planner_config.json" })
{
var src = Path.Combine(sourceDir, file);
var dst = Path.Combine(_root, file);
if (File.Exists(src))
File.Copy(src, dst, true); // 始终覆盖,确保测试用最新配置
}
}
public static string? FindProjectDataDirectory()
{
var asmDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (asmDir == null) return null;
// 从 bin/Debug/netX.X 往上走到仓库根
var dir = asmDir;
for (int i = 0; i < 10; i++)
{
var candidate = Path.Combine(dir, "data/defaults.json");
if (File.Exists(candidate)) return Path.Combine(dir, "data");
dir = Path.GetDirectoryName(dir);
if (dir == null) break;
}
return null;
}
public string GetDataRoot() => _root;
public string GetMainDbPath() => Path.Combine(_root, "main.db");
public string GetFramesDir()
{
var dir = Path.Combine(_root, "frames");
Directory.CreateDirectory(dir);
return dir;
}
public string GetModelsDir()
{
var dir = Path.Combine(_root, "models");
Directory.CreateDirectory(dir);
return dir;
}
}
}