File: TestGenerators.hs

package info (click to toggle)
ghc 8.0.1-17
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 55,080 kB
  • ctags: 9,332
  • sloc: haskell: 363,120; ansic: 54,900; sh: 4,782; makefile: 974; perl: 542; asm: 315; python: 306; xml: 154; lisp: 7
file content (75 lines) | stat: -rw-r--r-- 2,591 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
-- | Test generators.
--
module TestGenerators (
        emptyDocGen,
        emptyDocListGen
    ) where

import PrettyTestVersion
import TestStructures

import Control.Monad

import Test.QuickCheck

instance Arbitrary CDoc where
   arbitrary = sized arbDoc
    where
      -- TODO: finetune frequencies
      arbDoc k | k <= 1 = frequency [
               (1,return CEmpty)
             , (2,return (CText . unText) `ap` arbitrary)
             ]
      arbDoc n = frequency [
             (1, return CList `ap` arbitrary `ap`  (liftM unDocList $ resize (pred n) arbitrary))
            ,(1, binaryComb n CBeside)
            ,(1, binaryComb n CAbove)
            ,(1, choose (0,10) >>= \k -> return (CNest k) `ap` (resize (pred n) arbitrary)) 
            ]
      binaryComb n f = 
        split2 (n-1) >>= \(n1,n2) ->
        return f `ap` arbitrary `ap` (resize n1 arbitrary) `ap` (resize n2 arbitrary)
      split2 n = flip liftM ( choose (0,n) ) $ \sz -> (sz, n - sz)

instance CoArbitrary CDoc where
   coarbitrary CEmpty = variant 0
   coarbitrary (CText t) = variant 1 . coarbitrary (length t)
   coarbitrary (CList f list) = variant 2 . coarbitrary f . coarbitrary list
   coarbitrary (CBeside b d1 d2) = variant 3 . coarbitrary b . coarbitrary d1 . coarbitrary d2
   coarbitrary (CAbove b d1 d2) = variant 4 . coarbitrary b . coarbitrary d1 . coarbitrary d2
   coarbitrary (CNest k d) = variant 5 . coarbitrary k . coarbitrary d
   
instance Arbitrary CList where
    arbitrary = oneof $ map return [ CCat, CSep, CFCat, CFSep ]

instance CoArbitrary CList where
    coarbitrary cl = variant (case cl of CCat -> 0; CSep -> 1; CFCat -> 2; CFSep -> 3)

-- we assume that the list itself has no size, so that 
-- sizeof (a $$ b) = sizeof (sep [a,b]) = sizeof(a) + sizeof(b)+1
instance Arbitrary CDocList where
    arbitrary = liftM CDocList $ sized $ \n -> arbDocList n where
        arbDocList 0 = return []
        arbDocList n = do
          listSz <- choose (1,n)
          let elems = take listSz $ repeat (n `div` listSz) -- approximative
          mapM (\sz -> resize sz arbitrary) elems

instance CoArbitrary CDocList where
    coarbitrary (CDocList ds) = coarbitrary ds

instance Arbitrary Text where
    arbitrary = liftM Text $ sized $ \n -> mapM (const arbChar) [1..n]
        where arbChar = oneof (map return ['a'..'c'])

instance CoArbitrary Text where
    coarbitrary (Text str) = coarbitrary (length str)

emptyDocGen :: Gen CDoc
emptyDocGen = return CEmpty

emptyDocListGen :: Gen CDocList
emptyDocListGen = do
    ls <- listOf emptyDocGen
    return $ CDocList ls