FSCheck收缩器未调用

时间:2019-02-09 22:20:07

标签: f# shrink fscheck

我似乎无法使FSCheck收缩器正常工作。说我有这个

    let arb_chars =
        Arb.fromGenShrink(
            Arb.generate<char[]>,
            fun cs -> seq {
                printfn "shrinking..."
                for i in 0..(cs.Length) do
                    printfn "  shrink %d" i
                    yield [| cs.[0] |]
            })

    let prop_len() = gen {
        //let! a = Arb.generate<char[]> // this doesn't work either...
        let! a = arb_chars.Generator
        let len = a.Length
        printfn "a.Length = %A" len
        return (len <> 5)
    }
    :
    Check.One(config, prop_len)

运行它时,我总是得到0的收缩。这是一个典型的运行:

a.Length = 0
a.Length = 4
a.Length = 1
a.Length = 0
a.Length = 4
a.Length = 7
a.Length = 6
a.Length = 7
a.Length = 19
a.Length = 18
a.Length = 5
Falsifiable, after 11 tests (0 shrinks) (StdGen (19971972,296557937)):
Original:
<null>

1 个答案:

答案 0 :(得分:3)

使用Prop.ForAll定义属性并使用自定义生成器/收缩器。这样的事情(抱歉,是从内存中键入内容,但应该靠近)

let prop_len = Prop.ForAll (arb_chars) 
    (fun a ->
        let len = a.Length
        printfn "a.Length = %A" len
        return (len <> 5)
    )