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