2012-10-10 8 views
16

कहें कि मैं (!!) फ़ंक्शन के लिए कुछ यूनिट परीक्षण लिखना चाहता हूं।पैरामीटर के लिए केवल वैध सूची इंडेक्स जेनरेट करने के लिए क्विक चेक को कैसे बताना है?

my_prop xs n = ... 

मैं ही मान्य अनुक्रमित करने के लिए n प्रतिबंधित करना चाहते हैं और मैं जानता हूँ कि मैं

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

की तरह कुछ कर सकता है लेकिन यह यह बनाता है ताकि उत्पन्न अधिकांश मामलों अमान्य हैं और फेंक दिया हो । क्या कोई तरीका है कि मैं चीजों को सेट अप कर सकता हूं ताकि क्विक चेक पहले xs सूची उत्पन्न कर सके और n के केवल वैध मामलों को उत्पन्न करने के लिए इसका मूल्य उपयोग कर सके?

+1

एक नया प्रकार बनाएं जिसमें एक सूची है और एक 'Int' उचित' मनमानी 'उदाहरण के साथ है। –

उत्तर

17

forAll का उपयोग करके, आप generator को n के लिए निर्दिष्ट कर सकते हैं जो पहले के तर्कों पर निर्भर करता है, उदा।

my_prop (NonEmpty xs) = forAll (choose (0, length xs - 1)) $ \n -> ... 
+0

साफ। अगर मुझे प्रॉपर्टी में दो इंडेक्स की ज़रूरत है, तो मैं सभी के लिए जनरल (इंट, इंट) कैसे पास कर सकता हूं? मेरा वर्तमान समाधान घोंसले के लिए है: 'सभी के लिए (इंडेक्स xs) $ \ x -> के लिए सभी (इंडेक्स xs) $ \ y -> ...' (डैनियल फिशर की इंडेक्स परिभाषा का उपयोग किसी अन्य उत्तर में देखा जाता है)। – Arild

10

आप एक जनरेटर है कि वैध सूचकांक बनाता है बनाने के लिए और Int तर्क को नष्ट करने की तरह

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') 

अपनी संपत्ति लिख सकते हैं।

5

डैनियल वैगनर ने सुझाव दिया के रूप में, एक संभावना अपने ही डेटाप्रकार बनाने और यह एक Arbitrary उदाहरण दे रहा है।

data ListAndIndex a = ListAndIndex [a] Int deriving (Show) 

instance Arbitrary a => Arbitrary (ListAndIndex a) where 
    arbitrary = do 
    (NonEmpty xs) <- arbitrary 
    n <- elements [0..(length xs - 1)] 
    return $ ListAndIndex xs n 

NonEmpty गैर खाली सूचियों पैदा करने के लिए Test.QuickCheck.Modifiers में एक कस्टम प्रकार से है।

संबंधित मुद्दे