on master help sign in
Add property tests for splitOn and splitOnSuffix
c191f9cAdithya Kumar
test/Streamly/Test/Prelude/Serial.hs+60−23
@@ -107,16 +107,18 @@ splitOnSuffixSeq = do
107 S.toList
107 S.toList
108 $ IS.splitOnSuffixSeq (A.fromList pat) FL.toList (S.fromList xs)
108 $ IS.splitOnSuffixSeq (A.fromList pat) FL.toList (S.fromList xs)
109
109
110−seqSplitterProperties ::
110+splitterProperties ::
111 forall a. (Arbitrary a, Eq a, Show a, Storable a, Enum a)
111 forall a. (Arbitrary a, Eq a, Show a, Storable a, Enum a)
112 => a
112 => a
113 -> String
113 -> String
114 -> Spec
114 -> Spec
115−seqSplitterProperties sep desc = do
115+splitterProperties sep desc = do
116 describe (desc <> " splitOnSeq")
116 describe (desc <> " splitOnSeq")
117 $ do
117 $ do
118
118
119− forM_ [0, 1, 2, 4] intercalateSplitEqId
119+ forM_ [0, 1, 2, 4]
120+ $ intercalateSplitEqId splitOnSeq_ intercalate IS.intercalate
121+
120 forM_ [0, 1, 2, 4]
122 forM_ [0, 1, 2, 4]
121 $ concatSplitIntercalateEqConcat
123 $ concatSplitIntercalateEqConcat
122 splitOnSeq_
124 splitOnSeq_
@@ -126,10 +128,26 @@ seqSplitterProperties sep desc = do
126 -- Exclusive case
128 -- Exclusive case
127 splitIntercalateEqId splitOnSeq_ intercalate IS.intercalate
129 splitIntercalateEqId splitOnSeq_ intercalate IS.intercalate
128
130
131+ describe (desc <> " splitOn")
132+ $ do
133+
134+ intercalateSplitEqId splitOn_ intercalate IS.intercalate 1
135+
136+ concatSplitIntercalateEqConcat
137+ splitOn_ intercalate IS.intercalate 1
138+
139+ -- Exclusive case
140+ splitIntercalateEqId splitOn_ intercalate IS.intercalate
141+
129 describe (desc <> " splitOnSuffixSeq")
142 describe (desc <> " splitOnSuffixSeq")
130 $ do
143 $ do
131
144
145+ forM_ [0, 1, 2, 4]
132− forM_ [0, 1, 2, 4] intercalateSplitEqIdNoSepEnd
146+ $ intercalateSplitEqIdNoSepEnd
147+ splitOnSuffixSeq_
148+ intercalate
149+ IS.intercalate
150+
133 forM_ [0, 1, 2, 4]
151 forM_ [0, 1, 2, 4]
134 $ concatSplitIntercalateEqConcat
152 $ concatSplitIntercalateEqConcat
135 splitOnSuffixSeq_
153 splitOnSuffixSeq_
@@ -142,6 +160,19 @@ seqSplitterProperties sep desc = do
142 intercalateSuffix
160 intercalateSuffix
143 IS.intercalateSuffix
161 IS.intercalateSuffix
144
162
163+ describe (desc <> " splitOnSuffix")
164+ $ do
165+
166+ intercalateSplitEqIdNoSepEnd
167+ splitOnSuffix_ intercalate IS.intercalate 1
168+
169+ concatSplitIntercalateEqConcat
170+ splitOnSuffix_ intercalateSuffix IS.intercalateSuffix 1
171+
172+ -- Exclusive case
173+ splitIntercalateEqId
174+ splitOnSuffix_ intercalateSuffix IS.intercalateSuffix
175+
145 where
176 where
146
177
147 splitOnSeq_ xs ys =
178 splitOnSeq_ xs ys =
@@ -150,6 +181,12 @@ seqSplitterProperties sep desc = do
150 splitOnSuffixSeq_ xs ys =
181 splitOnSuffixSeq_ xs ys =
151 S.toList $ IS.splitOnSuffixSeq (A.fromList ys) FL.toList (S.fromList xs)
182 S.toList $ IS.splitOnSuffixSeq (A.fromList ys) FL.toList (S.fromList xs)
152
183
184+ splitOn_ xs ys =
185+ S.toList $ IS.splitOn (== (head ys)) FL.toList (S.fromList xs)
186+
187+ splitOnSuffix_ xs ys =
188+ S.toList $ IS.splitOnSuffix (== (head ys)) FL.toList (S.fromList xs)
189+
153 intercalateSuffix xs yss = intercalate xs yss ++ xs
190 intercalateSuffix xs yss = intercalate xs yss ++ xs
154
191
155 nonSepElem :: Gen a
192 nonSepElem :: Gen a
@@ -167,9 +204,9 @@ seqSplitterProperties sep desc = do
167 listsWithoutSep1 :: Gen [[a]]
204 listsWithoutSep1 :: Gen [[a]]
168 listsWithoutSep1 = listOf1 listWithoutSep
205 listsWithoutSep1 = listOf1 listWithoutSep
169
206
170− intercalateSplitEqId i =
207+ intercalateSplitEqId splitter lIntercalater sIntercalater i =
171 let name =
208 let name =
172− "intercalate . splitOnSeq == id ("
209+ "intercalater . splitter == id ("
173 <> show i <> " element separator)"
210 <> show i <> " element separator)"
174 in prop name
211 in prop name
175 $ forAll listWithSep
212 $ forAll listWithSep
@@ -178,18 +215,18 @@ seqSplitterProperties sep desc = do
178 where
215 where
179
216
180 testCase xs = do
217 testCase xs = do
181− ys <- splitOnSeq_ xs (replicate i sep)
218+ ys <- splitter xs (replicate i sep)
182 szs <-
219 szs <-
183 IS.toList
220 IS.toList
184− $ IS.intercalate (replicate i sep) UF.fromList
221+ $ sIntercalater (replicate i sep) UF.fromList
185 $ IS.fromList ys
222 $ IS.fromList ys
186− let lzs = intercalate (replicate i sep) ys
223+ let lzs = lIntercalater (replicate i sep) ys
187 listEquals (==) szs xs
224 listEquals (==) szs xs
188 listEquals (==) lzs xs
225 listEquals (==) lzs xs
189
226
190− intercalateSplitEqIdNoSepEnd i =
227+ intercalateSplitEqIdNoSepEnd splitter lIntercalater sIntercalater i =
191 let name =
228 let name =
192− "intercalate . splitOnSuffixSeq_ . (++ [x \\= sep]) == id ("
229+ "intercalater . splitter . (++ [x \\= sep]) == id ("
193 <> show i <> " element separator)"
230 <> show i <> " element separator)"
194 in prop name
231 in prop name
195 $ forAll ((,) <$> listWithSep <*> nonSepElem)
232 $ forAll ((,) <$> listWithSep <*> nonSepElem)
@@ -200,16 +237,16 @@ seqSplitterProperties sep desc = do
200 where
237 where
201
238
202 testCase xs = do
239 testCase xs = do
203− ys <- splitOnSuffixSeq_ xs (replicate i sep)
240+ ys <- splitter xs (replicate i sep)
204 szs <-
241 szs <-
205 IS.toList
242 IS.toList
206− $ IS.intercalate (replicate i sep) UF.fromList
243+ $ sIntercalater (replicate i sep) UF.fromList
207 $ IS.fromList ys
244 $ IS.fromList ys
208− let lzs = intercalate (replicate i sep) ys
245+ let lzs = lIntercalater (replicate i sep) ys
209 listEquals (==) szs xs
246 listEquals (==) szs xs
210 listEquals (==) lzs xs
247 listEquals (==) lzs xs
211
248
212− concatSplitIntercalateEqConcat splitter lintercalater sintercalater i =
249+ concatSplitIntercalateEqConcat splitter lIntercalater sIntercalater i =
213 let name =
250 let name =
214 "concat . splitter . S.intercalater == "
251 "concat . splitter . S.intercalater == "
215 <> "concat ("
252 <> "concat ("
@@ -221,17 +258,17 @@ seqSplitterProperties sep desc = do
221 where
258 where
222
259
223 testCase xss = do
260 testCase xss = do
224− let lxs = lintercalater (replicate i sep) xss
261+ let lxs = lIntercalater (replicate i sep) xss
225 lys <- splitter lxs (replicate i sep)
262 lys <- splitter lxs (replicate i sep)
226 sxs <-
263 sxs <-
227 S.toList
264 S.toList
228− $ sintercalater (replicate i sep) UF.fromList
265+ $ sIntercalater (replicate i sep) UF.fromList
229 $ S.fromList xss
266 $ S.fromList xss
230 sys <- splitter sxs (replicate i sep)
267 sys <- splitter sxs (replicate i sep)
231 listEquals (==) (concat lys) (concat xss)
268 listEquals (==) (concat lys) (concat xss)
232 listEquals (==) (concat sys) (concat xss)
269 listEquals (==) (concat sys) (concat xss)
233
270
234− splitIntercalateEqId splitter lintercalater sintercalater =
271+ splitIntercalateEqId splitter lIntercalater sIntercalater =
235 let name =
272 let name =
236 "splitter . intercalater == id"
273 "splitter . intercalater == id"
237 <> " (exclusive separator/non-empty list)"
274 <> " (exclusive separator/non-empty list)"
@@ -243,9 +280,9 @@ seqSplitterProperties sep desc = do
243 where
280 where
244
281
245 testCase xss = do
282 testCase xss = do
246− let lxs = lintercalater [sep] xss
283+ let lxs = lIntercalater [sep] xss
247 lys <- splitter lxs [sep]
284 lys <- splitter lxs [sep]
248− sxs <- S.toList $ sintercalater [sep] UF.fromList $ S.fromList xss
285+ sxs <- S.toList $ sIntercalater [sep] UF.fromList $ S.fromList xss
249 sys <- splitter sxs [sep]
286 sys <- splitter sxs [sep]
250 listEquals (==) lys xss
287 listEquals (==) lys xss
251 listEquals (==) sys xss
288 listEquals (==) sys xss
@@ -257,10 +294,10 @@ groupSplitOps desc = do
257 splitOnSeq
294 splitOnSeq
258 splitOnSuffixSeq
295 splitOnSuffixSeq
259
296
260− -- seq splitting
297+ -- splitting properties
261− seqSplitterProperties (0 :: Int) desc
298+ splitterProperties (0 :: Int) desc
262 -- XXX This will fail
299 -- XXX This will fail
263− -- seqSplitterProperties (0 :: Word8) desc
300+ -- splitterProperties (0 :: Word8) desc
264
301
265 prop (desc <> " intercalate [x] . splitOn (== x) == id") $
302 prop (desc <> " intercalate [x] . splitOn (== x) == id") $
266 forAll listWithZeroes $ \xs -> do
303 forAll listWithZeroes $ \xs -> do