#0040 增加测试用例

This commit is contained in:
zhengxuan.zhang
2026-03-18 20:41:05 +08:00
parent 67898edc3f
commit 180501808e
8 changed files with 121 additions and 1621 deletions
+19 -37
View File
@@ -1,17 +1,15 @@
using System;
using FsCheck;
using FsCheck.Fluent;
using XplorePlane.Models;
namespace XplorePlane.Tests.Generators
{
/// <summary>
/// FsCheck 自定义生成器:为所有状态模型定义 Arbitrary 生成器。
/// 使用 Arb.Register&lt;StateGenerators&gt;() 注册。
/// FsCheck 3.x 自定义生成器:为所有状态模型定义 Arbitrary 生成器。
/// </summary>
public class StateGenerators
{
// ── 位置范围: -10000 ~ 10000, 速度范围: 0 ~ 1000 ──
private static Gen<double> PositionGen =>
Gen.Choose(-10000000, 10000000).Select(i => i / 1000.0);
@@ -30,8 +28,6 @@ namespace XplorePlane.Tests.Generators
private static Gen<double> MatrixGen =>
Gen.Choose(-10000000, 10000000).Select(i => i / 1000.0);
// ── MotionState: 6 positions + 6 speeds ──
public static Arbitrary<MotionState> MotionStateArb()
{
var gen = from xm in PositionGen
@@ -48,34 +44,28 @@ namespace XplorePlane.Tests.Generators
from distSpd in SpeedGen
select new MotionState(xm, ym, zt, zd, tiltD, dist,
xmSpd, ymSpd, ztSpd, zdSpd, tiltDSpd, distSpd);
return Arb.From(gen);
return gen.ToArbitrary();
}
// ── RaySourceState: bool + 2 doubles ──
public static Arbitrary<RaySourceState> RaySourceStateArb()
{
var gen = from isOn in Arb.Default.Bool().Generator
var gen = from isOn in ArbMap.Default.GeneratorFor<bool>()
from voltage in VoltageGen
from power in PowerGen
select new RaySourceState(isOn, voltage, power);
return Arb.From(gen);
return gen.ToArbitrary();
}
// ── DetectorState: 2 bools + double + string ──
public static Arbitrary<DetectorState> DetectorStateArb()
{
var gen = from isConnected in Arb.Default.Bool().Generator
from isAcquiring in Arb.Default.Bool().Generator
var gen = from isConnected in ArbMap.Default.GeneratorFor<bool>()
from isAcquiring in ArbMap.Default.GeneratorFor<bool>()
from frameRate in FrameRateGen
from res in Gen.Elements("1024x1024", "2048x2048", "2880x2880", "3072x3072", "4260x4260")
select new DetectorState(isConnected, isAcquiring, frameRate, res);
return Arb.From(gen);
return gen.ToArbitrary();
}
// ── SystemState: OperationMode enum + bool + string ──
public static Arbitrary<SystemState> SystemStateArb()
{
var gen = from mode in Gen.Elements(
@@ -83,28 +73,24 @@ namespace XplorePlane.Tests.Generators
OperationMode.Scanning,
OperationMode.CTAcquire,
OperationMode.RecipeRun)
from hasError in Arb.Default.Bool().Generator
from msg in Arb.Default.NonEmptyString().Generator
from hasError in ArbMap.Default.GeneratorFor<bool>()
from msg in ArbMap.Default.GeneratorFor<NonEmptyString>()
let errorMessage = hasError ? msg.Get : string.Empty
select new SystemState(mode, hasError, errorMessage);
return Arb.From(gen);
return gen.ToArbitrary();
}
// ── CameraState: 2 bools + null CurrentFrame + 2 ints + double ──
public static Arbitrary<CameraState> CameraStateArb()
{
var gen = from isConnected in Arb.Default.Bool().Generator
from isStreaming in Arb.Default.Bool().Generator
var gen = from isConnected in ArbMap.Default.GeneratorFor<bool>()
from isStreaming in ArbMap.Default.GeneratorFor<bool>()
from width in Gen.Choose(0, 8192)
from height in Gen.Choose(0, 8192)
from frameRate in FrameRateGen
select new CameraState(isConnected, isStreaming, null, width, height, frameRate);
return Arb.From(gen);
return gen.ToArbitrary();
}
// ── CalibrationMatrix: 9 doubles ──
public static Arbitrary<CalibrationMatrix> CalibrationMatrixArb()
{
var gen = from m11 in MatrixGen
@@ -117,30 +103,26 @@ namespace XplorePlane.Tests.Generators
from m32 in MatrixGen
from m33 in MatrixGen
select new CalibrationMatrix(m11, m12, m13, m21, m22, m23, m31, m32, m33);
return Arb.From(gen);
return gen.ToArbitrary();
}
// ── PhysicalPosition: 3 doubles ──
public static Arbitrary<PhysicalPosition> PhysicalPositionArb()
{
var gen = from x in PositionGen
from y in PositionGen
from z in PositionGen
select new PhysicalPosition(x, y, z);
return Arb.From(gen);
return gen.ToArbitrary();
}
// ── LinkedViewState: PhysicalPosition + bool + DateTime ──
public static Arbitrary<LinkedViewState> LinkedViewStateArb()
{
var gen = from pos in PhysicalPositionArb().Generator
from isExecuting in Arb.Default.Bool().Generator
from isExecuting in ArbMap.Default.GeneratorFor<bool>()
from ticks in Gen.Choose(0, int.MaxValue)
let dt = DateTime.MinValue.AddTicks((long)ticks * 10000)
select new LinkedViewState(pos, isExecuting, dt);
return Arb.From(gen);
return gen.ToArbitrary();
}
}
}
}