on master help sign in
Add test cases for Streamly.Internal.Serialize module
commit5c9430a0ae34b09bddb47d6416c6898c956ded2a authorRanjeet Kumar Ranjan <ranjeetr@composewell.com> dateWed 21 Dec 2022, 15:06 (4 years ago) parent3736914
4 files changed+245
hie.yaml+2 streamly.cabal+1 test/Streamly/Test/Serialize/Serializable.hs+237 test/streamly-tests.cabal+5
hie.yaml+2
@@ -160,6 +160,8 @@ cradle:
160160 component: "test:Prelude.ZipSerial"
161161 - path: "./test/Streamly/Test/Unicode/Stream.hs"
162162 component: "test:Unicode.Stream"
163+ - path: "./test/Streamly/Test/Serialize/Serializable.hs"
164+ component: "test:Serialize.Serializable"
163165 - path: "./test/lib/"
164166 component: "lib:streamly-tests"
165167 - path: "./test/version-bounds.hs"
streamly.cabal+1
@@ -121,6 +121,7 @@ extra-source-files:
121121 test/Streamly/Test/Prelude.hs
122122 test/Streamly/Test/Prelude/*.hs
123123 test/Streamly/Test/Unicode/*.hs
124+ test/Streamly/Test/Serialize/*.hs
124125 test/Streamly/Test/Data/Fold/*.hs
125126 test/lib/Streamly/Test/Common.hs
126127 test/lib/Streamly/Test/Prelude/Common.hs
test/Streamly/Test/Serialize/Serializable.hsnew file+237
@@ -0,0 +1,237 @@
1+module Main (main) where
2+
3+import Data.Word (Word8, Word16, Word32, Word64)
4+import GHC.Int (Int8, Int16, Int32, Int64)
5+import Test.QuickCheck
6+ ( Gen
7+ , Property
8+ , choose
9+ , forAll
10+ )
11+import Test.QuickCheck.Monadic (monadicIO)
12+
13+import qualified Streamly.Internal.Serialize.FromBytes as Decoder
14+import qualified Streamly.Internal.Serialize.ToBytes as Encoder
15+import qualified Streamly.Data.Stream as Stream
16+import Streamly.Internal.Data.Parser (Parser)
17+
18+import Prelude hiding
19+ (maximum, minimum, elem, notElem, null, product, sum, head, last, take)
20+import Test.Hspec as H
21+import Test.Hspec.QuickCheck
22+import GHC.Base (unsafeChr)
23+
24+word16Max :: Word16
25+word16Max = maxBound
26+
27+word32Max :: Word32
28+word32Max = maxBound
29+
30+word64Max :: Word64
31+word64Max = maxBound
32+
33+chooseWord8 :: (Word8, Word8) -> Gen Word8
34+chooseWord8 = choose
35+
36+chooseWord16 :: (Word16, Word16) -> Gen Word16
37+chooseWord16 = choose
38+
39+chooseWord32 :: (Word32, Word32) -> Gen Word32
40+chooseWord32 = choose
41+
42+chooseWord64 :: (Word64, Word64) -> Gen Word64
43+chooseWord64 = choose
44+
45+chooseInt8 :: (Int8, Int8) -> Gen Int8
46+chooseInt8 = choose
47+
48+chooseInt16 :: (Int16, Int16) -> Gen Int16
49+chooseInt16 = choose
50+
51+chooseInt32 :: (Int32, Int32) -> Gen Int32
52+chooseInt32 = choose
53+
54+chooseInt64 :: (Int64, Int64) -> Gen Int64
55+chooseInt64 = choose
56+
57+chooseFloat :: (Float, Float) -> Gen Float
58+chooseFloat = choose
59+
60+chooseDouble :: (Double, Double) -> Gen Double
61+chooseDouble = choose
62+
63+chooseChar :: (Char, Char) -> Gen Char
64+chooseChar = choose
65+
66+action :: (Monad m, Eq a) =>
67+ a
68+ -> (a -> Stream.Stream m Word8)
69+ -> Parser Word8 m a
70+ -> m Bool
71+action 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
78+
79+unit :: Property
80+unit = 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
88+
89+bool :: Property
90+bool =
91+ forAll (chooseWord8 (0, 1)) $ \case
92+ 0 -> monadicIO $ action False Encoder.bool Decoder.bool
93+ _ -> monadicIO $ action True Encoder.bool Decoder.bool
94+
95+ordering :: Property
96+ordering =
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
101+
102+word8 :: Property
103+word8 =
104+ forAll (chooseWord8 (0, 255)) $ \x ->
105+ monadicIO $ action x Encoder.word8 Decoder.word8
106+
107+word16be :: Property
108+word16be =
109+ forAll (chooseWord16 (0, word16Max)) $ \x ->
110+ monadicIO $ action x Encoder.word16be Decoder.word16be
111+
112+word32be :: Property
113+word32be =
114+ forAll (chooseWord32 (0, word32Max)) $ \x ->
115+ monadicIO $ action x Encoder.word32be Decoder.word32be
116+
117+word64be :: Property
118+word64be =
119+ forAll (chooseWord64 (0, word64Max)) $ \x ->
120+ monadicIO $ action x Encoder.word64be Decoder.word64be
121+
122+word16le :: Property
123+word16le =
124+ forAll (chooseWord16 (0, word16Max)) $ \x ->
125+ monadicIO $ action x Encoder.word16le Decoder.word16le
126+
127+word32le :: Property
128+word32le =
129+ forAll (chooseWord32 (0, word32Max)) $ \x ->
130+ monadicIO $ action x Encoder.word32le Decoder.word32le
131+
132+word64le :: Property
133+word64le =
134+ forAll (chooseWord64 (0, word64Max)) $ \x ->
135+ monadicIO $ action x Encoder.word64le Decoder.word64le
136+
137+int8 :: Property
138+int8 =
139+ forAll (chooseInt8 (-128, 127)) $ \x ->
140+ monadicIO $ action x Encoder.int8 Decoder.int8
141+
142+int16be :: Property
143+int16be =
144+ forAll (chooseInt16 (-32768, 32767)) $ \x ->
145+ monadicIO $ action x Encoder.int16be Decoder.int16be
146+
147+int32be :: Property
148+int32be =
149+ forAll (chooseInt32 (-2147483648, 2147483647)) $ \x ->
150+ monadicIO $ action x Encoder.int32be Decoder.int32be
151+
152+int64be :: Property
153+int64be =
154+ forAll (chooseInt64 (-9223372036854775808, 9223372036854775807)) $ \x ->
155+ monadicIO $ action x Encoder.int64be Decoder.int64be
156+
157+int16le :: Property
158+int16le =
159+ forAll (chooseInt16 (-32768, 32767)) $ \x ->
160+ monadicIO $ action x Encoder.int16le Decoder.int16le
161+
162+int32le :: Property
163+int32le =
164+ forAll (chooseInt32 (-2147483648, 2147483647)) $ \x ->
165+ monadicIO $ action x Encoder.int32le Decoder.int32le
166+
167+int64le :: Property
168+int64le =
169+ forAll (chooseInt64 (-9223372036854775808, 9223372036854775807)) $ \x ->
170+ monadicIO $ action x Encoder.int64le Decoder.int64le
171+
172+float32be :: Property
173+float32be =
174+ forAll (chooseFloat (-3.40282e+38, 3.40282e+38)) $ \x ->
175+ monadicIO $ action x Encoder.float32be Decoder.float32be
176+
177+float32le :: Property
178+float32le =
179+ forAll (chooseFloat (-3.40282e+38, 3.40282e+38)) $ \x ->
180+ monadicIO $ action x Encoder.float32le Decoder.float32le
181+
182+double64be :: Property
183+double64be =
184+ forAll (chooseDouble (-1.79769e+308, 1.79769e+308)) $ \x ->
185+ monadicIO $ action x Encoder.double64be Decoder.double64be
186+
187+double64le :: Property
188+double64le =
189+ forAll (chooseDouble (-1.79769e+308, 1.79769e+308)) $ \x ->
190+ monadicIO $ action x Encoder.double64le Decoder.double64le
191+
192+charLatin1 :: Property
193+charLatin1 = forAll (chooseChar (unsafeChr 0, unsafeChr 255)) $ \x ->
194+ monadicIO $ action x Encoder.charLatin1 Decoder.charLatin1
195+
196+moduleName :: String
197+moduleName = "Serialize.Serializable"
198+
199+main :: IO ()
200+main =
201+ hspec $ do
202+ describe moduleName $ do
203+ -- Unit
204+ prop "unit" Main.unit
205+
206+ -- Bool
207+ prop "bool" Main.bool
208+
209+ -- Ordering
210+ prop "ordering" Main.ordering
211+
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
220+
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
229+
230+ -- Fractional
231+ prop "float32be" Main.float32be
232+ prop "float32le" Main.float32le
233+ prop "double64be" Main.double64be
234+ prop "double64le" Main.double64le
235+
236+ -- Char
237+ prop "charLatin1" Main.charLatin1
test/streamly-tests.cabal+5
@@ -512,6 +512,11 @@ test-suite Unicode.Char
512512 if flag(use-streamly-core) || !flag(dev)
513513 buildable: False
514514
515+test-suite Serialize.Serializable
516+ import: test-options
517+ type: exitcode-stdio-1.0
518+ main-is: Streamly/Test/Serialize/Serializable.hs
519+
515520test-suite version-bounds
516521 import: test-options
517522 type: exitcode-stdio-1.0