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