1-- File created: 2008-10-10 16:28:53 2 3module Tests.Utils (tests) where 4 5import Data.Maybe 6import Data.List (isSuffixOf) 7import Test.Framework 8import Test.Framework.Providers.QuickCheck2 9import Test.QuickCheck 10 11import System.FilePath.Glob.Utils 12 13import Tests.Base (Path, (-->), unP) 14 15tests :: Test 16tests = testGroup "Utils" 17 [ testProperty "overlapperLosesNoInfo" prop_overlapperLosesNoInfo 18 , testProperty "increasingSeq" prop_increasingSeq 19 , testProperty "addToRange" prop_addToRange 20 , testProperty "pathParts" prop_pathParts 21 ] 22 23validateRange :: Ord a => (a, a) -> (a, a) 24validateRange (a,b) = if b > a then (a,b) else (b,a) 25 26prop_overlapperLosesNoInfo :: (Int, Int) -> (Int, Int) -> Int -> Bool 27prop_overlapperLosesNoInfo x1 x2 c = 28 let r1 = validateRange x1 29 r2 = validateRange x2 30 in case overlap r1 r2 of 31 32 -- if the ranges don't overlap, nothing should be in both ranges 33 Nothing -> not (inRange r1 c && inRange r2 c) 34 35 -- if they do and something is in a range, it should be in the 36 -- overlapped one as well 37 Just o -> (inRange r1 c --> inRange o c) && 38 (inRange r2 c --> inRange o c) 39 40prop_increasingSeq :: Int -> [Int] -> Bool 41prop_increasingSeq a xs = 42 let s = fst . increasingSeq $ a:xs 43 in s == reverse [a .. head s] 44 45prop_addToRange :: (Int, Int) -> Int -> Property 46prop_addToRange x c = 47 let r = validateRange x 48 r' = addToRange r c 49 in isJust r' ==> inRange (fromJust r') c 50 51prop_pathParts :: Path -> Bool 52prop_pathParts pstr = 53 let p = unP pstr 54 in all (`isSuffixOf` p) (pathParts p) 55