私は現在、クローズド ソースのサード パーティ コマンド ライン アプリケーションを置き換える 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
。それは私が望むもののように思えますが、それを私が既に持っているものに合わせる方法がわかりません。