如何强制使用 fscheck 生成的任何十进制值(无论是否属于某种类型)都在一定范围内?

How to force any decimal value (be it part of a type or not) generated with fscheck to be within a certain range?

我正在使用 fscheck 编写一些联合测试,我想缩小自动生成的小数范围,而不管我传递的参数是什么。我的意思是说我有以下类型:

无需为每个单一类型定义任意值,只是在这一代中如果有一个小数,它必须说在 0300,000.

module Tests

open Xunit
open FsCheck.Xunit
open Swensen.Unquote


let addDecimals a b: decimal =
   a + b

[<Property>]
let ``test adding two decimals`` a b =
    let actual = addDecimals a b
    let expected = a + b
    test<@ actual = expected @>

type DecimalHolder =
    { Value: decimal }

let addDecimalHolders a b =
    { Value = a.Value + b.Value }

[<Property>]
let ``test adding two decimal holders`` a b =
    let actual = addDecimalHolders a b
    let expected = { Value = a.Value + b.Value }
    test<@ actual = expected @>

type DecimalStuff =
    | Value of decimal
    | Holder of DecimalHolder
    | Holders of DecimalHolder list
    // Whatever

etc.

我怎样才能做到这一点?

好的,实际上 Arbitrary 定义递归地跨参数类型工作就足够了:

module Tests

open Xunit
open FsCheck.Xunit
open Swensen.Unquote

type NotBigPositiveDecimalArbitrary =

    static member NotBigPositiveDecimal() =
        Gen.choose (1, 500)
        |> Gen.map (fun x -> decimal x)
        |> Arb.fromGen

let addDecimals a b: decimal =
   a + b

[<Property(Arbitrary = [| typeof<NotBigPositiveDecimalArbitrary> |])>]
let ``test adding two decimals`` a b =
    let actual = addDecimals a b
    let expected = a + b
    test<@ actual = expected @>

type DecimalHolder =
    { Value: decimal }

let addDecimalHolders a b =
    { Value = a.Value + b.Value }

[<Property(Arbitrary = [| typeof<NotBigPositiveDecimalArbitrary> |])>]
let ``test adding two decimal holders`` a b =
    let actual = addDecimalHolders a b
    let expected = { Value = a.Value + b.Value }
    test<@ actual = expected @>