on a819eb7 help sign in
237 lines 6.4 kB history raw
1module Main (main) where
3import Data.Word (Word8, Word16, Word32, Word64)
4import GHC.Int (Int8, Int16, Int32, Int64)
5import Test.QuickCheck
6 ( Gen
7 , Property
8 , choose
9 , forAll
10 )
11import Test.QuickCheck.Monadic (monadicIO)
13import qualified Streamly.Internal.Serialize.FromBytes as Decoder
14import qualified Streamly.Internal.Serialize.ToBytes as Encoder
15import qualified Streamly.Data.Stream as Stream
16import Streamly.Internal.Data.Parser (Parser)
18import Prelude hiding
19 (maximum, minimum, elem, notElem, null, product, sum, head, last, take)
20import Test.Hspec as H
21import Test.Hspec.QuickCheck
22import GHC.Base (unsafeChr)
24word16Max :: Word16
25word16Max = maxBound
27word32Max :: Word32
28word32Max = maxBound
30word64Max :: Word64
31word64Max = maxBound
33chooseWord8 :: (Word8, Word8) -> Gen Word8
34chooseWord8 = choose
36chooseWord16 :: (Word16, Word16) -> Gen Word16
37chooseWord16 = choose
39chooseWord32 :: (Word32, Word32) -> Gen Word32
40chooseWord32 = choose
42chooseWord64 :: (Word64, Word64) -> Gen Word64
43chooseWord64 = choose
45chooseInt8 :: (Int8, Int8) -> Gen Int8
46chooseInt8 = choose
48chooseInt16 :: (Int16, Int16) -> Gen Int16
49chooseInt16 = choose
51chooseInt32 :: (Int32, Int32) -> Gen Int32
52chooseInt32 = choose
54chooseInt64 :: (Int64, Int64) -> Gen Int64
55chooseInt64 = choose
57chooseFloat :: (Float, Float) -> Gen Float
58chooseFloat = choose
60chooseDouble :: (Double, Double) -> Gen Double
61chooseDouble = choose
63chooseChar :: (Char, Char) -> Gen Char
64chooseChar = choose
66action :: (Monad m, Eq a) =>
67 a
68 -> (a -> Stream.Stream m Word8)
69 -> Parser Word8 m a
70 -> m Bool
71action x enc dec = do
72 let str = enc x
73 v1 <- Stream.parse dec str
74 return $
75 case v1 of
76 Right v -> x == v
77 Left _ -> False
79unit :: Property
80unit = monadicIO $
81 do
82 let str = Encoder.unit
83 v1 <- Stream.parse Decoder.unit str
84 return $
85 case v1 of
86 Right v -> v == ()
87 Left _ -> False
89bool :: Property
90bool =
91 forAll (chooseWord8 (0, 1)) $ \case
92 0 -> monadicIO $ action False Encoder.bool Decoder.bool
93 _ -> monadicIO $ action True Encoder.bool Decoder.bool
95ordering :: Property
96ordering =
97 forAll (chooseWord8 (0, 2)) $ \case
98 0 -> monadicIO $ action LT Encoder.ordering Decoder.ordering
99 1 -> monadicIO $ action EQ Encoder.ordering Decoder.ordering
100 _ -> monadicIO $ action GT Encoder.ordering Decoder.ordering
102word8 :: Property
103word8 =
104 forAll (chooseWord8 (0, 255)) $ \x ->
105 monadicIO $ action x Encoder.word8 Decoder.word8
107word16be :: Property
108word16be =
109 forAll (chooseWord16 (0, word16Max)) $ \x ->
110 monadicIO $ action x Encoder.word16be Decoder.word16be
112word32be :: Property
113word32be =
114 forAll (chooseWord32 (0, word32Max)) $ \x ->
115 monadicIO $ action x Encoder.word32be Decoder.word32be
117word64be :: Property
118word64be =
119 forAll (chooseWord64 (0, word64Max)) $ \x ->
120 monadicIO $ action x Encoder.word64be Decoder.word64be
122word16le :: Property
123word16le =
124 forAll (chooseWord16 (0, word16Max)) $ \x ->
125 monadicIO $ action x Encoder.word16le Decoder.word16le
127word32le :: Property
128word32le =
129 forAll (chooseWord32 (0, word32Max)) $ \x ->
130 monadicIO $ action x Encoder.word32le Decoder.word32le
132word64le :: Property
133word64le =
134 forAll (chooseWord64 (0, word64Max)) $ \x ->
135 monadicIO $ action x Encoder.word64le Decoder.word64le
137int8 :: Property
138int8 =
139 forAll (chooseInt8 (-128, 127)) $ \x ->
140 monadicIO $ action x Encoder.int8 Decoder.int8
142int16be :: Property
143int16be =
144 forAll (chooseInt16 (-32768, 32767)) $ \x ->
145 monadicIO $ action x Encoder.int16be Decoder.int16be
147int32be :: Property
148int32be =
149 forAll (chooseInt32 (-2147483648, 2147483647)) $ \x ->
150 monadicIO $ action x Encoder.int32be Decoder.int32be
152int64be :: Property
153int64be =
154 forAll (chooseInt64 (-9223372036854775808, 9223372036854775807)) $ \x ->
155 monadicIO $ action x Encoder.int64be Decoder.int64be
157int16le :: Property
158int16le =
159 forAll (chooseInt16 (-32768, 32767)) $ \x ->
160 monadicIO $ action x Encoder.int16le Decoder.int16le
162int32le :: Property
163int32le =
164 forAll (chooseInt32 (-2147483648, 2147483647)) $ \x ->
165 monadicIO $ action x Encoder.int32le Decoder.int32le
167int64le :: Property
168int64le =
169 forAll (chooseInt64 (-9223372036854775808, 9223372036854775807)) $ \x ->
170 monadicIO $ action x Encoder.int64le Decoder.int64le
172float32be :: Property
173float32be =
174 forAll (chooseFloat (-3.40282e+38, 3.40282e+38)) $ \x ->
175 monadicIO $ action x Encoder.float32be Decoder.float32be
177float32le :: Property
178float32le =
179 forAll (chooseFloat (-3.40282e+38, 3.40282e+38)) $ \x ->
180 monadicIO $ action x Encoder.float32le Decoder.float32le
182double64be :: Property
183double64be =
184 forAll (chooseDouble (-1.79769e+308, 1.79769e+308)) $ \x ->
185 monadicIO $ action x Encoder.double64be Decoder.double64be
187double64le :: Property
188double64le =
189 forAll (chooseDouble (-1.79769e+308, 1.79769e+308)) $ \x ->
190 monadicIO $ action x Encoder.double64le Decoder.double64le
192charLatin1 :: Property
193charLatin1 = forAll (chooseChar (unsafeChr 0, unsafeChr 255)) $ \x ->
194 monadicIO $ action x Encoder.charLatin1 Decoder.charLatin1
196moduleName :: String
197moduleName = "Serialize.Serializable"
199main :: IO ()
200main =
201 hspec $ do
202 describe moduleName $ do
203 -- Unit
204 prop "unit" Main.unit
206 -- Bool
207 prop "bool" Main.bool
209 -- Ordering
210 prop "ordering" Main.ordering
212 -- Words
213 prop "word8" Main.word8
214 prop "word16be" Main.word16be
215 prop "word32be" Main.word32be
216 prop "word64be" Main.word64be
217 prop "word16le" Main.word16le
218 prop "word32le" Main.word32le
219 prop "word64le" Main.word64le
221 -- Integral
222 prop "int8" Main.int8
223 prop "int16be" Main.int16be
224 prop "int32be" Main.int32be
225 prop "int64be" Main.int64be
226 prop "int16le" Main.int16le
227 prop "int32le" Main.int32le
228 prop "int64le" Main.int64le
230 -- Fractional
231 prop "float32be" Main.float32be
232 prop "float32le" Main.float32le
233 prop "double64be" Main.double64be
234 prop "double64le" Main.double64le
236 -- Char
237 prop "charLatin1" Main.charLatin1