3

0 < p1 < p2 < 1を満たす必要がある2つの確率率p1およびp2を使用するプロパティをテストしたいと思います

let arraySizeCheck (p1:float, p2:float, xs:list<int>) =
(p1 < p2 && p1 > 0.0 && p1 < 1.0 && p2 > 0.0 && p2 < 1.0 && Seq.length xs > 0) ==>
(lazy
    (
        let bf1 = BloomFilter(p1, xs)
        let bf2 = BloomFilter(p2, xs)
        bf2.BitArraySize < bf1.BitArraySize
    )
)

Check.Quick arraySizeCheck

上記の例を試しましたが、テスト結果は

0 回のテスト後に引数が使い尽くされました。値 : 単位 = ()

さらに、リスト xs に重複が含まれていないことをお勧めします。このプロパティのテストを書くための助けをいただければ幸いです。ありがとう。

4

1 に答える 1

2

より慣用的なアプローチは、モジュールのgen計算式とコンビネーター関数を使用することです。Gen残念ながら、ランダムな浮動小数点数を生成するジェネレータを返す関数は隠されています (ソース コードを参照してください)。

しかし、独自のものを作成できます。

open System
open FsCheck
open FsCheck.Gen
open FsCheck.Prop

/// Generates a random float [0..1.0]
let rand = Gen.choose (0, Int32.MaxValue) |> Gen.map (fun x -> double x / (double Int32.MaxValue))

/// Generates a random float in the given range (inclusive at both sides)
let randRange a b = rand |> Gen.map (fun x -> a + (b - a) * x)

let arraySizeCheck =
    Prop.forAll
        (Arb.fromGen <| gen {
            // generate p1 and p2 such that 0 <= p1 <= p2 <= 1
            let! p1 = randRange 0.0 1.0
            let! p2 = randRange p1 1.0

            // generate non-empty Seq<int>
            let! xs = Gen.nonEmptyListOf Arb.generate<int> |> Gen.map Seq.ofList

            return BloomFilter(p1, xs), BloomFilter(p2, xs)
        })
        (fun (bf1, bf2) -> bf2.BitArraySize < bf1.BitArraySize)

Check.Quick arraySizeCheck

p1p2here が生成されることに注意してください0 <= p1 <= p2 <= 1。これは、まさに必要なものではありません。randしかし、関数を簡単に変更するだけでそれを修正できると思います。

于 2014-09-09T08:22:29.350 に答える