{-# LANGUAGE NoMonomorphismRestriction #-} {-# LANGUAGE PackageImports #-} {-# LANGUAGE TemplateHaskell #-} -- | QuickCheck properties for a number of ADPfusion combinators. Each test is -- once written using ADPfusion and once using list comprehensions. Typing -- @allProps@ in ghci will run all tests, prefixed @prop_@ with a thousand -- tests each. module ADP.Fusion.QuickCheck where import Data.List import Data.Vector.Fusion.Stream.Size import Data.Vector.Fusion.Util import qualified Data.Vector.Fusion.Stream as S import qualified Data.Vector.Unboxed as VU import Test.QuickCheck import Test.QuickCheck.All import "PrimitiveArray" Data.Array.Repa.Index import ADP.Fusion.QuickCheck.Arbitrary import qualified ADP.Fusion as F import qualified ADP.Fusion.Monadic as M import qualified ADP.Fusion.Monadic.Internal as F options = stdArgs {maxSuccess = 1000} customCheck = quickCheckWithResult options allProps = $forAllProperties customCheck -- * Some definitions: -- -- @O@ means one -- @M@ means many -- @P@ means one or more -- @ML_x_y@ is for a makeLeftCombinator with boundaries x and y -- ** @xs -~+ ys@, size @xs@ = 1, size @ys@ >= 1. fOP (i,j) = S.toList $ (,) F.<<< fRegion F.-~+ fRegion F.... id $ Z:.i:.j lOP (i,j) = [ ((i,i+1), (i+1,j)) | i+1<=j-1 ] prop_OP = fOP === lOP -- ** @xs -~~ ys -~~ zs@, size @xs@ = 1, size @ys@ = 1, size @zs@ >= 0. fOOP (i,j) = S.toList $ (,,) F.<<< fRegion F.-~~ fRegion F.-~~ fRegion F.... id $ Z:.i:.j lOOP (i,j) = [ ( (i,i+1), (i+1,i+2), (i+2,j) ) | i+2<=j ] prop_OOP = fOOP === lOOP -- ** @xs +~- ys@, size @xs@ >= 1, size @ys@ = 1. fPO (i,j) = S.toList $ (,) F.<<< fRegion F.+~- fRegion F.... id $ Z:.i:.j lPO (i,j) = [ ( (i,j-1), (j-1,j) ) | i+1<=j-1 ] prop_PO (Small i, Small j) = fPO (i,j) == lPO (i,j) -- ** @xs -~+ ys +~- zs@, size @xs@ = 1, size @ys@ >= 1, size @zs@ = 1. This is -- a "hairpin" in RNA bioinformatics. fOPO (i,j) = S.toList $ (,,) F.<<< fRegion F.-~+ fRegion F.+~- fRegion F.... id $ Z:.i:.j lOPO (i,j) = [ ( (i,i+1), (i+1,j-1), (j-1,j) ) | i+2<=j, i+1