FsCheck 生成器能否创建一个不断增加的序列

Can an FsCheck generator create an ever-increasing sequence

我正在使用 FsCheck 制作一个生成器来创建假的数据库记录。根据所讨论的字段,它使用 chooseFromList,或用于整数、浮点数等的生成器。

但是,一个比较麻烦的字段是必须顺序的主键字段。 IE。将 1 放入生成的第一条记录中,将 2 放入生成的第二条记录中,依此类推。生成一组记录后,我将使用它们在我的测试软件中模拟数据库 table。

我的 FORTRAN 大脑想出的每一个解决方案似乎都是邪恶的、不纯的和程序性的。但我相信这是一个比我更聪明的 FsCheck 用户所遇到的问题。这可能是仿函数或单子的用例吗...

我们可以使用函数 ident 来生成序列号,该函数使内部计数器递增:

type Shirt = { Collar : float; Sleeve : float; id: int }

let collars = [ 14.0; 14.5; 15.0; 15.5; 16.0; 16.5; 17.0; 17.5; 18.0; ]
let sleeves = [ 30.5; 31.5; 32.5; 33.5; 34.5; 35.5; 36.5; 37.5; 38.5]

let ident = 
    let n = ref 0
    fun () -> n := !n + 1; !n

let shirtGen =  gen {
    let! collar = Gen.elements collars
    let! sleeve = Gen.elements sleeves
    return { Collar = collar ; Sleeve = sleeve; id = ident() }
}

shirtGen
|> Gen.sample 0 10
|> List.rev
|> Seq.iter (printfn "%A")

我正在反转 Gen.sample 生成的列表,因为它生成了一个反转列表。这是生成的样本:

{Collar = 14.5; Sleeve = 35.5; id = 1;}
{Collar = 15.0; Sleeve = 31.5; id = 2;}
{Collar = 16.5; Sleeve = 32.5; id = 3;}
{Collar = 17.5; Sleeve = 35.5; id = 4;}
{Collar = 16.5; Sleeve = 37.5; id = 5;}
{Collar = 14.0; Sleeve = 35.5; id = 6;}
{Collar = 18.0; Sleeve = 30.5; id = 7;}
{Collar = 16.0; Sleeve = 38.5; id = 8;}
{Collar = 17.0; Sleeve = 34.5; id = 9;}
{Collar = 14.5; Sleeve = 36.5; id = 10;}