1
{-# LANGUAGE StandaloneDeriving #-}
2
{-# LANGUAGE TemplateHaskell #-}
5
import Control.Applicative
6
import qualified Data.Set as Set
7
import qualified Ranges as R
10
import Test.Tasty.QuickCheck
12
import qualified Text.CharRanges as CR
13
import qualified Text.StringPrep as SP
14
import Unsafe.Coerce (unsafeCoerce)
16
instance Arbitrary SP.Range where
17
arbitrary = oneof [ CR.Single <$> arbitrary
19
(x,y) <- (,) <$> arbitrary <*> arbitrary
20
return $ case compare x y of
25
shrink (CR.Single _) = []
26
shrink (CR.Range x y) = [CR.Single x, CR.Single y]
28
newtype KnownRanges = KR {unKR :: [CR.Range]} deriving (Show)
29
newtype RandomRanges = RR {unRR :: [CR.Range]} deriving (Show)
31
instance Arbitrary KnownRanges where
32
arbitrary = KR . concat <$> (listOf1 $ elements spRanges)
33
shrink (KR xs) = KR <$> shrink xs
35
instance Arbitrary RandomRanges where
36
arbitrary = RR <$> listOf1 arbitrary
37
shrink (RR xs) = RR <$> shrink xs
39
toRange :: SP.Range -> R.Range Char
40
toRange (CR.Single x) = R.Single x
41
toRange (CR.Range x y) = R.Range x y
44
spRanges = [SP.c11, SP.c12, SP.c21, SP.c22, SP.c3, SP.c4, SP.c5
45
, SP.c6, SP.c7, SP.c8, SP.c9, SP.a1]
47
eqRange :: SP.Range -> R.Range Char -> Bool
48
eqRange (CR.Range x y) (R.Range x' y') = x == x' && y == y'
49
eqRange (CR.Single x) (R.Single x') = x == x'
52
rangeSetsEqual :: [SP.Range] -> Bool
53
rangeSetsEqual rs = eqRanges (Set.toAscList . unsafeCoerce $ CR.toSet rs)
54
(Set.toAscList . R.toSet . R.ranges $ map toRange rs)
55
where eqRanges [] [] = True
56
eqRanges (x:xs) (y:ys) = eqRange x y && eqRanges xs ys
59
prop_knowRangesToSetEqual :: KnownRanges -> Bool
60
prop_knowRangesToSetEqual (KR rs) = rangeSetsEqual rs
62
prop_randomRangesToSetEqual :: RandomRanges -> Bool
63
prop_randomRangesToSetEqual (RR rs) = rangeSetsEqual rs
65
-- This example came up during testing as a range where the second Single blocked the first one from being merged with the Range in one-pass merging
66
badRange :: [SP.Range]
67
badRange = [CR.Single 'v', CR.Single '\234', CR.Range 'g' '\238']
69
prop_badRangeToSetEqual = rangeSetsEqual badRange
71
main = $(defaultMainGenerator)