6

次の型シグネチャを持つ関数があります

rndListIndex :: Double -> Double -> Double -> Double
rndListIndex maxIdx r1 r2 = …
  • 最初の入力は、負でない厳密に正の整数からの値でなければなりません
  • 2 番目と 3 番目の入力は、閉区間 [0.0,1.0] 内にある必要があります。そうでない場合、関数は意味をなしません。

関数には次のプロパティがあります

prop_alwaysLessThanMaxIdx idx r1 r2 = (rndListIndex idx r1 r2 <= idx)

maxIdxとのランダム データr1r2個別に生成するにはどうすればよいですか。関数chooseは知っていますが、複数の入力変数で使用する方法がわかりません。

今のところ、プロパティを fixed でテストしましたがidx、これはテストすべき方法ではありません。

4

2 に答える 2

13

QuickCheck のforAll関数を使用する必要があります。次のタイプがあります。

forAll :: (Show a, Testable prop) 
       => Gen a           -- ^ The generator to use for generating values
       -> (a -> prop)     -- ^ A function which returns a testable property
       -> Property                  

forAll次の 2 つの引数を取ります。

  • ジェネレーターは、値を生成する方法を記述します。ジェネレーターの例は、choose任意oneofなどです。
  • この関数は、指定された入力のプロパティをテストします。のインスタンスである値を返す必要があります。Testableたとえば、別PropertyBoolや関数です。

choose および elements ジェネレーターを使用したネストされた forAll の例:

-- This generates a Property p for all x's in the closed interval [1,3]
-- The property p in turn generates a property q for all y ∈ [4,5]
-- The property q is True if x < y.
prop_choose = forAll (choose (1,3)) $ \x ->
              forAll (elements [4,5]) $ \y -> x < y

テスト プロパティでは、2 番目と 3 番目の引数に choose を指定して forAll を使用できます。最初の引数には、Positive aタイプ a の任意の正の値を生成するために使用できる QuickCheck のタイプがあります (a が Num の場合、Arbitrary インスタンスがあります)。

prop_alwayLessThanMaxIdx :: Positive Integer -> Property
prop_alwaysLessThanMaxIdx (Positive idx) = 
  forAll (choose (0,1)) $ \r1 ->
  forAll (choose (0,1)) $ \r2 ->
   (rndListIndex idx r1 r2) < idx
于 2013-08-23T18:09:28.163 に答える
1

ラップする独自の型を定義し、0 から 1 の間の数値のみを生成するインスタンスをDouble与えることをお勧めします。Arbitrary

import Test.QuickCheck
newtype UnitInterval = Unit Double deriving Show

instance Arbitrary UnitInterval where
  arbitrary = fmap Unit (choose (0, 1))
  shrink (Unit x) = [ Unit y | y <- shrink x, 0 <= y && y <= 1 ]

を生成idxするには、@bennoffs が提案したように、QuickCheck のPositive修飾子を使用できます (インポートする必要がありますTest.QuickCheck.Modifiers)。これは上で定義したタイプに似ていUnitIntervalますが、0 から 1 の間の数値ではなく正の数値を生成します。プロパティは次のようになります。

prop_alwaysLessThanMaxIdx (Positive idx) (Unit r1) (Unit r2) =
  rndListIndex idx r1 r2 <= idx
于 2013-08-26T20:57:51.933 に答える