import Test.QuickCheck import Control.Monad(sequence, join, liftM, liftM2) import System.Random(Random) import Data.Array.IArray import Data.RangeMin(rangeMin') import Data.Ord(comparing) import Data.List(minimumBy) import Debug.Trace import System.Environment subRangeGen :: (Ix i, Random i) => (i, i) -> Gen (i, i) subRangeGen = liftM (\(i, j) -> if i > j then (j, i) else (i, j)) . join (liftM2 (,)) . choose vector' n g = sequence (replicate n g) validRangeMin :: Int -> Int -> Property validRangeMin n m = forAll ((vector n :: Gen [Int])) (\arr -> let rangeMinA = rangeMin' (0, n-1) arr; arra = (listArray (0, n-1) arr) :: Array Int Int in (forAll (vector' m (subRangeGen (0, n-1))) (all (\r -> snd (rangeMinA r) == minimum [arra!i|i<-range r])))) --validRangeMin' = forAll (liftM (asPureArray . listToArray) (vector 1000 :: Gen [Int])) (\arr -> forAll (vector' 500 (subRangeGen arr)) (all (\r -> rangeMin'' arr r == rangeMin'' arr r))) main :: IO () main = do argums <- getArgs let [n, m] = map read argums quickCheck (validRangeMin n m) -- let [n, m] = [300, 100] in quickCheck (validRangeMin n m)