可以使用下面的Tasty-SmallCheck相关代码测试以下数据结构。有一个必须与构造函数ShB保持的关系:第二个和第三个正整数应该最多与第一个一样大。
data Shape = ShA Int Int Bool
| ShB Int Int Int Bool Bool
deriving (Show,Read,Eq)
构造函数ShA应该具有正的Int,但是否则参数之间没有关系。
auxShA :: (Positive Int, Positive Int, Bool) -> Shape
auxShA (i,j,b) = ShA (fromIntegral i) (fromIntegral j) b
auxShB :: (Positive Int, Positive Int, Positive Int) -> Bool -> Bool -> Shape
auxShB (a1,a2,a3) = ShB i u d
where
(i,u,d) = auxTriplet (a1,a2,a3)
auxTriplet :: (Positive Int, Positive Int, Positive Int) -> (Int,Int,Int)
auxTriplet (a,b,c)
| a >= b && a >= c = (fromIntegral a, fromIntegral b, fromIntegral c)
| b >= a && b >= c = (fromIntegral b, fromIntegral a, fromIntegral c)
| otherwise = (fromIntegral c, fromIntegral a, fromIntegral b)
consB :: (Serial m a1, Serial m a2, Serial m a3, Serial m b, Serial m c) =>
((a1,a2,a3) -> b -> c -> e) -> Series m e
consB f = decDepth $
f <$> series
<~> series
<~> series
instance Monad m => Serial m Shape where
series = cons1 auxShA \/ consB auxShB
生成的案例没有问题,但有重复项可以看到,例如与
list 4 series :: [Shape]
问题是,如何在以下情况下使用SmallCheck(美味)生成测试用例?
或者,如何生成动态可依赖于先前生成的值的测试用例?
首先想到的是将构造函数写入Shape以检查输入是否有效(例如上面的要点),但是重复测试用例生成的问题将保留在该方法中。
以上代码使用与中的类似解决方案 SmallCheck invariant -answer。