Сокращатель 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>

person Ray    schedule 09.02.2019    source источник
comment
Как используется prop_len? Это похоже на генератор логических значений, но название предполагает, что это свойство, которое вы хотели бы протестировать? В любом случае, я предполагаю, что создание нового генератора с использованием вычислительного выражения gen { } делает FsCheck неспособным использовать сокращение arb_chars, потому что он вообще не знает, что arb_chars используется — генератор prop_len может иметь любую реализацию и не не определяет своего собственного термоусадчика   -  person Honza Brestan    schedule 10.02.2019
comment
@Honza Я просто использую Check.One(config, prop_len). Я обновил пример.   -  person Ray    schedule 10.02.2019


Ответы (1)


Используйте Prop.ForAll для определения своего свойства и использования пользовательского генератора/сокращения. Что-то вроде этого (извините, что пишу по памяти, но должно быть близко)

let prop_len = Prop.ForAll (arb_chars) 
    (fun a ->
        let len = a.Length
        printfn "a.Length = %A" len
        return (len <> 5)
    )
person Kurt Schelfthout    schedule 10.02.2019
comment
Это билет! Кстати: это строчные буквы Prop.forAll - person Ray; 10.02.2019