SmallCheck系列生成和重复(参数有关系)

时间:2016-09-21 05:35:05

标签: haskell smallcheck

可以使用下面的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(美味)生成测试用例?

  • 有必须保留的属性,例如第一个参数必须为Positive
  • 如果第一个参数应该大于10 :: Int?
  • ,该怎么办?
  • 继续,如果第二个参数应该在第一个 - 第一个和第一个之间,第三个应该在第二个 - 第五个和第二个之间怎么办?

或者,如何生成动态可依赖于先前生成的值的测试用例?

首先想到的是将构造函数写入Shape以检查输入是否有效(例如上面的要点),但是重复测试用例生成的问题将保留在该方法中。

以上代码使用与中的类似解决方案 SmallCheck invariant -answer。

0 个答案:

没有答案