2013-08-23 11 views
6

मैंहास्केल QuickCheck कई इनपुट चर

rndListIndex :: Double -> Double -> Double -> Double 
rndListIndex maxIdx r1 r2 = … 
  • पहला इनपुट एक मूल्य के एक गैर नकारात्मक सख्ती से सकारात्मक पूर्णांक से आ रही होना चाहिए निम्न प्रकार के हस्ताक्षर के साथ एक समारोह के साथ समारोह के लिए यादृच्छिक डेटा उत्पन्न
  • दूसरे और तीसरे इनपुट बंद अंतराल [0.0,1.0] के भीतर होना भी आवश्यक है अन्यथा समारोह कोई मतलब नहीं है

समारोह

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

कैसे मैं maxIdx और r1, r2 अलग से यादृच्छिक डेटा उत्पन्न करते हैं की संपत्ति है; मैं choose फ़ंक्शन के बारे में जानता हूं लेकिन यह नहीं जानता कि इसे एक से अधिक इनपुट चर के साथ कैसे उपयोग किया जाए।

अभी के लिए मैंने निश्चित idx के साथ संपत्ति का परीक्षण किया है, जिस तरह से इसका परीक्षण किया जाना चाहिए।

+0

पहले मान 0 हो सकता है? – bennofs

+0

अब जब मैं इसके बारे में सोचता हूं तो नहीं करना चाहिए - मैं सवाल संपादित करूंगा। – epsilonhalbe

उत्तर

12

आपको क्विक चेक से 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 दो तर्क लेता है। जेनरेटर के उदाहरण choose, arbitrary, oneof, ...

  • फ़ंक्शन दिए गए इनपुट के लिए संपत्ति का परीक्षण करता है। इसे एक मान वापस करना होगा जो Testable का उदाहरण है, उदाहरण के लिए Property, Bool या कोई फ़ंक्शन। के साथ एक नेस्टेड 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 

अपने परीक्षण संपत्ति के लिए, आप दूसरे और तीसरे तर्क के लिए चुने जाने वाले forall उपयोग कर सकते हैं। पहला तर्क के लिए, वहाँ है QuickCheck में Positive a प्रकार किस प्रकार एक के मनमाने ढंग से सकारात्मक मूल्यों उत्पन्न करने के लिए इस्तेमाल किया जा सकता (यह एक मनमानी उदाहरण है जब एक एक अंक है):

prop_alwayLessThanMaxIdx :: Positive Integer -> Property 
prop_alwaysLessThanMaxIdx (Positive idx) = 
    forAll (choose (0,1)) $ \r1 -> 
    forAll (choose (0,1)) $ \r2 -> 
    (rndListIndex idx r1 r2) < idx 
1

मैं परिभाषित करने का सुझाव देते हैं अपने खुद प्रकार है कि Double लपेटता है और यह एक Arbitrary उदाहरण देना है कि केवल 0 और 1. कुछ तरह के बीच संख्या उत्पन्न करता है:

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, आप, QuickCheck के Positive संशोधक का उपयोग कर सकते हैं के रूप में @bennoffs सुझाव के लिए (आप होगा Test.QuickCheck.Modifiers आयात करने के लिए)। यह UnitInterval प्रकार मैं ऊपर परिभाषित करने के लिए समान है, लेकिन 0 और 1. बीच के अंक आपकी संपत्ति तो कैसा दिखेगा के बजाय सकारात्मक संख्या उत्पन्न करता है:

prop_alwaysLessThanMaxIdx (Positive idx) (Unit r1) (Unit r2) = 
    rndListIndex idx r1 r2 <= idx 
संबंधित मुद्दे