using FsCheck; using FsCheck.Fluent; using System; using XplorePlane.Models; namespace XplorePlane.Tests.Generators { /// /// FsCheck 3.x 自定义生成器:为所有状态模型定义 Arbitrary 生成器。 /// public class StateGenerators { private static Gen PositionGen => Gen.Choose(-10000000, 10000000).Select(i => i / 1000.0); private static Gen SpeedGen => Gen.Choose(0, 1000000).Select(i => i / 1000.0); private static Gen VoltageGen => Gen.Choose(0, 450000).Select(i => i / 1000.0); private static Gen PowerGen => Gen.Choose(0, 3000000).Select(i => i / 1000.0); private static Gen FrameRateGen => Gen.Choose(0, 120000).Select(i => i / 1000.0); private static Gen MatrixGen => Gen.Choose(-10000000, 10000000).Select(i => i / 1000.0); public static Arbitrary 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 RaySourceStateArb() { var gen = from isOn in ArbMap.Default.GeneratorFor() from voltage in VoltageGen from power in PowerGen select new RaySourceState(isOn, voltage, power); return gen.ToArbitrary(); } public static Arbitrary DetectorStateArb() { var gen = from isConnected in ArbMap.Default.GeneratorFor() from isAcquiring in ArbMap.Default.GeneratorFor() 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 SystemStateArb() { var gen = from mode in Gen.Elements( OperationMode.Idle, OperationMode.Scanning, OperationMode.CTAcquire, OperationMode.RecipeRun) from hasError in ArbMap.Default.GeneratorFor() from msg in ArbMap.Default.GeneratorFor() let errorMessage = hasError ? msg.Get : string.Empty select new SystemState(mode, hasError, errorMessage); return gen.ToArbitrary(); } public static Arbitrary CameraStateArb() { var gen = from isConnected in ArbMap.Default.GeneratorFor() from isStreaming in ArbMap.Default.GeneratorFor() 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 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 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 LinkedViewStateArb() { var gen = from pos in PhysicalPositionArb().Generator from isExecuting in ArbMap.Default.GeneratorFor() 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(); } } }