~ubuntu-branches/ubuntu/wily/haskell-stringprep/wily

« back to all changes in this revision

Viewing changes to tests/Tests.hs

  • Committer: Package Import Robot
  • Author(s): Colin Watson
  • Date: 2015-06-04 10:33:11 UTC
  • mfrom: (3.1.3 wily-proposed)
  • Revision ID: package-import@ubuntu.com-20150604103311-g18t1sqyfx1dhxbj
Tags: 1.0.0-2build2
Rebuild for new GHC ABIs.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
{-# LANGUAGE StandaloneDeriving #-}
 
2
{-# LANGUAGE TemplateHaskell #-}
 
3
module Main where
 
4
 
 
5
import           Control.Applicative
 
6
import qualified Data.Set as Set
 
7
import qualified Ranges as R
 
8
import           Test.QuickCheck
 
9
import           Test.Tasty
 
10
import           Test.Tasty.QuickCheck
 
11
import           Test.Tasty.TH
 
12
import qualified Text.CharRanges as CR
 
13
import qualified Text.StringPrep as SP
 
14
import           Unsafe.Coerce (unsafeCoerce)
 
15
 
 
16
instance Arbitrary SP.Range where
 
17
    arbitrary = oneof [ CR.Single <$> arbitrary
 
18
                      , do
 
19
                          (x,y) <- (,) <$> arbitrary <*> arbitrary
 
20
                          return $ case compare x y of
 
21
                              LT -> CR.Range x y
 
22
                              EQ -> CR.Single x
 
23
                              GT -> CR.Range y x
 
24
                      ]
 
25
    shrink (CR.Single _) = []
 
26
    shrink (CR.Range x y) = [CR.Single x, CR.Single y]
 
27
 
 
28
newtype KnownRanges = KR  {unKR :: [CR.Range]} deriving (Show)
 
29
newtype RandomRanges = RR {unRR :: [CR.Range]} deriving (Show)
 
30
 
 
31
instance Arbitrary KnownRanges where
 
32
    arbitrary = KR . concat <$> (listOf1 $ elements spRanges)
 
33
    shrink (KR xs) = KR <$> shrink xs
 
34
 
 
35
instance Arbitrary RandomRanges where
 
36
    arbitrary = RR <$> listOf1 arbitrary
 
37
    shrink (RR xs) = RR <$> shrink xs
 
38
 
 
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
 
42
 
 
43
 
 
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]
 
46
 
 
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'
 
50
eqRange _ _ = False
 
51
 
 
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
 
57
        eqRanges _ _ = False
 
58
 
 
59
prop_knowRangesToSetEqual :: KnownRanges -> Bool
 
60
prop_knowRangesToSetEqual (KR rs) = rangeSetsEqual rs
 
61
 
 
62
prop_randomRangesToSetEqual :: RandomRanges -> Bool
 
63
prop_randomRangesToSetEqual (RR rs) = rangeSetsEqual rs
 
64
 
 
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']
 
68
 
 
69
prop_badRangeToSetEqual = rangeSetsEqual badRange
 
70
 
 
71
main = $(defaultMainGenerator)