From 2a062c07bdf0af96d8743ce029e8de7bbeb81cb3 Mon Sep 17 00:00:00 2001
From: tian <11429339@qq.com>
Date: Fri, 19 Jun 2026 10:35:42 +0800
Subject: [PATCH] =?UTF-8?q?+DataServiceTests=20(12=20=E4=B8=AA)=20/=20?=
=?UTF-8?q?=E4=BF=AE=E5=A4=8D=20FormationTemplate=20=E7=BC=BA=20PrimaryKey?=
=?UTF-8?q?=20/=20=E5=88=A0=E9=99=A4=E6=AD=BB=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Models/FormationTemplate.cs | 3 +
.../CounterDrone.Core/CounterDrone.Core.dll | Bin 182272 -> 182272 bytes
.../DataServiceTests.cs | 170 ++++++++++++++++++
unity_plugins/CounterDrone.Core.dll | Bin 182272 -> 182272 bytes
4 files changed, 173 insertions(+)
create mode 100644 test/unit/CounterDrone.Core.Tests/DataServiceTests.cs
diff --git a/src/CounterDrone.Core/Models/FormationTemplate.cs b/src/CounterDrone.Core/Models/FormationTemplate.cs
index c5abef9..7a2d1dc 100644
--- a/src/CounterDrone.Core/Models/FormationTemplate.cs
+++ b/src/CounterDrone.Core/Models/FormationTemplate.cs
@@ -1,10 +1,13 @@
using CounterDrone.Core.Models;
+using SQLite;
namespace CounterDrone.Core.Models
{
/// 编队模板
+ [Table("FormationTemplate")]
public class FormationTemplate
{
+ [PrimaryKey]
public string Id { get; set; } = "";
public string Name { get; set; } = "";
public int FormationMode { get; set; }
diff --git a/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll
index 600fb953e3d088c8b402bd7977f49b2819a1dd88..d7a9cd6c63182bea22795083f721e97b3feb6285 100644
GIT binary patch
delta 804
zcmXw%e@IhN6vywmxoj?Tx-yY;&WS%V+abLSv)$Ub!
zJrQqSr+@U_Is((a$LF9<1jta-e!-|x)Zt^|1;~Iou>;y*Km@E&WR3v>GB$;CyR2BU
zVn~QqPJBm5e-oiJQXc~vU7#9}H;tmI3RKtzNR4Q0sVX^1y_M!4$WRPe;G(o01L9ri
zCmq9}he0wVy8xM&-JG;N459)GNXH0hvK}c#RBs3=Q&DwJNEwIvv>{47hK(@U2$Ky;
z?ht7Nk~9N`q9|Ef6eUZGqC^xRTeJWnqVPi&ED?jB9?YmS?0SpL
zH(TVGn3thY?rB+upKzYIS0E``%eHsQlJ3qfR738qK$EP9TZQA$DV424_H*^*itLbMN2D)Ww|-8N47
zB3KkmvD_4iI$#$zMZv<%%jXo8zLYGeFMbGm&dT@j+v8kHCz(+lpqX4C+isp4cupA
zQW#-NQkW6<#z9C19qS2$N;5B4la|tX`4KWyFfSK~uWTnlb`oR-`8)oOMJIo%30MKR7f)eYw#ORvyOGh
zOHbvxdnHMKZy#x7W9x8JQsi&IDQFd&H{ir<#@o8${QB&Lvrj%c=3XsbxgkD!Kub!C
z4ZNFodA%N+*=;mi3{JP#X5>72H_w}FF5Yf*8#oVVwK&CZ?`Q#txgTf)<;q)@9}+m{
zp!nSe&_?m67>!ERzXKRlXgW0YCM9b2JW4egvh2nD^leMs-&=mA1*jJccr{ASacNpY&b@5v8@=@iihT?I;q}3c;ZHL5iedI
zVk2g(jp!}JK%AI+kr@exJ$*vS6B7~_&e)N=Q6=>_V#Nt3>sp|L^jW!hc#*~-s89I|
D&M)#C
diff --git a/test/unit/CounterDrone.Core.Tests/DataServiceTests.cs b/test/unit/CounterDrone.Core.Tests/DataServiceTests.cs
new file mode 100644
index 0000000..2702931
--- /dev/null
+++ b/test/unit/CounterDrone.Core.Tests/DataServiceTests.cs
@@ -0,0 +1,170 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using CounterDrone.Core;
+using CounterDrone.Core.Models;
+using CounterDrone.Core.Repository;
+using CounterDrone.Core.Services;
+using Xunit;
+
+namespace CounterDrone.Core.Tests
+{
+ public class DataServiceTests : IDisposable
+ {
+ private readonly string _testDir;
+ private readonly SQLite.SQLiteConnection _db;
+ private readonly IDataService _service;
+
+ public DataServiceTests()
+ {
+ _testDir = Path.Combine(Path.GetTempPath(), $"cd_ds_{Guid.NewGuid():N}");
+ var paths = new TestPathProvider(_testDir);
+ _db = new DatabaseManager(paths).OpenMainDb();
+ _service = new DataService(
+ new AmmunitionSpecRepository(_db),
+ new FireUnitSpecRepository(_db),
+ new DroneSpecRepository(_db),
+ new SensorSpecRepository(_db),
+ new EnvironmentSpecRepository(_db),
+ new FormationTemplateRepository(_db),
+ new RouteTemplateRepository(_db));
+ }
+
+ public void Dispose()
+ {
+ _db?.Close();
+ if (Directory.Exists(_testDir)) Directory.Delete(_testDir, true);
+ }
+
+ // ══════════════════════════════ DroneSpec ══════════════════════════════
+
+ [Fact]
+ public void DroneSpec_SaveAndGet()
+ {
+ var spec = new DroneSpec
+ {
+ Id = "test-drone", Name = "Test Drone", DroneType = (int)DroneType.FixedWing,
+ PowerType = (int)PowerType.Piston, TypicalSpeed = 150, TypicalAltitude = 500,
+ };
+ _service.SaveDrone(spec);
+ var result = _service.GetDrone("test-drone");
+ Assert.NotNull(result);
+ Assert.Equal("Test Drone", result.Name);
+ Assert.Equal(150, result.TypicalSpeed);
+ }
+
+ [Fact]
+ public void DroneSpec_Save_UpdateExisting()
+ {
+ _service.SaveDrone(new DroneSpec { Id = "test-drone", Name = "Old", TypicalSpeed = 100 });
+ _service.SaveDrone(new DroneSpec { Id = "test-drone", Name = "New", TypicalSpeed = 200 });
+ var result = _service.GetDrone("test-drone");
+ Assert.Equal("New", result.Name);
+ Assert.Equal(200, result.TypicalSpeed);
+ }
+
+ [Fact]
+ public void DroneSpec_Delete()
+ {
+ _service.SaveDrone(new DroneSpec { Id = "test-drone", Name = "ToDelete" });
+ _service.DeleteDrone("test-drone");
+ Assert.Null(_service.GetDrone("test-drone"));
+ }
+
+ [Fact]
+ public void DroneSpec_GetAll()
+ {
+ _service.SaveDrone(new DroneSpec { Id = "d1", Name = "D1" });
+ _service.SaveDrone(new DroneSpec { Id = "d2", Name = "D2" });
+ var all = _service.GetAllDrones();
+ Assert.True(all.Count >= 2);
+ }
+
+ // ══════════════════════════════ FireUnitSpec ═══════════════════════════
+
+ [Fact]
+ public void FireUnitSpec_SaveAndGet()
+ {
+ var spec = new FireUnitSpec
+ {
+ Id = "test-fu", Name = "Test Unit", PlatformType = (int)PlatformType.GroundBased,
+ GunCount = 4, MuzzleVelocity = 800,
+ };
+ _service.SaveFireUnit(spec);
+ var result = _service.GetFireUnit("test-fu");
+ Assert.NotNull(result);
+ Assert.Equal("Test Unit", result.Name);
+ Assert.Equal(800, result.MuzzleVelocity);
+ }
+
+ [Fact]
+ public void FireUnitSpec_Delete()
+ {
+ _service.SaveFireUnit(new FireUnitSpec { Id = "test-fu", Name = "ToDelete" });
+ _service.DeleteFireUnit("test-fu");
+ Assert.Null(_service.GetFireUnit("test-fu"));
+ }
+
+ [Fact]
+ public void FireUnitSpec_GetAll()
+ {
+ _service.SaveFireUnit(new FireUnitSpec { Id = "f1", Name = "F1" });
+ _service.SaveFireUnit(new FireUnitSpec { Id = "f2", Name = "F2" });
+ var all = _service.GetAllFireUnits();
+ Assert.True(all.Count >= 2);
+ }
+
+ // ══════════════════════════════ SensorSpec ═════════════════════════════
+
+ [Fact]
+ public void SensorSpec_SaveAndGet()
+ {
+ var spec = new SensorSpec { Id = "test-sensor", Name = "Test Sensor", RadarRange = 5000 };
+ _service.SaveSensor(spec);
+ var result = _service.GetSensor("test-sensor");
+ Assert.Equal(5000, result.RadarRange);
+ }
+
+ [Fact]
+ public void SensorSpec_Delete()
+ {
+ _service.SaveSensor(new SensorSpec { Id = "test-sensor", Name = "Del" });
+ _service.DeleteSensor("test-sensor");
+ Assert.Null(_service.GetSensor("test-sensor"));
+ }
+
+ // ══════════════════════════════ EnvironmentSpec ════════════════════════
+
+ [Fact]
+ public void EnvironmentSpec_SaveAndGet()
+ {
+ var spec = new EnvironmentSpec { Id = "test-env", Name = "Fog", WeatherType = 2, Visibility = 500 };
+ _service.SaveEnvironment(spec);
+ var result = _service.GetEnvironment("test-env");
+ Assert.Equal(500, result.Visibility);
+ }
+
+ // ══════════════════════════════ FormationTemplate ══════════════════════
+
+ [Fact]
+ public void FormationTemplate_SaveAndGet()
+ {
+ var spec = new FormationTemplate { Id = "test-fmt", Name = "Test Formation", FormationMode = 1, LateralCount = 3 };
+ _service.SaveFormation(spec);
+ var result = _service.GetFormation("test-fmt");
+ Assert.Equal(3, result.LateralCount);
+ }
+
+ // ══════════════════════════════ RouteTemplate ══════════════════════════
+
+ [Fact]
+ public void RouteTemplate_SaveAndGet()
+ {
+ var spec = new RouteTemplate { Id = "test-route", Name = "Test Route" };
+ _service.SaveRoute(spec);
+ var result = _service.GetRoute("test-route");
+ Assert.Equal("Test Route", result.Name);
+ }
+ }
+}
diff --git a/unity_plugins/CounterDrone.Core.dll b/unity_plugins/CounterDrone.Core.dll
index 600fb953e3d088c8b402bd7977f49b2819a1dd88..d7a9cd6c63182bea22795083f721e97b3feb6285 100644
GIT binary patch
delta 804
zcmXw%e@IhN6vywmxoj?Tx-yY;&WS%V+abLSv)$Ub!
zJrQqSr+@U_Is((a$LF9<1jta-e!-|x)Zt^|1;~Iou>;y*Km@E&WR3v>GB$;CyR2BU
zVn~QqPJBm5e-oiJQXc~vU7#9}H;tmI3RKtzNR4Q0sVX^1y_M!4$WRPe;G(o01L9ri
zCmq9}he0wVy8xM&-JG;N459)GNXH0hvK}c#RBs3=Q&DwJNEwIvv>{47hK(@U2$Ky;
z?ht7Nk~9N`q9|Ef6eUZGqC^xRTeJWnqVPi&ED?jB9?YmS?0SpL
zH(TVGn3thY?rB+upKzYIS0E``%eHsQlJ3qfR738qK$EP9TZQA$DV424_H*^*itLbMN2D)Ww|-8N47
zB3KkmvD_4iI$#$zMZv<%%jXo8zLYGeFMbGm&dT@j+v8kHCz(+lpqX4C+isp4cupA
zQW#-NQkW6<#z9C19qS2$N;5B4la|tX`4KWyFfSK~uWTnlb`oR-`8)oOMJIo%30MKR7f)eYw#ORvyOGh
zOHbvxdnHMKZy#x7W9x8JQsi&IDQFd&H{ir<#@o8${QB&Lvrj%c=3XsbxgkD!Kub!C
z4ZNFodA%N+*=;mi3{JP#X5>72H_w}FF5Yf*8#oVVwK&CZ?`Q#txgTf)<;q)@9}+m{
zp!nSe&_?m67>!ERzXKRlXgW0YCM9b2JW4egvh2nD^leMs-&=mA1*jJccr{ASacNpY&b@5v8@=@iihT?I;q}3c;ZHL5iedI
zVk2g(jp!}JK%AI+kr@exJ$*vS6B7~_&e)N=Q6=>_V#Nt3>sp|L^jW!hc#*~-s89I|
D&M)#C