Files
XplorePlane/XplorePlane.Tests/Generators/StateGenerators.cs
T
2026-03-18 20:41:05 +08:00

128 lines
5.2 KiB
C#

using System;
using FsCheck;
using FsCheck.Fluent;
using XplorePlane.Models;
namespace XplorePlane.Tests.Generators
{
/// <summary>
/// FsCheck 3.x 自定义生成器:为所有状态模型定义 Arbitrary 生成器。
/// </summary>
public class StateGenerators
{
private static Gen<double> PositionGen =>
Gen.Choose(-10000000, 10000000).Select(i => i / 1000.0);
private static Gen<double> SpeedGen =>
Gen.Choose(0, 1000000).Select(i => i / 1000.0);
private static Gen<double> VoltageGen =>
Gen.Choose(0, 450000).Select(i => i / 1000.0);
private static Gen<double> PowerGen =>
Gen.Choose(0, 3000000).Select(i => i / 1000.0);
private static Gen<double> FrameRateGen =>
Gen.Choose(0, 120000).Select(i => i / 1000.0);
private static Gen<double> MatrixGen =>
Gen.Choose(-10000000, 10000000).Select(i => i / 1000.0);
public static Arbitrary<MotionState> MotionStateArb()
{
var gen = from xm in PositionGen
from ym in PositionGen
from zt in PositionGen
from zd in PositionGen
from tiltD in PositionGen
from dist in PositionGen
from xmSpd in SpeedGen
from ymSpd in SpeedGen
from ztSpd in SpeedGen
from zdSpd in SpeedGen
from tiltDSpd in SpeedGen
from distSpd in SpeedGen
select new MotionState(xm, ym, zt, zd, tiltD, dist,
xmSpd, ymSpd, ztSpd, zdSpd, tiltDSpd, distSpd);
return gen.ToArbitrary();
}
public static Arbitrary<RaySourceState> RaySourceStateArb()
{
var gen = from isOn in ArbMap.Default.GeneratorFor<bool>()
from voltage in VoltageGen
from power in PowerGen
select new RaySourceState(isOn, voltage, power);
return gen.ToArbitrary();
}
public static Arbitrary<DetectorState> DetectorStateArb()
{
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 gen.ToArbitrary();
}
public static Arbitrary<SystemState> SystemStateArb()
{
var gen = from mode in Gen.Elements(
OperationMode.Idle,
OperationMode.Scanning,
OperationMode.CTAcquire,
OperationMode.RecipeRun)
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 gen.ToArbitrary();
}
public static Arbitrary<CameraState> CameraStateArb()
{
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 gen.ToArbitrary();
}
public static Arbitrary<CalibrationMatrix> CalibrationMatrixArb()
{
var gen = from m11 in MatrixGen
from m12 in MatrixGen
from m13 in MatrixGen
from m21 in MatrixGen
from m22 in MatrixGen
from m23 in MatrixGen
from m31 in MatrixGen
from m32 in MatrixGen
from m33 in MatrixGen
select new CalibrationMatrix(m11, m12, m13, m21, m22, m23, m31, m32, m33);
return gen.ToArbitrary();
}
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 gen.ToArbitrary();
}
public static Arbitrary<LinkedViewState> LinkedViewStateArb()
{
var gen = from pos in PhysicalPositionArb().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 gen.ToArbitrary();
}
}
}