문제

QuickCheck/를 사용하는 Haskell 프로그램에 CLI 인수로 정수를 전달하고 싶습니다. monadicIO.해당 정수는 내부에서 사용됩니다. assert 테스트를 사용자 정의할 수 있도록 합니다.문제는 일단 정수 값을 구문 분석하면 main, 내부로 전달하는 방법을 모르겠습니다. monadicIO 못생긴 것을 사용하지 않고 전화하십시오. IORef.나는 우아한 해결책이 Reader 모나드를 실행했지만 작동하도록 하는 솔루션을 찾을 수 없었습니다. quickCheck 주장이 엄격하다.어떤 아이디어가 있나요?

나중에 편집 1: 요청에 따라 시도했지만 실패한 실제 코드를 첨부합니다.주석 처리된 줄은 실패한 시도를 나타냅니다.배경:테스트 스위트는 QuickCheck에 의해 생성된 무작위 입력의 SHA512를 계산하는 매우 간단한 원격 엔드포인트를 실행하기 위한 것입니다.원격 끝점은 Python/Flask 기반입니다.

@user2407038에 대한 응답으로 나중에 편집 2: 나는 만들 수 있었다 propHasExpectedLengthCeiling Int 유형의 추가 인수를 취하지만 quickCheck 이에 대해 임의의 값을 생성할 수 있지만 이는 내가 원하는 일이 아닙니다.내 목표는 maxSegmentLengthCeiling 명령줄 인수에서 가져와서 사용할 것입니다. let testPassed = actualMaxSegmentLength <= maxSegmentLengthCeiling 내부 monadicIO 차단하다.지금 바로 maxSegmentLengthCeiling 최상위 값으로 지정됩니다. 즉, 값을 변경할 때마다 코드를 다시 컴파일해야 합니다.아직 관련 코드가 없습니다. IORef 왜냐하면 그것은 최후의 수단이고 내 질문의 핵심은 그런 일을 피하는 방법이기 때문입니다. IORef 노선.

import qualified Data.ByteString.Lazy.Char8 as LC

import Control.Applicative     ( (<$>) )
import Data.Function           ( on )
import Data.List               ( groupBy )
import Data.Char               ( isDigit )
--import Safe                    ( headMay
--                               , readMay
--                               )
--import System.Environment      ( getArgs )
import Network.HTTP.Conduit    ( simpleHttp )
import Test.QuickCheck         ( Arbitrary
                               , Property
                               , arbitrary
                               , choose
                               , frequency
                               , quickCheckWith
                               , stdArgs
                               , vectorOf
                               )
import Test.QuickCheck.Test    ( Args
                               , maxSuccess
                               )
import Test.QuickCheck.Monadic ( assert
                               , monadicIO
                               , run
                               )

newtype CustomInput = MkCustomInput String deriving Show

instance Arbitrary CustomInput where
  arbitrary =
    let
      genCustomInput = vectorOf 20
                       $ frequency [ (26, choose ('0','9'))
                                   , (10, choose ('a','z'))
                                   ]
    in
      MkCustomInput <$> genCustomInput

maxSegmentLengthCeiling :: Int
maxSegmentLengthCeiling = 22

urlPrefix :: String
urlPrefix = "http://192.168.2.3:5000/sha512sum/"

propHasExpectedLengthCeiling :: CustomInput -> Property
propHasExpectedLengthCeiling (MkCustomInput input) = monadicIO $ do
  testPassed <- run $ do
    response <- simpleHttp $ urlPrefix ++ input
    let stringResponse = LC.unpack response
    let brokenDownStringResponse = groupBy ( (==) `on` isDigit ) stringResponse
    let actualMaxSegmentLength = maximum $ map length brokenDownStringResponse
    let testPassed = actualMaxSegmentLength <= maxSegmentLengthCeiling
    putStrLn ""
    putStrLn ""
    putStrLn $ "Input:       " ++ input
    putStrLn $ "Control sum: " ++ stringResponse
    putStrLn $ "Breakdown:   " ++ show brokenDownStringResponse
    putStrLn $ "Max. length: " ++ show actualMaxSegmentLength
    putStrLn $ "Ceiling:     " ++ show maxSegmentLengthCeiling
    putStrLn $ "Test result: " ++ if testPassed then "Pass" else "Fail"
    putStrLn ""
    putStrLn ""
    return testPassed
  assert $ testPassed

customArgs :: Args
customArgs = stdArgs { maxSuccess = 1000000 }

--readMayAsInt :: String -> Maybe Int
--readMayAsInt = readMay

main :: IO ()
main =
--main = do
--  cliArgs <- getArgs
--  let ceilingInputMay = headMay cliArgs >>= readMayAsInt
--  maxSegmentLengthCeiling <- case ceilingInputMay of
--                               (Just lengthCeiling) -> return lengthCeiling
--                               Nothing              -> error "No valid number given"
  quickCheckWith
    customArgs
    propHasExpectedLengthCeiling
도움이 되었습니까?

해결책

만들다 maxSegmentLengthCeiling 매개변수 propHasExpectedLengthCeiling :

propHasExpectedLengthCeiling :: Int -> CustomInput -> Property

그리고 그것을 다음과 같이 호출하십시오.

main = do 
  [n] <- getArgs
  quickCheckWith customArgs (propHasExpectedLengthCeiling (read n))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top