16

関数の単体テストを書きたいとし(!!)ます。

my_prop xs n = ...

n を有効なインデックスのみに制限したいのですが、次のようなことができることはわかっています

my_prop xs n = (not.null) (drop n xs) ==> ...

しかし、これにより、生成されたケースの大部分が無効になり、破棄されます。xsQuickCheck が最初にリストを生成し、その値を使用して有効なケースのみを生成するように設定する方法はありnますか?

4

3 に答える 3

18

を使用すると、以前の引数に依存するジェネレータforAll指定できます。n

my_prop (NonEmpty xs) = forAll (choose (0, length xs - 1)) $ \n -> ...
于 2012-10-10T20:46:55.390 に答える
10

有効なインデックスのみを作成するジェネレーターを作成し、次のようにプロパティを書き込むことができます

import Test.QuickCheck
import Test.QuickCheck.Gen
import System.Random

indices :: [a] -> Gen Int
indices xs = MkGen $ \sg _ -> fst $ randomR (0, length xs - 1) sg

my_prop :: [Char] -> Property
my_prop xs = not (null xs) ==> forAll (indices xs) (\i -> xs !! i /= '0')

引数を削除しIntます。

于 2012-10-10T20:46:35.260 に答える