我正在为我的本地函数编程小组编写Haskell的介绍。
作为基础,我使用的是Tasty-testing框架,我想测试索引函数(!!)
。
MinimalExample.hs
module MinimalExample where
myIndex :: Int -> [a] -> a
myIndex _ [] = error "index too large"
myIndex 0 (x:_) = x
myIndex n (_:xs) = myIndex (n-1) xs
MinimalTests.hs
module MinimalTests where
import Test.Tasty
import Test.Tasty.SmallCheck as SC
import Test.SmallCheck.Series
import MinimalExample
main :: IO ()
main = defaultMain tests
tests :: TestTree
tests = testGroup "Tests" [scProps]
scProps :: TestTree
scProps = testGroup "(checked by SmallCheck)"
[ SC.testProperty "(!!) == myIndex" $ \lst n ->
lst !! n == myIndex (n::Int) (lst::[Int])
]
由于错误/异常相同,测试应该不在“太大的索引”上失败。
测试应该以负输入失败 - 可以通过在输入中添加NonNegative
作为约束来解决,或者在myIndex
- 函数中添加相应的子句来解决。