forked from commercialhaskell/stack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStoreSpec.hs
More file actions
90 lines (76 loc) · 2.97 KB
/
StoreSpec.hs
File metadata and controls
90 lines (76 loc) · 2.97 KB
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-orphans -Wwarn #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE OverloadedStrings #-}
module Stack.StoreSpec where
import qualified Data.ByteString as BS
import Data.Containers (mapFromList, setFromList)
import Data.Sequences (fromList)
import Data.Store.Internal (StaticSize (..))
import Data.Store.TH
import qualified Data.Vector.Unboxed as UV
import GHC.TypeLits (KnownNat)
import Language.Haskell.TH
import Language.Haskell.TH.ReifyMany
import Stack.Prelude
import Stack.Types.Build
import Stack.Types.PackageDump
import Test.Hspec
import Test.SmallCheck.Series
-- NOTE: these were copied from Data.Store. Should probably be moved to
-- smallcheck.
instance (Monad m, Serial m k, Serial m a, Ord k) => Serial m (Map k a) where
series = fmap mapFromList series
instance (Monad m, Serial m k, Serial m a, Eq k, Hashable k) => Serial m (HashMap k a) where
series = fmap mapFromList series
instance Monad m => Serial m Text where
series = fmap fromList series
instance (Monad m, Serial m a, UV.Unbox a) => Serial m (UV.Vector a) where
series = fmap fromList series
instance Monad m => Serial m BS.ByteString where
series = fmap BS.pack series
instance (Monad m, Serial m a, Ord a) => Serial m (Set a) where
series = fmap setFromList series
instance (Monad m, KnownNat n) => Serial m (StaticSize n BS.ByteString)
addMinAndMaxBounds :: forall a. (Bounded a, Eq a) => [a] -> [a]
addMinAndMaxBounds xs =
(if (minBound :: a) `notElem` xs then [minBound] else []) ++
(if (maxBound :: a) `notElem` xs && (maxBound :: a) /= minBound then maxBound : xs else xs)
$(do let ns = [ ''Int64, ''Word64, ''Word8
]
f n = [d| instance Monad m => Serial m $(conT n) where
series = generate (\_ -> addMinAndMaxBounds [0, 1]) |]
concat <$> mapM f ns)
$(do let tys = [ ''InstalledCacheInner
-- FIXME , ''PackageCache
-- FIXME , ''LoadedSnapshot
, ''BuildCache
, ''ConfigCache
]
ns <- reifyManyWithoutInstances ''Serial tys (`notElem` [''UV.Vector])
let f n = [d| instance Monad m => Serial m $(conT n) |]
concat <$> mapM f ns)
verbose :: Bool
verbose = False
spec :: Spec
spec = do
describe "Roundtrips binary formats" $ do
$(smallcheckManyStore False 6
[ [t| InstalledCacheInner |]
, [t| BuildCache |]
])
-- Blows up with > 5
{-
$(smallcheckManyStore False 5
[ -- FIXME [t| PackageCache |]
-- FIXME , [t| LoadedSnapshot |]
])
-}
-- Blows up with > 4
$(smallcheckManyStore False 4
[ [t| ConfigCache |]
])