2

私は現在、クローズド ソースのサード パーティ コマンド ライン アプリケーションを置き換える Haskell ライブラリを作成しています。このサード パーティの CLI には、私が複製した仕様がありますが、実際のバイナリでは、仕様よりもはるかに寛容な入力が許可されます。

QuickCheckを使用して入力を生成し、ライブラリ内の関数の結果をサードパーティの CLI アプリの標準出力と比較できるようにしたいと考えています。私が立ち往生している部分は、プロパティ テスト内で IO を導入する方法です。

これまでのコードは次のとおりです。

{-# LANGUAGE OverloadedStrings #-}

import qualified Data.Text as T
import Test.Hspec
import Test.Hspec.QuickCheck
import Test.QuickCheck

-- This function lives in my library, this is just a sample
-- the actual function does things but is still pure, and has the type Text -> Int
exampleCountFuncInModule :: T.Text -> Int
exampleCountFuncInModule t = T.length t

-- contrived example generator
genSmallString :: Gen T.Text
genSmallString = do 
    smallList <- T.pack <$> resize 2 (listOf1 arbitraryASCIIChar)
    pure ("^" `T.append` smallList)

main :: IO ()
main = do
    hspec $ do
        prop "some property" $ do
            verbose $ forAll genSmallString $ \xs -> (not . T.null) xs ==> do
                let myCount = exampleCountFuncInModule xs
                -- Want to run external program here, and read the result as an Int
                let otherProgramCount = 2
                myCount == otherProgramCount

QuickCheck には が含まれていることがわかりましたioProperty。それは私が望むもののように思えますが、それを私が既に持っているものに合わせる方法がわかりません。

4

1 に答える 1