@@ -1,1363 +0,0 @@
1−-- | QuickCheck properties for the text library.
2−
3−{-# LANGUAGE BangPatterns, FlexibleInstances, OverloadedStrings,
4− ScopedTypeVariables, TypeSynonymInstances #-}
5−{-# OPTIONS_GHC -fno-enable-rewrite-rules -fno-warn-missing-signatures #-}
6−module Tests.Properties
7− (
8− tests
9− ) where
10−
11−import Control.Applicative ((<$>), (<*>))
12−import Control.Arrow ((***), second)
13−import Data.Bits ((.&.))
14−import Data.Char (chr, isDigit, isHexDigit, isLower, isSpace, isUpper, ord)
15−import Data.Int (Int8, Int16, Int32, Int64)
16−import Data.Monoid (Monoid(..))
17−import Data.String (IsString(fromString))
18−import Data.Text.Encoding.Error
19−import Data.Text.Foreign
20−import Data.Text.Internal.Encoding.Utf8
21−import Data.Text.Internal.Fusion.Size
22−import Data.Text.Internal.Search (indices)
23−import Data.Text.Lazy.Read as TL
24−import Data.Text.Read as T
25−import Data.Word (Word, Word8, Word16, Word32, Word64)
26−import Numeric (showEFloat, showFFloat, showGFloat, showHex)
27−import Prelude hiding (replicate)
28−import Test.Framework (Test, testGroup)
29−import Test.Framework.Providers.QuickCheck2 (testProperty)
30−import Test.QuickCheck hiding ((.&.))
31−import Test.QuickCheck.Monadic
32−import Test.QuickCheck.Property (Property(..))
33−import Tests.QuickCheckUtils
34−import Tests.Utils
35−import Text.Show.Functions ()
36−import qualified Control.Exception as Exception
37−import qualified Data.Bits as Bits (shiftL, shiftR)
38−import qualified Data.ByteString as B
39−import qualified Data.ByteString.Lazy as BL
40−import qualified Data.List as L
41−import qualified Data.Text as T
42−import qualified Data.Text.Encoding as E
43−import qualified Data.Text.IO as T
44−import qualified Data.Text.Internal.Fusion as S
45−import qualified Data.Text.Internal.Fusion.Common as S
46−import qualified Data.Text.Internal.Lazy.Fusion as SL
47−import qualified Data.Text.Internal.Lazy.Search as S (indices)
48−import qualified Data.Text.Internal.Unsafe.Shift as U
49−import qualified Data.Text.Lazy as TL
50−import qualified Data.Text.Lazy.Builder as TB
51−import qualified Data.Text.Lazy.Builder.Int as TB
52−import qualified Data.Text.Lazy.Builder.RealFloat as TB
53−import qualified Data.Text.Lazy.Encoding as EL
54−import qualified Data.Text.Lazy.IO as TL
55−import qualified System.IO as IO
56−import qualified Tests.Properties.Mul as Mul
57−import qualified Tests.SlowFunctions as Slow
58−
59−t_pack_unpack = (T.unpack . T.pack) `eq` id
60−tl_pack_unpack = (TL.unpack . TL.pack) `eq` id
61−t_stream_unstream = (S.unstream . S.stream) `eq` id
62−tl_stream_unstream = (SL.unstream . SL.stream) `eq` id
63−t_reverse_stream t = (S.reverse . S.reverseStream) t == t
64−t_singleton c = [c] == (T.unpack . T.singleton) c
65−tl_singleton c = [c] == (TL.unpack . TL.singleton) c
66−tl_unstreamChunks x = f 11 x == f 1000 x
67− where f n = SL.unstreamChunks n . S.streamList
68−tl_chunk_unchunk = (TL.fromChunks . TL.toChunks) `eq` id
69−tl_from_to_strict = (TL.fromStrict . TL.toStrict) `eq` id
70−
71−-- Note: this silently truncates code-points > 255 to 8-bit due to 'B.pack'
72−encodeL1 :: T.Text -> B.ByteString
73−encodeL1 = B.pack . map (fromIntegral . fromEnum) . T.unpack
74−encodeLazyL1 :: TL.Text -> BL.ByteString
75−encodeLazyL1 = BL.fromChunks . map encodeL1 . TL.toChunks
76−
77−t_ascii t = E.decodeASCII (E.encodeUtf8 a) == a
78− where a = T.map (\c -> chr (ord c `mod` 128)) t
79−tl_ascii t = EL.decodeASCII (EL.encodeUtf8 a) == a
80− where a = TL.map (\c -> chr (ord c `mod` 128)) t
81−t_latin1 t = E.decodeLatin1 (encodeL1 a) == a
82− where a = T.map (\c -> chr (ord c `mod` 256)) t
83−tl_latin1 t = EL.decodeLatin1 (encodeLazyL1 a) == a
84− where a = TL.map (\c -> chr (ord c `mod` 256)) t
85−t_utf8 = forAll genUnicode $ (E.decodeUtf8 . E.encodeUtf8) `eq` id
86−t_utf8' = forAll genUnicode $ (E.decodeUtf8' . E.encodeUtf8) `eq` (id . Right)
87−tl_utf8 = forAll genUnicode $ (EL.decodeUtf8 . EL.encodeUtf8) `eq` id
88−tl_utf8' = forAll genUnicode $ (EL.decodeUtf8' . EL.encodeUtf8) `eq` (id . Right)
89−t_utf16LE = forAll genUnicode $ (E.decodeUtf16LE . E.encodeUtf16LE) `eq` id
90−tl_utf16LE = forAll genUnicode $ (EL.decodeUtf16LE . EL.encodeUtf16LE) `eq` id
91−t_utf16BE = forAll genUnicode $ (E.decodeUtf16BE . E.encodeUtf16BE) `eq` id
92−tl_utf16BE = forAll genUnicode $ (EL.decodeUtf16BE . EL.encodeUtf16BE) `eq` id
93−t_utf32LE = forAll genUnicode $ (E.decodeUtf32LE . E.encodeUtf32LE) `eq` id
94−tl_utf32LE = forAll genUnicode $ (EL.decodeUtf32LE . EL.encodeUtf32LE) `eq` id
95−t_utf32BE = forAll genUnicode $ (E.decodeUtf32BE . E.encodeUtf32BE) `eq` id
96−tl_utf32BE = forAll genUnicode $ (EL.decodeUtf32BE . EL.encodeUtf32BE) `eq` id
97−
98−t_utf8_incr = forAll genUnicode $ \s (Positive n) -> (recode n `eq` id) s
99− where recode n = T.concat . map fst . feedChunksOf n E.streamDecodeUtf8 .
100− E.encodeUtf8
101−
102−feedChunksOf :: Int -> (B.ByteString -> E.Decoding) -> B.ByteString
103− -> [(T.Text, B.ByteString)]
104−feedChunksOf n f bs
105− | B.null bs = []
106− | otherwise = let (x,y) = B.splitAt n bs
107− E.Some t b f' = f x
108− in (t,b) : feedChunksOf n f' y
109−
110−t_utf8_undecoded = forAll genUnicode $ \t ->
111− let b = E.encodeUtf8 t
112− ls = concatMap (leftover . E.encodeUtf8 . T.singleton) . T.unpack $ t
113− leftover = (++ [B.empty]) . init . tail . B.inits
114− in (map snd . feedChunksOf 1 E.streamDecodeUtf8) b == ls
115−
116−data Badness = Solo | Leading | Trailing
117− deriving (Eq, Show)
118−
119−instance Arbitrary Badness where
120− arbitrary = elements [Solo, Leading, Trailing]
121−
122−t_utf8_err :: Badness -> DecodeErr -> Property
123−t_utf8_err bad de = do
124− let gen = case bad of
125− Solo -> genInvalidUTF8
126− Leading -> B.append <$> genInvalidUTF8 <*> genUTF8
127− Trailing -> B.append <$> genUTF8 <*> genInvalidUTF8
128− genUTF8 = E.encodeUtf8 <$> genUnicode
129− forAll gen $ \bs -> MkProperty $ do
130− onErr <- genDecodeErr de
131− unProperty . monadicIO $ do
132− l <- run $ let len = T.length (E.decodeUtf8With onErr bs)
133− in (len `seq` return (Right len)) `Exception.catch`
134− (\(e::UnicodeException) -> return (Left e))
135− assert $ case l of
136− Left err -> length (show err) >= 0
137− Right _ -> de /= Strict
138−
139−t_utf8_err' :: B.ByteString -> Property
140−t_utf8_err' bs = monadicIO . assert $ case E.decodeUtf8' bs of
141− Left err -> length (show err) >= 0
142− Right t -> T.length t >= 0
143−
144−genInvalidUTF8 :: Gen B.ByteString
145−genInvalidUTF8 = B.pack <$> oneof [
146− -- invalid leading byte of a 2-byte sequence
147− (:) <$> choose (0xC0, 0xC1) <*> upTo 1 contByte
148− -- invalid leading byte of a 4-byte sequence
149− , (:) <$> choose (0xF5, 0xFF) <*> upTo 3 contByte
150− -- 4-byte sequence greater than U+10FFFF
151− , do k <- choose (0x11, 0x13)
152− let w0 = 0xF0 + (k `Bits.shiftR` 2)
153− w1 = 0x80 + ((k .&. 3) `Bits.shiftL` 4)
154− ([w0,w1]++) <$> vectorOf 2 contByte
155− -- continuation bytes without a start byte
156− , listOf1 contByte
157− -- short 2-byte sequence
158− , (:[]) <$> choose (0xC2, 0xDF)
159− -- short 3-byte sequence
160− , (:) <$> choose (0xE0, 0xEF) <*> upTo 1 contByte
161− -- short 4-byte sequence
162− , (:) <$> choose (0xF0, 0xF4) <*> upTo 2 contByte
163− -- overlong encoding
164− , do k <- choose (0,0xFFFF)
165− let c = chr k
166− case k of
167− _ | k < 0x80 -> oneof [ let (w,x) = ord2 c in return [w,x]
168− , let (w,x,y) = ord3 c in return [w,x,y]
169− , let (w,x,y,z) = ord4 c in return [w,x,y,z] ]
170− | k < 0x7FF -> oneof [ let (w,x,y) = ord3 c in return [w,x,y]
171− , let (w,x,y,z) = ord4 c in return [w,x,y,z] ]
172− | otherwise -> let (w,x,y,z) = ord4 c in return [w,x,y,z]
173− ]
174− where
175− contByte = (0x80 +) <$> choose (0, 0x3f)
176− upTo n gen = do
177− k <- choose (0,n)
178− vectorOf k gen
179−
180−s_Eq s = (s==) `eq` ((S.streamList s==) . S.streamList)
181− where _types = s :: String
182−sf_Eq p s =
183− ((L.filter p s==) . L.filter p) `eq`
184− (((S.filter p $ S.streamList s)==) . S.filter p . S.streamList)
185−t_Eq s = (s==) `eq` ((T.pack s==) . T.pack)
186−tl_Eq s = (s==) `eq` ((TL.pack s==) . TL.pack)
187−s_Ord s = (compare s) `eq` (compare (S.streamList s) . S.streamList)
188− where _types = s :: String
189−sf_Ord p s =
190− ((compare $ L.filter p s) . L.filter p) `eq`
191− (compare (S.filter p $ S.streamList s) . S.filter p . S.streamList)
192−t_Ord s = (compare s) `eq` (compare (T.pack s) . T.pack)
193−tl_Ord s = (compare s) `eq` (compare (TL.pack s) . TL.pack)
194−t_Read = id `eq` (T.unpack . read . show)
195−tl_Read = id `eq` (TL.unpack . read . show)
196−t_Show = show `eq` (show . T.pack)
197−tl_Show = show `eq` (show . TL.pack)
198−t_mappend s = mappend s`eqP` (unpackS . mappend (T.pack s))
199−tl_mappend s = mappend s`eqP` (unpackS . mappend (TL.pack s))
200−t_mconcat = unsquare $
201− mconcat `eq` (unpackS . mconcat . L.map T.pack)
202−tl_mconcat = unsquare $
203− mconcat `eq` (unpackS . mconcat . L.map TL.pack)
204−t_mempty = mempty == (unpackS (mempty :: T.Text))
205−tl_mempty = mempty == (unpackS (mempty :: TL.Text))
206−t_IsString = fromString `eqP` (T.unpack . fromString)
207−tl_IsString = fromString `eqP` (TL.unpack . fromString)
208−
209−s_cons x = (x:) `eqP` (unpackS . S.cons x)
210−s_cons_s x = (x:) `eqP` (unpackS . S.unstream . S.cons x)
211−sf_cons p x = ((x:) . L.filter p) `eqP` (unpackS . S.cons x . S.filter p)
212−t_cons x = (x:) `eqP` (unpackS . T.cons x)
213−tl_cons x = (x:) `eqP` (unpackS . TL.cons x)
214−s_snoc x = (++ [x]) `eqP` (unpackS . (flip S.snoc) x)
215−t_snoc x = (++ [x]) `eqP` (unpackS . (flip T.snoc) x)
216−tl_snoc x = (++ [x]) `eqP` (unpackS . (flip TL.snoc) x)
217−s_append s = (s++) `eqP` (unpackS . S.append (S.streamList s))
218−s_append_s s = (s++) `eqP`
219− (unpackS . S.unstream . S.append (S.streamList s))
220−sf_append p s = (L.filter p s++) `eqP`
221− (unpackS . S.append (S.filter p $ S.streamList s))
222−t_append s = (s++) `eqP` (unpackS . T.append (packS s))
223−
224−uncons (x:xs) = Just (x,xs)
225−uncons _ = Nothing
226−
227−s_uncons = uncons `eqP` (fmap (second unpackS) . S.uncons)
228−sf_uncons p = (uncons . L.filter p) `eqP`
229− (fmap (second unpackS) . S.uncons . S.filter p)
230−t_uncons = uncons `eqP` (fmap (second unpackS) . T.uncons)
231−tl_uncons = uncons `eqP` (fmap (second unpackS) . TL.uncons)
232−s_head = head `eqP` S.head
233−sf_head p = (head . L.filter p) `eqP` (S.head . S.filter p)
234−t_head = head `eqP` T.head
235−tl_head = head `eqP` TL.head
236−s_last = last `eqP` S.last
237−sf_last p = (last . L.filter p) `eqP` (S.last . S.filter p)
238−t_last = last `eqP` T.last
239−tl_last = last `eqP` TL.last
240−s_tail = tail `eqP` (unpackS . S.tail)
241−s_tail_s = tail `eqP` (unpackS . S.unstream . S.tail)
242−sf_tail p = (tail . L.filter p) `eqP` (unpackS . S.tail . S.filter p)
243−t_tail = tail `eqP` (unpackS . T.tail)
244−tl_tail = tail `eqP` (unpackS . TL.tail)
245−s_init = init `eqP` (unpackS . S.init)
246−s_init_s = init `eqP` (unpackS . S.unstream . S.init)
247−sf_init p = (init . L.filter p) `eqP` (unpackS . S.init . S.filter p)
248−t_init = init `eqP` (unpackS . T.init)
249−tl_init = init `eqP` (unpackS . TL.init)
250−s_null = null `eqP` S.null
251−sf_null p = (null . L.filter p) `eqP` (S.null . S.filter p)
252−t_null = null `eqP` T.null
253−tl_null = null `eqP` TL.null
254−s_length = length `eqP` S.length
255−sf_length p = (length . L.filter p) `eqP` (S.length . S.filter p)
256−sl_length = (fromIntegral . length) `eqP` SL.length
257−t_length = length `eqP` T.length
258−tl_length = L.genericLength `eqP` TL.length
259−t_compareLength t = (compare (T.length t)) `eq` T.compareLength t
260−tl_compareLength t= (compare (TL.length t)) `eq` TL.compareLength t
261−
262−s_map f = map f `eqP` (unpackS . S.map f)
263−s_map_s f = map f `eqP` (unpackS . S.unstream . S.map f)
264−sf_map p f = (map f . L.filter p) `eqP` (unpackS . S.map f . S.filter p)
265−t_map f = map f `eqP` (unpackS . T.map f)
266−tl_map f = map f `eqP` (unpackS . TL.map f)
267−s_intercalate c = unsquare $
268− L.intercalate c `eq`
269− (unpackS . S.intercalate (packS c) . map packS)
270−t_intercalate c = unsquare $
271− L.intercalate c `eq`
272− (unpackS . T.intercalate (packS c) . map packS)
273−tl_intercalate c = unsquare $
274− L.intercalate c `eq`
275− (unpackS . TL.intercalate (TL.pack c) . map TL.pack)
276−s_intersperse c = L.intersperse c `eqP`
277− (unpackS . S.intersperse c)
278−s_intersperse_s c = L.intersperse c `eqP`
279− (unpackS . S.unstream . S.intersperse c)
280−sf_intersperse p c= (L.intersperse c . L.filter p) `eqP`
281− (unpackS . S.intersperse c . S.filter p)
282−t_intersperse c = unsquare $
283− L.intersperse c `eqP` (unpackS . T.intersperse c)
284−tl_intersperse c = unsquare $
285− L.intersperse c `eqP` (unpackS . TL.intersperse c)
286−t_transpose = unsquare $
287− L.transpose `eq` (map unpackS . T.transpose . map packS)
288−tl_transpose = unsquare $
289− L.transpose `eq` (map unpackS . TL.transpose . map TL.pack)
290−t_reverse = L.reverse `eqP` (unpackS . T.reverse)
291−tl_reverse = L.reverse `eqP` (unpackS . TL.reverse)
292−t_reverse_short n = L.reverse `eqP` (unpackS . S.reverse . shorten n . S.stream)
293−
294−t_replace s d = (L.intercalate d . splitOn s) `eqP`
295− (unpackS . T.replace (T.pack s) (T.pack d))
296−tl_replace s d = (L.intercalate d . splitOn s) `eqP`
297− (unpackS . TL.replace (TL.pack s) (TL.pack d))
298−
299−splitOn :: (Eq a) => [a] -> [a] -> [[a]]
300−splitOn pat src0
301− | l == 0 = error "splitOn: empty"
302− | otherwise = go src0
303− where
304− l = length pat
305− go src = search 0 src
306− where
307− search _ [] = [src]
308− search !n s@(_:s')
309− | pat `L.isPrefixOf` s = take n src : go (drop l s)
310− | otherwise = search (n+1) s'
311−
312−s_toCaseFold_length xs = S.length (S.toCaseFold s) >= length xs
313− where s = S.streamList xs
314−sf_toCaseFold_length p xs =
315− (S.length . S.toCaseFold . S.filter p $ s) >= (length . L.filter p $ xs)
316− where s = S.streamList xs
317−t_toCaseFold_length t = T.length (T.toCaseFold t) >= T.length t
318−tl_toCaseFold_length t = TL.length (TL.toCaseFold t) >= TL.length t
319−t_toLower_length t = T.length (T.toLower t) >= T.length t
320−t_toLower_lower t = p (T.toLower t) >= p t
321− where p = T.length . T.filter isLower
322−tl_toLower_lower t = p (TL.toLower t) >= p t
323− where p = TL.length . TL.filter isLower
324−t_toUpper_length t = T.length (T.toUpper t) >= T.length t
325−t_toUpper_upper t = p (T.toUpper t) >= p t
326− where p = T.length . T.filter isUpper
327−tl_toUpper_upper t = p (TL.toUpper t) >= p t
328− where p = TL.length . TL.filter isUpper
329−
330−justifyLeft k c xs = xs ++ L.replicate (k - length xs) c
331−justifyRight m n xs = L.replicate (m - length xs) n ++ xs
332−center k c xs
333− | len >= k = xs
334− | otherwise = L.replicate l c ++ xs ++ L.replicate r c
335− where len = length xs
336− d = k - len
337− r = d `div` 2
338− l = d - r
339−
340−s_justifyLeft k c = justifyLeft j c `eqP` (unpackS . S.justifyLeftI j c)
341− where j = fromIntegral (k :: Word8)
342−s_justifyLeft_s k c = justifyLeft j c `eqP`
343− (unpackS . S.unstream . S.justifyLeftI j c)
344− where j = fromIntegral (k :: Word8)
345−sf_justifyLeft p k c = (justifyLeft j c . L.filter p) `eqP`
346− (unpackS . S.justifyLeftI j c . S.filter p)
347− where j = fromIntegral (k :: Word8)
348−t_justifyLeft k c = justifyLeft j c `eqP` (unpackS . T.justifyLeft j c)
349− where j = fromIntegral (k :: Word8)
350−tl_justifyLeft k c = justifyLeft j c `eqP`
351− (unpackS . TL.justifyLeft (fromIntegral j) c)
352− where j = fromIntegral (k :: Word8)
353−t_justifyRight k c = justifyRight j c `eqP` (unpackS . T.justifyRight j c)
354− where j = fromIntegral (k :: Word8)
355−tl_justifyRight k c = justifyRight j c `eqP`
356− (unpackS . TL.justifyRight (fromIntegral j) c)
357− where j = fromIntegral (k :: Word8)
358−t_center k c = center j c `eqP` (unpackS . T.center j c)
359− where j = fromIntegral (k :: Word8)
360−tl_center k c = center j c `eqP` (unpackS . TL.center (fromIntegral j) c)
361− where j = fromIntegral (k :: Word8)
362−
363−sf_foldl p f z = (L.foldl f z . L.filter p) `eqP` (S.foldl f z . S.filter p)
364− where _types = f :: Char -> Char -> Char
365−t_foldl f z = L.foldl f z `eqP` (T.foldl f z)
366− where _types = f :: Char -> Char -> Char
367−tl_foldl f z = L.foldl f z `eqP` (TL.foldl f z)
368− where _types = f :: Char -> Char -> Char
369−sf_foldl' p f z = (L.foldl' f z . L.filter p) `eqP`
370− (S.foldl' f z . S.filter p)
371− where _types = f :: Char -> Char -> Char
372−t_foldl' f z = L.foldl' f z `eqP` T.foldl' f z
373− where _types = f :: Char -> Char -> Char
374−tl_foldl' f z = L.foldl' f z `eqP` TL.foldl' f z
375− where _types = f :: Char -> Char -> Char
376−sf_foldl1 p f = (L.foldl1 f . L.filter p) `eqP` (S.foldl1 f . S.filter p)
377−t_foldl1 f = L.foldl1 f `eqP` T.foldl1 f
378−tl_foldl1 f = L.foldl1 f `eqP` TL.foldl1 f
379−sf_foldl1' p f = (L.foldl1' f . L.filter p) `eqP` (S.foldl1' f . S.filter p)
380−t_foldl1' f = L.foldl1' f `eqP` T.foldl1' f
381−tl_foldl1' f = L.foldl1' f `eqP` TL.foldl1' f
382−sf_foldr p f z = (L.foldr f z . L.filter p) `eqP` (S.foldr f z . S.filter p)
383− where _types = f :: Char -> Char -> Char
384−t_foldr f z = L.foldr f z `eqP` T.foldr f z
385− where _types = f :: Char -> Char -> Char
386−tl_foldr f z = unsquare $
387− L.foldr f z `eqP` TL.foldr f z
388− where _types = f :: Char -> Char -> Char
389−sf_foldr1 p f = unsquare $
390− (L.foldr1 f . L.filter p) `eqP` (S.foldr1 f . S.filter p)
391−t_foldr1 f = L.foldr1 f `eqP` T.foldr1 f
392−tl_foldr1 f = unsquare $
393− L.foldr1 f `eqP` TL.foldr1 f
394−
395−s_concat_s = unsquare $
396− L.concat `eq` (unpackS . S.unstream . S.concat . map packS)
397−sf_concat p = unsquare $
398− (L.concat . map (L.filter p)) `eq`
399− (unpackS . S.concat . map (S.filter p . packS))
400−t_concat = unsquare $
401− L.concat `eq` (unpackS . T.concat . map packS)
402−tl_concat = unsquare $
403− L.concat `eq` (unpackS . TL.concat . map TL.pack)
404−sf_concatMap p f = unsquare $ (L.concatMap f . L.filter p) `eqP`
405− (unpackS . S.concatMap (packS . f) . S.filter p)
406−t_concatMap f = unsquare $
407− L.concatMap f `eqP` (unpackS . T.concatMap (packS . f))
408−tl_concatMap f = unsquare $
409− L.concatMap f `eqP` (unpackS . TL.concatMap (TL.pack . f))
410−sf_any q p = (L.any p . L.filter q) `eqP` (S.any p . S.filter q)
411−t_any p = L.any p `eqP` T.any p
412−tl_any p = L.any p `eqP` TL.any p
413−sf_all q p = (L.all p . L.filter q) `eqP` (S.all p . S.filter q)
414−t_all p = L.all p `eqP` T.all p
415−tl_all p = L.all p `eqP` TL.all p
416−sf_maximum p = (L.maximum . L.filter p) `eqP` (S.maximum . S.filter p)
417−t_maximum = L.maximum `eqP` T.maximum
418−tl_maximum = L.maximum `eqP` TL.maximum
419−sf_minimum p = (L.minimum . L.filter p) `eqP` (S.minimum . S.filter p)
420−t_minimum = L.minimum `eqP` T.minimum
421−tl_minimum = L.minimum `eqP` TL.minimum
422−
423−sf_scanl p f z = (L.scanl f z . L.filter p) `eqP`
424− (unpackS . S.scanl f z . S.filter p)
425−t_scanl f z = L.scanl f z `eqP` (unpackS . T.scanl f z)
426−tl_scanl f z = L.scanl f z `eqP` (unpackS . TL.scanl f z)
427−t_scanl1 f = L.scanl1 f `eqP` (unpackS . T.scanl1 f)
428−tl_scanl1 f = L.scanl1 f `eqP` (unpackS . TL.scanl1 f)
429−t_scanr f z = L.scanr f z `eqP` (unpackS . T.scanr f z)
430−tl_scanr f z = L.scanr f z `eqP` (unpackS . TL.scanr f z)
431−t_scanr1 f = L.scanr1 f `eqP` (unpackS . T.scanr1 f)
432−tl_scanr1 f = L.scanr1 f `eqP` (unpackS . TL.scanr1 f)
433−
434−t_mapAccumL f z = L.mapAccumL f z `eqP` (second unpackS . T.mapAccumL f z)
435− where _types = f :: Int -> Char -> (Int,Char)
436−tl_mapAccumL f z = L.mapAccumL f z `eqP` (second unpackS . TL.mapAccumL f z)
437− where _types = f :: Int -> Char -> (Int,Char)
438−t_mapAccumR f z = L.mapAccumR f z `eqP` (second unpackS . T.mapAccumR f z)
439− where _types = f :: Int -> Char -> (Int,Char)
440−tl_mapAccumR f z = L.mapAccumR f z `eqP` (second unpackS . TL.mapAccumR f z)
441− where _types = f :: Int -> Char -> (Int,Char)
442−
443−tl_repeat n = (L.take m . L.repeat) `eq`
444− (unpackS . TL.take (fromIntegral m) . TL.repeat)
445− where m = fromIntegral (n :: Word8)
446−
447−replicate n l = concat (L.replicate n l)
448−
449−s_replicate n = replicate m `eq`
450− (unpackS . S.replicateI (fromIntegral m) . packS)
451− where m = fromIntegral (n :: Word8)
452−t_replicate n = replicate m `eq` (unpackS . T.replicate m . packS)
453− where m = fromIntegral (n :: Word8)
454−tl_replicate n = replicate m `eq`
455− (unpackS . TL.replicate (fromIntegral m) . packS)
456− where m = fromIntegral (n :: Word8)
457−
458−tl_cycle n = (L.take m . L.cycle) `eq`
459− (unpackS . TL.take (fromIntegral m) . TL.cycle . packS)
460− where m = fromIntegral (n :: Word8)
461−
462−tl_iterate f n = (L.take m . L.iterate f) `eq`
463− (unpackS . TL.take (fromIntegral m) . TL.iterate f)
464− where m = fromIntegral (n :: Word8)
465−
466−unf :: Int -> Char -> Maybe (Char, Char)
467−unf n c | fromEnum c * 100 > n = Nothing
468− | otherwise = Just (c, succ c)
469−
470−t_unfoldr n = L.unfoldr (unf m) `eq` (unpackS . T.unfoldr (unf m))
471− where m = fromIntegral (n :: Word16)
472−tl_unfoldr n = L.unfoldr (unf m) `eq` (unpackS . TL.unfoldr (unf m))
473− where m = fromIntegral (n :: Word16)
474−t_unfoldrN n m = (L.take i . L.unfoldr (unf j)) `eq`
475− (unpackS . T.unfoldrN i (unf j))
476− where i = fromIntegral (n :: Word16)
477− j = fromIntegral (m :: Word16)
478−tl_unfoldrN n m = (L.take i . L.unfoldr (unf j)) `eq`
479− (unpackS . TL.unfoldrN (fromIntegral i) (unf j))
480− where i = fromIntegral (n :: Word16)
481− j = fromIntegral (m :: Word16)
482−
483−unpack2 :: (Stringy s) => (s,s) -> (String,String)
484−unpack2 = unpackS *** unpackS
485−
486−s_take n = L.take n `eqP` (unpackS . S.take n)
487−s_take_s m = L.take n `eqP` (unpackS . S.unstream . S.take n)
488− where n = small m
489−sf_take p n = (L.take n . L.filter p) `eqP`
490− (unpackS . S.take n . S.filter p)
491−t_take n = L.take n `eqP` (unpackS . T.take n)
492−t_takeEnd n = (L.reverse . L.take n . L.reverse) `eqP`
493− (unpackS . T.takeEnd n)
494−tl_take n = L.take n `eqP` (unpackS . TL.take (fromIntegral n))
495−tl_takeEnd n = (L.reverse . L.take (fromIntegral n) . L.reverse) `eqP`
496− (unpackS . TL.takeEnd n)
497−s_drop n = L.drop n `eqP` (unpackS . S.drop n)
498−s_drop_s m = L.drop n `eqP` (unpackS . S.unstream . S.drop n)
499− where n = small m
500−sf_drop p n = (L.drop n . L.filter p) `eqP`
501− (unpackS . S.drop n . S.filter p)
502−t_drop n = L.drop n `eqP` (unpackS . T.drop n)
503−t_dropEnd n = (L.reverse . L.drop n . L.reverse) `eqP`
504− (unpackS . T.dropEnd n)
505−tl_drop n = L.drop n `eqP` (unpackS . TL.drop (fromIntegral n))
506−tl_dropEnd n = (L.reverse . L.drop n . L.reverse) `eqP`
507− (unpackS . TL.dropEnd (fromIntegral n))
508−s_take_drop m = (L.take n . L.drop n) `eqP` (unpackS . S.take n . S.drop n)
509− where n = small m
510−s_take_drop_s m = (L.take n . L.drop n) `eqP`
511− (unpackS . S.unstream . S.take n . S.drop n)
512− where n = small m
513−s_takeWhile p = L.takeWhile p `eqP` (unpackS . S.takeWhile p)
514−s_takeWhile_s p = L.takeWhile p `eqP` (unpackS . S.unstream . S.takeWhile p)
515−sf_takeWhile q p = (L.takeWhile p . L.filter q) `eqP`
516− (unpackS . S.takeWhile p . S.filter q)
517−t_takeWhile p = L.takeWhile p `eqP` (unpackS . T.takeWhile p)
518−tl_takeWhile p = L.takeWhile p `eqP` (unpackS . TL.takeWhile p)
519−t_takeWhileEnd p = (L.reverse . L.takeWhile p . L.reverse) `eqP`
520− (unpackS . T.takeWhileEnd p)
521−tl_takeWhileEnd p = (L.reverse . L.takeWhile p . L.reverse) `eqP`
522− (unpackS . TL.takeWhileEnd p)
523−s_dropWhile p = L.dropWhile p `eqP` (unpackS . S.dropWhile p)
524−s_dropWhile_s p = L.dropWhile p `eqP` (unpackS . S.unstream . S.dropWhile p)
525−sf_dropWhile q p = (L.dropWhile p . L.filter q) `eqP`
526− (unpackS . S.dropWhile p . S.filter q)
527−t_dropWhile p = L.dropWhile p `eqP` (unpackS . T.dropWhile p)
528−tl_dropWhile p = L.dropWhile p `eqP` (unpackS . S.dropWhile p)
529−t_dropWhileEnd p = (L.reverse . L.dropWhile p . L.reverse) `eqP`
530− (unpackS . T.dropWhileEnd p)
531−tl_dropWhileEnd p = (L.reverse . L.dropWhile p . L.reverse) `eqP`
532− (unpackS . TL.dropWhileEnd p)
533−t_dropAround p = (L.dropWhile p . L.reverse . L.dropWhile p . L.reverse)
534− `eqP` (unpackS . T.dropAround p)
535−tl_dropAround p = (L.dropWhile p . L.reverse . L.dropWhile p . L.reverse)
536− `eqP` (unpackS . TL.dropAround p)
537−t_stripStart = T.dropWhile isSpace `eq` T.stripStart
538−tl_stripStart = TL.dropWhile isSpace `eq` TL.stripStart
539−t_stripEnd = T.dropWhileEnd isSpace `eq` T.stripEnd
540−tl_stripEnd = TL.dropWhileEnd isSpace `eq` TL.stripEnd
541−t_strip = T.dropAround isSpace `eq` T.strip
542−tl_strip = TL.dropAround isSpace `eq` TL.strip
543−t_splitAt n = L.splitAt n `eqP` (unpack2 . T.splitAt n)
544−tl_splitAt n = L.splitAt n `eqP` (unpack2 . TL.splitAt (fromIntegral n))
545−t_span p = L.span p `eqP` (unpack2 . T.span p)
546−tl_span p = L.span p `eqP` (unpack2 . TL.span p)
547−
548−t_breakOn_id s = squid `eq` (uncurry T.append . T.breakOn s)
549− where squid t | T.null s = error "empty"
550− | otherwise = t
551−tl_breakOn_id s = squid `eq` (uncurry TL.append . TL.breakOn s)
552− where squid t | TL.null s = error "empty"
553− | otherwise = t
554−t_breakOn_start (NotEmpty s) t =
555− let (k,m) = T.breakOn s t
556− in k `T.isPrefixOf` t && (T.null m || s `T.isPrefixOf` m)
557−tl_breakOn_start (NotEmpty s) t =
558− let (k,m) = TL.breakOn s t
559− in k `TL.isPrefixOf` t && TL.null m || s `TL.isPrefixOf` m
560−t_breakOnEnd_end (NotEmpty s) t =
561− let (m,k) = T.breakOnEnd s t
562− in k `T.isSuffixOf` t && (T.null m || s `T.isSuffixOf` m)
563−tl_breakOnEnd_end (NotEmpty s) t =
564− let (m,k) = TL.breakOnEnd s t
565− in k `TL.isSuffixOf` t && (TL.null m || s `TL.isSuffixOf` m)
566−t_break p = L.break p `eqP` (unpack2 . T.break p)
567−tl_break p = L.break p `eqP` (unpack2 . TL.break p)
568−t_group = L.group `eqP` (map unpackS . T.group)
569−tl_group = L.group `eqP` (map unpackS . TL.group)
570−t_groupBy p = L.groupBy p `eqP` (map unpackS . T.groupBy p)
571−tl_groupBy p = L.groupBy p `eqP` (map unpackS . TL.groupBy p)
572−t_inits = L.inits `eqP` (map unpackS . T.inits)
573−tl_inits = L.inits `eqP` (map unpackS . TL.inits)
574−t_tails = L.tails `eqP` (map unpackS . T.tails)
575−tl_tails = unsquare $
576− L.tails `eqP` (map unpackS . TL.tails)
577−t_findAppendId = unsquare $ \(NotEmpty s) ts ->
578− let t = T.intercalate s ts
579− in all (==t) $ map (uncurry T.append) (T.breakOnAll s t)
580−tl_findAppendId = unsquare $ \(NotEmpty s) ts ->
581− let t = TL.intercalate s ts
582− in all (==t) $ map (uncurry TL.append) (TL.breakOnAll s t)
583−t_findContains = unsquare $ \(NotEmpty s) ->
584− all (T.isPrefixOf s . snd) . T.breakOnAll s . T.intercalate s
585−tl_findContains = unsquare $ \(NotEmpty s) -> all (TL.isPrefixOf s . snd) .
586− TL.breakOnAll s . TL.intercalate s
587−sl_filterCount c = (L.genericLength . L.filter (==c)) `eqP` SL.countChar c
588−t_findCount s = (L.length . T.breakOnAll s) `eq` T.count s
589−tl_findCount s = (L.genericLength . TL.breakOnAll s) `eq` TL.count s
590−
591−t_splitOn_split s = unsquare $
592− (T.splitOn s `eq` Slow.splitOn s) . T.intercalate s
593−tl_splitOn_split s = unsquare $
594− ((TL.splitOn (TL.fromStrict s) . TL.fromStrict) `eq`
595− (map TL.fromStrict . T.splitOn s)) . T.intercalate s
596−t_splitOn_i (NotEmpty t) = id `eq` (T.intercalate t . T.splitOn t)
597−tl_splitOn_i (NotEmpty t) = id `eq` (TL.intercalate t . TL.splitOn t)
598−
599−t_split p = split p `eqP` (map unpackS . T.split p)
600−t_split_count c = (L.length . T.split (==c)) `eq`
601− ((1+) . T.count (T.singleton c))
602−t_split_splitOn c = T.split (==c) `eq` T.splitOn (T.singleton c)
603−tl_split p = split p `eqP` (map unpackS . TL.split p)
604−
605−split :: (a -> Bool) -> [a] -> [[a]]
606−split _ [] = [[]]
607−split p xs = loop xs
608− where loop s | null s' = [l]
609− | otherwise = l : loop (tail s')
610− where (l, s') = break p s
611−
612−t_chunksOf_same_lengths k = all ((==k) . T.length) . ini . T.chunksOf k
613− where ini [] = []
614− ini xs = init xs
615−
616−t_chunksOf_length k t = len == T.length t || (k <= 0 && len == 0)
617− where len = L.sum . L.map T.length $ T.chunksOf k t
618−
619−tl_chunksOf k = T.chunksOf k `eq` (map (T.concat . TL.toChunks) .
620− TL.chunksOf (fromIntegral k) . TL.fromStrict)
621−
622−t_lines = L.lines `eqP` (map unpackS . T.lines)
623−tl_lines = L.lines `eqP` (map unpackS . TL.lines)
624−{-
625−t_lines' = lines' `eqP` (map unpackS . T.lines')
626− where lines' "" = []
627− lines' s = let (l, s') = break eol s
628− in l : case s' of
629− [] -> []
630− ('\r':'\n':s'') -> lines' s''
631− (_:s'') -> lines' s''
632− eol c = c == '\r' || c == '\n'
633−-}
634−t_words = L.words `eqP` (map unpackS . T.words)
635−
636−tl_words = L.words `eqP` (map unpackS . TL.words)
637−t_unlines = unsquare $
638− L.unlines `eq` (unpackS . T.unlines . map packS)
639−tl_unlines = unsquare $
640− L.unlines `eq` (unpackS . TL.unlines . map packS)
641−t_unwords = unsquare $
642− L.unwords `eq` (unpackS . T.unwords . map packS)
643−tl_unwords = unsquare $
644− L.unwords `eq` (unpackS . TL.unwords . map packS)
645−
646−s_isPrefixOf s = L.isPrefixOf s `eqP`
647− (S.isPrefixOf (S.stream $ packS s) . S.stream)
648−sf_isPrefixOf p s = (L.isPrefixOf s . L.filter p) `eqP`
649− (S.isPrefixOf (S.stream $ packS s) . S.filter p . S.stream)
650−t_isPrefixOf s = L.isPrefixOf s`eqP` T.isPrefixOf (packS s)
651−tl_isPrefixOf s = L.isPrefixOf s`eqP` TL.isPrefixOf (packS s)
652−t_isSuffixOf s = L.isSuffixOf s`eqP` T.isSuffixOf (packS s)
653−tl_isSuffixOf s = L.isSuffixOf s`eqP` TL.isSuffixOf (packS s)
654−t_isInfixOf s = L.isInfixOf s `eqP` T.isInfixOf (packS s)
655−tl_isInfixOf s = L.isInfixOf s `eqP` TL.isInfixOf (packS s)
656−
657−t_stripPrefix s = (fmap packS . L.stripPrefix s) `eqP` T.stripPrefix (packS s)
658−tl_stripPrefix s = (fmap packS . L.stripPrefix s) `eqP` TL.stripPrefix (packS s)
659−
660−stripSuffix p t = reverse `fmap` L.stripPrefix (reverse p) (reverse t)
661−
662−t_stripSuffix s = (fmap packS . stripSuffix s) `eqP` T.stripSuffix (packS s)
663−tl_stripSuffix s = (fmap packS . stripSuffix s) `eqP` TL.stripSuffix (packS s)
664−
665−commonPrefixes a0@(_:_) b0@(_:_) = Just (go a0 b0 [])
666− where go (a:as) (b:bs) ps
667− | a == b = go as bs (a:ps)
668− go as bs ps = (reverse ps,as,bs)
669−commonPrefixes _ _ = Nothing
670−
671−t_commonPrefixes a b (NonEmpty p)
672− = commonPrefixes pa pb ==
673− repack `fmap` T.commonPrefixes (packS pa) (packS pb)
674− where repack (x,y,z) = (unpackS x,unpackS y,unpackS z)
675− pa = p ++ a
676− pb = p ++ b
677−
678−tl_commonPrefixes a b (NonEmpty p)
679− = commonPrefixes pa pb ==
680− repack `fmap` TL.commonPrefixes (packS pa) (packS pb)
681− where repack (x,y,z) = (unpackS x,unpackS y,unpackS z)
682− pa = p ++ a
683− pb = p ++ b
684−
685−sf_elem p c = (L.elem c . L.filter p) `eqP` (S.elem c . S.filter p)
686−sf_filter q p = (L.filter p . L.filter q) `eqP`
687− (unpackS . S.filter p . S.filter q)
688−t_filter p = L.filter p `eqP` (unpackS . T.filter p)
689−tl_filter p = L.filter p `eqP` (unpackS . TL.filter p)
690−sf_findBy q p = (L.find p . L.filter q) `eqP` (S.findBy p . S.filter q)
691−t_find p = L.find p `eqP` T.find p
692−tl_find p = L.find p `eqP` TL.find p
693−t_partition p = L.partition p `eqP` (unpack2 . T.partition p)
694−tl_partition p = L.partition p `eqP` (unpack2 . TL.partition p)
695−
696−sf_index p s = forAll (choose (-l,l*2))
697− ((L.filter p s L.!!) `eq` S.index (S.filter p $ packS s))
698− where l = L.length s
699−t_index s = forAll (choose (-l,l*2)) ((s L.!!) `eq` T.index (packS s))
700− where l = L.length s
701−
702−tl_index s = forAll (choose (-l,l*2))
703− ((s L.!!) `eq` (TL.index (packS s) . fromIntegral))
704− where l = L.length s
705−
706−t_findIndex p = L.findIndex p `eqP` T.findIndex p
707−t_count (NotEmpty t) = (subtract 1 . L.length . T.splitOn t) `eq` T.count t
708−tl_count (NotEmpty t) = (subtract 1 . L.genericLength . TL.splitOn t) `eq`
709− TL.count t
710−t_zip s = L.zip s `eqP` T.zip (packS s)
711−tl_zip s = L.zip s `eqP` TL.zip (packS s)
712−sf_zipWith p c s = (L.zipWith c (L.filter p s) . L.filter p) `eqP`
713− (unpackS . S.zipWith c (S.filter p $ packS s) . S.filter p)
714−t_zipWith c s = L.zipWith c s `eqP` (unpackS . T.zipWith c (packS s))
715−tl_zipWith c s = L.zipWith c s `eqP` (unpackS . TL.zipWith c (packS s))
716−
717−t_indices (NotEmpty s) = Slow.indices s `eq` indices s
718−tl_indices (NotEmpty s) = lazyIndices s `eq` S.indices s
719− where lazyIndices ss t = map fromIntegral $ Slow.indices (conc ss) (conc t)
720− conc = T.concat . TL.toChunks
721−t_indices_occurs = unsquare $ \(NotEmpty t) ts ->
722− let s = T.intercalate t ts
723− in Slow.indices t s == indices t s
724−
725−-- Bit shifts.
726−shiftL w = forAll (choose (0,width-1)) $ \k -> Bits.shiftL w k == U.shiftL w k
727− where width = round (log (fromIntegral m) / log 2 :: Double)
728− (m,_) = (maxBound, m == w)
729−shiftR w = forAll (choose (0,width-1)) $ \k -> Bits.shiftR w k == U.shiftR w k
730− where width = round (log (fromIntegral m) / log 2 :: Double)
731− (m,_) = (maxBound, m == w)
732−
733−shiftL_Int = shiftL :: Int -> Property
734−shiftL_Word16 = shiftL :: Word16 -> Property
735−shiftL_Word32 = shiftL :: Word32 -> Property
736−shiftR_Int = shiftR :: Int -> Property
737−shiftR_Word16 = shiftR :: Word16 -> Property
738−shiftR_Word32 = shiftR :: Word32 -> Property
739−
740−-- Builder.
741−
742−tb_singleton = id `eqP`
743− (unpackS . TB.toLazyText . mconcat . map TB.singleton)
744−tb_fromText = L.concat `eq` (unpackS . TB.toLazyText . mconcat .
745− map (TB.fromText . packS))
746−tb_associative s1 s2 s3 =
747− TB.toLazyText (b1 `mappend` (b2 `mappend` b3)) ==
748− TB.toLazyText ((b1 `mappend` b2) `mappend` b3)
749− where b1 = TB.fromText (packS s1)
750− b2 = TB.fromText (packS s2)
751− b3 = TB.fromText (packS s3)
752−
753−-- Numeric builder stuff.
754−
755−tb_decimal :: (Integral a, Show a) => a -> Bool
756−tb_decimal = (TB.toLazyText . TB.decimal) `eq` (TL.pack . show)
757−
758−tb_decimal_integer (a::Integer) = tb_decimal a
759−tb_decimal_integer_big (Big a) = tb_decimal a
760−tb_decimal_int (a::Int) = tb_decimal a
761−tb_decimal_int8 (a::Int8) = tb_decimal a
762−tb_decimal_int16 (a::Int16) = tb_decimal a
763−tb_decimal_int32 (a::Int32) = tb_decimal a
764−tb_decimal_int64 (a::Int64) = tb_decimal a
765−tb_decimal_word (a::Word) = tb_decimal a
766−tb_decimal_word8 (a::Word8) = tb_decimal a
767−tb_decimal_word16 (a::Word16) = tb_decimal a
768−tb_decimal_word32 (a::Word32) = tb_decimal a
769−tb_decimal_word64 (a::Word64) = tb_decimal a
770−
771−tb_decimal_big_int (BigBounded (a::Int)) = tb_decimal a
772−tb_decimal_big_int64 (BigBounded (a::Int64)) = tb_decimal a
773−tb_decimal_big_word (BigBounded (a::Word)) = tb_decimal a
774−tb_decimal_big_word64 (BigBounded (a::Word64)) = tb_decimal a
775−
776−tb_hex :: (Integral a, Show a) => a -> Bool
777−tb_hex = (TB.toLazyText . TB.hexadecimal) `eq` (TL.pack . flip showHex "")
778−
779−tb_hexadecimal_integer (a::Integer) = tb_hex a
780−tb_hexadecimal_int (a::Int) = tb_hex a
781−tb_hexadecimal_int8 (a::Int8) = tb_hex a
782−tb_hexadecimal_int16 (a::Int16) = tb_hex a
783−tb_hexadecimal_int32 (a::Int32) = tb_hex a
784−tb_hexadecimal_int64 (a::Int64) = tb_hex a
785−tb_hexadecimal_word (a::Word) = tb_hex a
786−tb_hexadecimal_word8 (a::Word8) = tb_hex a
787−tb_hexadecimal_word16 (a::Word16) = tb_hex a
788−tb_hexadecimal_word32 (a::Word32) = tb_hex a
789−tb_hexadecimal_word64 (a::Word64) = tb_hex a
790−
791−tb_realfloat :: (RealFloat a, Show a) => a -> Bool
792−tb_realfloat = (TB.toLazyText . TB.realFloat) `eq` (TL.pack . show)
793−
794−tb_realfloat_float (a::Float) = tb_realfloat a
795−tb_realfloat_double (a::Double) = tb_realfloat a
796−
797−showFloat :: (RealFloat a) => TB.FPFormat -> Maybe Int -> a -> ShowS
798−showFloat TB.Exponent = showEFloat
799−showFloat TB.Fixed = showFFloat
800−showFloat TB.Generic = showGFloat
801−
802−tb_formatRealFloat :: (RealFloat a, Show a) =>
803− a -> TB.FPFormat -> Precision a -> Property
804−tb_formatRealFloat a fmt prec =
805− TB.formatRealFloat fmt p a ===
806− TB.fromString (showFloat fmt p a "")
807− where p = precision a prec
808−
809−tb_formatRealFloat_float (a::Float) = tb_formatRealFloat a
810−tb_formatRealFloat_double (a::Double) = tb_formatRealFloat a
811−
812−-- Reading.
813−
814−t_decimal (n::Int) s =
815− T.signed T.decimal (T.pack (show n) `T.append` t) == Right (n,t)
816− where t = T.dropWhile isDigit s
817−tl_decimal (n::Int) s =
818− TL.signed TL.decimal (TL.pack (show n) `TL.append` t) == Right (n,t)
819− where t = TL.dropWhile isDigit s
820−t_hexadecimal m s ox =
821− T.hexadecimal (T.concat [p, T.pack (showHex n ""), t]) == Right (n,t)
822− where t = T.dropWhile isHexDigit s
823− p = if ox then "0x" else ""
824− n = getPositive m :: Int
825−tl_hexadecimal m s ox =
826− TL.hexadecimal (TL.concat [p, TL.pack (showHex n ""), t]) == Right (n,t)
827− where t = TL.dropWhile isHexDigit s
828− p = if ox then "0x" else ""
829− n = getPositive m :: Int
830−
831−isFloaty c = c `elem` ("+-.0123456789eE" :: String)
832−
833−t_read_rational p tol (n::Double) s =
834− case p (T.pack (show n) `T.append` t) of
835− Left _err -> False
836− Right (n',t') -> t == t' && abs (n-n') <= tol
837− where t = T.dropWhile isFloaty s
838−
839−tl_read_rational p tol (n::Double) s =
840− case p (TL.pack (show n) `TL.append` t) of
841− Left _err -> False
842− Right (n',t') -> t == t' && abs (n-n') <= tol
843− where t = TL.dropWhile isFloaty s
844−
845−t_double = t_read_rational T.double 1e-13
846−tl_double = tl_read_rational TL.double 1e-13
847−t_rational = t_read_rational T.rational 1e-16
848−tl_rational = tl_read_rational TL.rational 1e-16
849−
850−-- Input and output.
851−
852−t_put_get = write_read T.unlines T.filter put get
853− where put h = withRedirect h IO.stdout . T.putStr
854− get h = withRedirect h IO.stdin T.getContents
855−tl_put_get = write_read TL.unlines TL.filter put get
856− where put h = withRedirect h IO.stdout . TL.putStr
857− get h = withRedirect h IO.stdin TL.getContents
858−t_write_read = write_read T.unlines T.filter T.hPutStr T.hGetContents
859−tl_write_read = write_read TL.unlines TL.filter TL.hPutStr TL.hGetContents
860−
861−t_write_read_line e m b t = write_read head T.filter T.hPutStrLn
862− T.hGetLine e m b [t]
863−tl_write_read_line e m b t = write_read head TL.filter TL.hPutStrLn
864− TL.hGetLine e m b [t]
865−
866−-- Low-level.
867−
868−t_dropWord16 m t = dropWord16 m t `T.isSuffixOf` t
869−t_takeWord16 m t = takeWord16 m t `T.isPrefixOf` t
870−t_take_drop_16 m t = T.append (takeWord16 n t) (dropWord16 n t) == t
871− where n = small m
872−t_use_from t = monadicIO $ assert . (==t) =<< run (useAsPtr t fromPtr)
873−
874−t_copy t = T.copy t == t
875−
876−-- Regression tests.
877−s_filter_eq s = S.filter p t == S.streamList (filter p s)
878− where p = (/= S.last t)
879− t = S.streamList s
880−
881−-- Make a stream appear shorter than it really is, to ensure that
882−-- functions that consume inaccurately sized streams behave
883−-- themselves.
884−shorten :: Int -> S.Stream a -> S.Stream a
885−shorten n t@(S.Stream arr off len)
886− | n > 0 = S.Stream arr off (smaller (exactSize n) len)
887− | otherwise = t
888−
889−tests :: Test
890−tests =
891− testGroup "Properties" [
892− testGroup "creation/elimination" [
893− testProperty "t_pack_unpack" t_pack_unpack,
894− testProperty "tl_pack_unpack" tl_pack_unpack,
895− testProperty "t_stream_unstream" t_stream_unstream,
896− testProperty "tl_stream_unstream" tl_stream_unstream,
897− testProperty "t_reverse_stream" t_reverse_stream,
898− testProperty "t_singleton" t_singleton,
899− testProperty "tl_singleton" tl_singleton,
900− testProperty "tl_unstreamChunks" tl_unstreamChunks,
901− testProperty "tl_chunk_unchunk" tl_chunk_unchunk,
902− testProperty "tl_from_to_strict" tl_from_to_strict
903− ],
904−
905− testGroup "transcoding" [
906− testProperty "t_ascii" t_ascii,
907− testProperty "tl_ascii" tl_ascii,
908− testProperty "t_latin1" t_latin1,
909− testProperty "tl_latin1" tl_latin1,
910− testProperty "t_utf8" t_utf8,
911− testProperty "t_utf8'" t_utf8',
912− testProperty "t_utf8_incr" t_utf8_incr,
913− testProperty "t_utf8_undecoded" t_utf8_undecoded,
914− testProperty "tl_utf8" tl_utf8,
915− testProperty "tl_utf8'" tl_utf8',
916− testProperty "t_utf16LE" t_utf16LE,
917− testProperty "tl_utf16LE" tl_utf16LE,
918− testProperty "t_utf16BE" t_utf16BE,
919− testProperty "tl_utf16BE" tl_utf16BE,
920− testProperty "t_utf32LE" t_utf32LE,
921− testProperty "tl_utf32LE" tl_utf32LE,
922− testProperty "t_utf32BE" t_utf32BE,
923− testProperty "tl_utf32BE" tl_utf32BE,
924− testGroup "errors" [
925− testProperty "t_utf8_err" t_utf8_err,
926− testProperty "t_utf8_err'" t_utf8_err'
927− ]
928− ],
929−
930− testGroup "instances" [
931− testProperty "s_Eq" s_Eq,
932− testProperty "sf_Eq" sf_Eq,
933− testProperty "t_Eq" t_Eq,
934− testProperty "tl_Eq" tl_Eq,
935− testProperty "s_Ord" s_Ord,
936− testProperty "sf_Ord" sf_Ord,
937− testProperty "t_Ord" t_Ord,
938− testProperty "tl_Ord" tl_Ord,
939− testProperty "t_Read" t_Read,
940− testProperty "tl_Read" tl_Read,
941− testProperty "t_Show" t_Show,
942− testProperty "tl_Show" tl_Show,
943− testProperty "t_mappend" t_mappend,
944− testProperty "tl_mappend" tl_mappend,
945− testProperty "t_mconcat" t_mconcat,
946− testProperty "tl_mconcat" tl_mconcat,
947− testProperty "t_mempty" t_mempty,
948− testProperty "tl_mempty" tl_mempty,
949− testProperty "t_IsString" t_IsString,
950− testProperty "tl_IsString" tl_IsString
951− ],
952−
953− testGroup "basics" [
954− testProperty "s_cons" s_cons,
955− testProperty "s_cons_s" s_cons_s,
956− testProperty "sf_cons" sf_cons,
957− testProperty "t_cons" t_cons,
958− testProperty "tl_cons" tl_cons,
959− testProperty "s_snoc" s_snoc,
960− testProperty "t_snoc" t_snoc,
961− testProperty "tl_snoc" tl_snoc,
962− testProperty "s_append" s_append,
963− testProperty "s_append_s" s_append_s,
964− testProperty "sf_append" sf_append,
965− testProperty "t_append" t_append,
966− testProperty "s_uncons" s_uncons,
967− testProperty "sf_uncons" sf_uncons,
968− testProperty "t_uncons" t_uncons,
969− testProperty "tl_uncons" tl_uncons,
970− testProperty "s_head" s_head,
971− testProperty "sf_head" sf_head,
972− testProperty "t_head" t_head,
973− testProperty "tl_head" tl_head,
974− testProperty "s_last" s_last,
975− testProperty "sf_last" sf_last,
976− testProperty "t_last" t_last,
977− testProperty "tl_last" tl_last,
978− testProperty "s_tail" s_tail,
979− testProperty "s_tail_s" s_tail_s,
980− testProperty "sf_tail" sf_tail,
981− testProperty "t_tail" t_tail,
982− testProperty "tl_tail" tl_tail,
983− testProperty "s_init" s_init,
984− testProperty "s_init_s" s_init_s,
985− testProperty "sf_init" sf_init,
986− testProperty "t_init" t_init,
987− testProperty "tl_init" tl_init,
988− testProperty "s_null" s_null,
989− testProperty "sf_null" sf_null,
990− testProperty "t_null" t_null,
991− testProperty "tl_null" tl_null,
992− testProperty "s_length" s_length,
993− testProperty "sf_length" sf_length,
994− testProperty "sl_length" sl_length,
995− testProperty "t_length" t_length,
996− testProperty "tl_length" tl_length,
997− testProperty "t_compareLength" t_compareLength,
998− testProperty "tl_compareLength" tl_compareLength
999− ],
1000−
1001− testGroup "transformations" [
1002− testProperty "s_map" s_map,
1003− testProperty "s_map_s" s_map_s,
1004− testProperty "sf_map" sf_map,
1005− testProperty "t_map" t_map,
1006− testProperty "tl_map" tl_map,
1007− testProperty "s_intercalate" s_intercalate,
1008− testProperty "t_intercalate" t_intercalate,
1009− testProperty "tl_intercalate" tl_intercalate,
1010− testProperty "s_intersperse" s_intersperse,
1011− testProperty "s_intersperse_s" s_intersperse_s,
1012− testProperty "sf_intersperse" sf_intersperse,
1013− testProperty "t_intersperse" t_intersperse,
1014− testProperty "tl_intersperse" tl_intersperse,
1015− testProperty "t_transpose" t_transpose,
1016− testProperty "tl_transpose" tl_transpose,
1017− testProperty "t_reverse" t_reverse,
1018− testProperty "tl_reverse" tl_reverse,
1019− testProperty "t_reverse_short" t_reverse_short,
1020− testProperty "t_replace" t_replace,
1021− testProperty "tl_replace" tl_replace,
1022−
1023− testGroup "case conversion" [
1024− testProperty "s_toCaseFold_length" s_toCaseFold_length,
1025− testProperty "sf_toCaseFold_length" sf_toCaseFold_length,
1026− testProperty "t_toCaseFold_length" t_toCaseFold_length,
1027− testProperty "tl_toCaseFold_length" tl_toCaseFold_length,
1028− testProperty "t_toLower_length" t_toLower_length,
1029− testProperty "t_toLower_lower" t_toLower_lower,
1030− testProperty "tl_toLower_lower" tl_toLower_lower,
1031− testProperty "t_toUpper_length" t_toUpper_length,
1032− testProperty "t_toUpper_upper" t_toUpper_upper,
1033− testProperty "tl_toUpper_upper" tl_toUpper_upper
1034− ],
1035−
1036− testGroup "justification" [
1037− testProperty "s_justifyLeft" s_justifyLeft,
1038− testProperty "s_justifyLeft_s" s_justifyLeft_s,
1039− testProperty "sf_justifyLeft" sf_justifyLeft,
1040− testProperty "t_justifyLeft" t_justifyLeft,
1041− testProperty "tl_justifyLeft" tl_justifyLeft,
1042− testProperty "t_justifyRight" t_justifyRight,
1043− testProperty "tl_justifyRight" tl_justifyRight,
1044− testProperty "t_center" t_center,
1045− testProperty "tl_center" tl_center
1046− ]
1047− ],
1048−
1049− testGroup "folds" [
1050− testProperty "sf_foldl" sf_foldl,
1051− testProperty "t_foldl" t_foldl,
1052− testProperty "tl_foldl" tl_foldl,
1053− testProperty "sf_foldl'" sf_foldl',
1054− testProperty "t_foldl'" t_foldl',
1055− testProperty "tl_foldl'" tl_foldl',
1056− testProperty "sf_foldl1" sf_foldl1,
1057− testProperty "t_foldl1" t_foldl1,
1058− testProperty "tl_foldl1" tl_foldl1,
1059− testProperty "t_foldl1'" t_foldl1',
1060− testProperty "sf_foldl1'" sf_foldl1',
1061− testProperty "tl_foldl1'" tl_foldl1',
1062− testProperty "sf_foldr" sf_foldr,
1063− testProperty "t_foldr" t_foldr,
1064− testProperty "tl_foldr" tl_foldr,
1065− testProperty "sf_foldr1" sf_foldr1,
1066− testProperty "t_foldr1" t_foldr1,
1067− testProperty "tl_foldr1" tl_foldr1,
1068−
1069− testGroup "special" [
1070− testProperty "s_concat_s" s_concat_s,
1071− testProperty "sf_concat" sf_concat,
1072− testProperty "t_concat" t_concat,
1073− testProperty "tl_concat" tl_concat,
1074− testProperty "sf_concatMap" sf_concatMap,
1075− testProperty "t_concatMap" t_concatMap,
1076− testProperty "tl_concatMap" tl_concatMap,
1077− testProperty "sf_any" sf_any,
1078− testProperty "t_any" t_any,
1079− testProperty "tl_any" tl_any,
1080− testProperty "sf_all" sf_all,
1081− testProperty "t_all" t_all,
1082− testProperty "tl_all" tl_all,
1083− testProperty "sf_maximum" sf_maximum,
1084− testProperty "t_maximum" t_maximum,
1085− testProperty "tl_maximum" tl_maximum,
1086− testProperty "sf_minimum" sf_minimum,
1087− testProperty "t_minimum" t_minimum,
1088− testProperty "tl_minimum" tl_minimum
1089− ]
1090− ],
1091−
1092− testGroup "construction" [
1093− testGroup "scans" [
1094− testProperty "sf_scanl" sf_scanl,
1095− testProperty "t_scanl" t_scanl,
1096− testProperty "tl_scanl" tl_scanl,
1097− testProperty "t_scanl1" t_scanl1,
1098− testProperty "tl_scanl1" tl_scanl1,
1099− testProperty "t_scanr" t_scanr,
1100− testProperty "tl_scanr" tl_scanr,
1101− testProperty "t_scanr1" t_scanr1,
1102− testProperty "tl_scanr1" tl_scanr1
1103− ],
1104−
1105− testGroup "mapAccum" [
1106− testProperty "t_mapAccumL" t_mapAccumL,
1107− testProperty "tl_mapAccumL" tl_mapAccumL,
1108− testProperty "t_mapAccumR" t_mapAccumR,
1109− testProperty "tl_mapAccumR" tl_mapAccumR
1110− ],
1111−
1112− testGroup "unfolds" [
1113− testProperty "tl_repeat" tl_repeat,
1114− testProperty "s_replicate" s_replicate,
1115− testProperty "t_replicate" t_replicate,
1116− testProperty "tl_replicate" tl_replicate,
1117− testProperty "tl_cycle" tl_cycle,
1118− testProperty "tl_iterate" tl_iterate,
1119− testProperty "t_unfoldr" t_unfoldr,
1120− testProperty "tl_unfoldr" tl_unfoldr,
1121− testProperty "t_unfoldrN" t_unfoldrN,
1122− testProperty "tl_unfoldrN" tl_unfoldrN
1123− ]
1124− ],
1125−
1126− testGroup "substrings" [
1127− testGroup "breaking" [
1128− testProperty "s_take" s_take,
1129− testProperty "s_take_s" s_take_s,
1130− testProperty "sf_take" sf_take,
1131− testProperty "t_take" t_take,
1132− testProperty "t_takeEnd" t_takeEnd,
1133− testProperty "tl_take" tl_take,
1134− testProperty "tl_takeEnd" tl_takeEnd,
1135− testProperty "s_drop" s_drop,
1136− testProperty "s_drop_s" s_drop_s,
1137− testProperty "sf_drop" sf_drop,
1138− testProperty "t_drop" t_drop,
1139− testProperty "t_dropEnd" t_dropEnd,
1140− testProperty "tl_drop" tl_drop,
1141− testProperty "tl_dropEnd" tl_dropEnd,
1142− testProperty "s_take_drop" s_take_drop,
1143− testProperty "s_take_drop_s" s_take_drop_s,
1144− testProperty "s_takeWhile" s_takeWhile,
1145− testProperty "s_takeWhile_s" s_takeWhile_s,
1146− testProperty "sf_takeWhile" sf_takeWhile,
1147− testProperty "t_takeWhile" t_takeWhile,
1148− testProperty "tl_takeWhile" tl_takeWhile,
1149− testProperty "t_takeWhileEnd" t_takeWhileEnd,
1150− testProperty "tl_takeWhileEnd" tl_takeWhileEnd,
1151− testProperty "sf_dropWhile" sf_dropWhile,
1152− testProperty "s_dropWhile" s_dropWhile,
1153− testProperty "s_dropWhile_s" s_dropWhile_s,
1154− testProperty "t_dropWhile" t_dropWhile,
1155− testProperty "tl_dropWhile" tl_dropWhile,
1156− testProperty "t_dropWhileEnd" t_dropWhileEnd,
1157− testProperty "tl_dropWhileEnd" tl_dropWhileEnd,
1158− testProperty "t_dropAround" t_dropAround,
1159− testProperty "tl_dropAround" tl_dropAround,
1160− testProperty "t_stripStart" t_stripStart,
1161− testProperty "tl_stripStart" tl_stripStart,
1162− testProperty "t_stripEnd" t_stripEnd,
1163− testProperty "tl_stripEnd" tl_stripEnd,
1164− testProperty "t_strip" t_strip,
1165− testProperty "tl_strip" tl_strip,
1166− testProperty "t_splitAt" t_splitAt,
1167− testProperty "tl_splitAt" tl_splitAt,
1168− testProperty "t_span" t_span,
1169− testProperty "tl_span" tl_span,
1170− testProperty "t_breakOn_id" t_breakOn_id,
1171− testProperty "tl_breakOn_id" tl_breakOn_id,
1172− testProperty "t_breakOn_start" t_breakOn_start,
1173− testProperty "tl_breakOn_start" tl_breakOn_start,
1174− testProperty "t_breakOnEnd_end" t_breakOnEnd_end,
1175− testProperty "tl_breakOnEnd_end" tl_breakOnEnd_end,
1176− testProperty "t_break" t_break,
1177− testProperty "tl_break" tl_break,
1178− testProperty "t_group" t_group,
1179− testProperty "tl_group" tl_group,
1180− testProperty "t_groupBy" t_groupBy,
1181− testProperty "tl_groupBy" tl_groupBy,
1182− testProperty "t_inits" t_inits,
1183− testProperty "tl_inits" tl_inits,
1184− testProperty "t_tails" t_tails,
1185− testProperty "tl_tails" tl_tails
1186− ],
1187−
1188− testGroup "breaking many" [
1189− testProperty "t_findAppendId" t_findAppendId,
1190− testProperty "tl_findAppendId" tl_findAppendId,
1191− testProperty "t_findContains" t_findContains,
1192− testProperty "tl_findContains" tl_findContains,
1193− testProperty "sl_filterCount" sl_filterCount,
1194− testProperty "t_findCount" t_findCount,
1195− testProperty "tl_findCount" tl_findCount,
1196− testProperty "t_splitOn_split" t_splitOn_split,
1197− testProperty "tl_splitOn_split" tl_splitOn_split,
1198− testProperty "t_splitOn_i" t_splitOn_i,
1199− testProperty "tl_splitOn_i" tl_splitOn_i,
1200− testProperty "t_split" t_split,
1201− testProperty "t_split_count" t_split_count,
1202− testProperty "t_split_splitOn" t_split_splitOn,
1203− testProperty "tl_split" tl_split,
1204− testProperty "t_chunksOf_same_lengths" t_chunksOf_same_lengths,
1205− testProperty "t_chunksOf_length" t_chunksOf_length,
1206− testProperty "tl_chunksOf" tl_chunksOf
1207− ],
1208−
1209− testGroup "lines and words" [
1210− testProperty "t_lines" t_lines,
1211− testProperty "tl_lines" tl_lines,
1212− --testProperty "t_lines'" t_lines',
1213− testProperty "t_words" t_words,
1214− testProperty "tl_words" tl_words,
1215− testProperty "t_unlines" t_unlines,
1216− testProperty "tl_unlines" tl_unlines,
1217− testProperty "t_unwords" t_unwords,
1218− testProperty "tl_unwords" tl_unwords
1219− ]
1220− ],
1221−
1222− testGroup "predicates" [
1223− testProperty "s_isPrefixOf" s_isPrefixOf,
1224− testProperty "sf_isPrefixOf" sf_isPrefixOf,
1225− testProperty "t_isPrefixOf" t_isPrefixOf,
1226− testProperty "tl_isPrefixOf" tl_isPrefixOf,
1227− testProperty "t_isSuffixOf" t_isSuffixOf,
1228− testProperty "tl_isSuffixOf" tl_isSuffixOf,
1229− testProperty "t_isInfixOf" t_isInfixOf,
1230− testProperty "tl_isInfixOf" tl_isInfixOf,
1231−
1232− testGroup "view" [
1233− testProperty "t_stripPrefix" t_stripPrefix,
1234− testProperty "tl_stripPrefix" tl_stripPrefix,
1235− testProperty "t_stripSuffix" t_stripSuffix,
1236− testProperty "tl_stripSuffix" tl_stripSuffix,
1237− testProperty "t_commonPrefixes" t_commonPrefixes,
1238− testProperty "tl_commonPrefixes" tl_commonPrefixes
1239− ]
1240− ],
1241−
1242− testGroup "searching" [
1243− testProperty "sf_elem" sf_elem,
1244− testProperty "sf_filter" sf_filter,
1245− testProperty "t_filter" t_filter,
1246− testProperty "tl_filter" tl_filter,
1247− testProperty "sf_findBy" sf_findBy,
1248− testProperty "t_find" t_find,
1249− testProperty "tl_find" tl_find,
1250− testProperty "t_partition" t_partition,
1251− testProperty "tl_partition" tl_partition
1252− ],
1253−
1254− testGroup "indexing" [
1255− testProperty "sf_index" sf_index,
1256− testProperty "t_index" t_index,
1257− testProperty "tl_index" tl_index,
1258− testProperty "t_findIndex" t_findIndex,
1259− testProperty "t_count" t_count,
1260− testProperty "tl_count" tl_count,
1261− testProperty "t_indices" t_indices,
1262− testProperty "tl_indices" tl_indices,
1263− testProperty "t_indices_occurs" t_indices_occurs
1264− ],
1265−
1266− testGroup "zips" [
1267− testProperty "t_zip" t_zip,
1268− testProperty "tl_zip" tl_zip,
1269− testProperty "sf_zipWith" sf_zipWith,
1270− testProperty "t_zipWith" t_zipWith,
1271− testProperty "tl_zipWith" tl_zipWith
1272− ],
1273−
1274− testGroup "regressions" [
1275− testProperty "s_filter_eq" s_filter_eq
1276− ],
1277−
1278− testGroup "shifts" [
1279− testProperty "shiftL_Int" shiftL_Int,
1280− testProperty "shiftL_Word16" shiftL_Word16,
1281− testProperty "shiftL_Word32" shiftL_Word32,
1282− testProperty "shiftR_Int" shiftR_Int,
1283− testProperty "shiftR_Word16" shiftR_Word16,
1284− testProperty "shiftR_Word32" shiftR_Word32
1285− ],
1286−
1287− testGroup "builder" [
1288− testProperty "tb_associative" tb_associative,
1289− testGroup "decimal" [
1290− testProperty "tb_decimal_int" tb_decimal_int,
1291− testProperty "tb_decimal_int8" tb_decimal_int8,
1292− testProperty "tb_decimal_int16" tb_decimal_int16,
1293− testProperty "tb_decimal_int32" tb_decimal_int32,
1294− testProperty "tb_decimal_int64" tb_decimal_int64,
1295− testProperty "tb_decimal_integer" tb_decimal_integer,
1296− testProperty "tb_decimal_integer_big" tb_decimal_integer_big,
1297− testProperty "tb_decimal_word" tb_decimal_word,
1298− testProperty "tb_decimal_word8" tb_decimal_word8,
1299− testProperty "tb_decimal_word16" tb_decimal_word16,
1300− testProperty "tb_decimal_word32" tb_decimal_word32,
1301− testProperty "tb_decimal_word64" tb_decimal_word64,
1302− testProperty "tb_decimal_big_int" tb_decimal_big_int,
1303− testProperty "tb_decimal_big_word" tb_decimal_big_word,
1304− testProperty "tb_decimal_big_int64" tb_decimal_big_int64,
1305− testProperty "tb_decimal_big_word64" tb_decimal_big_word64
1306− ],
1307− testGroup "hexadecimal" [
1308− testProperty "tb_hexadecimal_int" tb_hexadecimal_int,
1309− testProperty "tb_hexadecimal_int8" tb_hexadecimal_int8,
1310− testProperty "tb_hexadecimal_int16" tb_hexadecimal_int16,
1311− testProperty "tb_hexadecimal_int32" tb_hexadecimal_int32,
1312− testProperty "tb_hexadecimal_int64" tb_hexadecimal_int64,
1313− testProperty "tb_hexadecimal_integer" tb_hexadecimal_integer,
1314− testProperty "tb_hexadecimal_word" tb_hexadecimal_word,
1315− testProperty "tb_hexadecimal_word8" tb_hexadecimal_word8,
1316− testProperty "tb_hexadecimal_word16" tb_hexadecimal_word16,
1317− testProperty "tb_hexadecimal_word32" tb_hexadecimal_word32,
1318− testProperty "tb_hexadecimal_word64" tb_hexadecimal_word64
1319− ],
1320− testGroup "realfloat" [
1321− testProperty "tb_realfloat_double" tb_realfloat_double,
1322− testProperty "tb_realfloat_float" tb_realfloat_float,
1323− testProperty "tb_formatRealFloat_float" tb_formatRealFloat_float,
1324− testProperty "tb_formatRealFloat_double" tb_formatRealFloat_double
1325− ],
1326− testProperty "tb_fromText" tb_fromText,
1327− testProperty "tb_singleton" tb_singleton
1328− ],
1329−
1330− testGroup "read" [
1331− testProperty "t_decimal" t_decimal,
1332− testProperty "tl_decimal" tl_decimal,
1333− testProperty "t_hexadecimal" t_hexadecimal,
1334− testProperty "tl_hexadecimal" tl_hexadecimal,
1335− testProperty "t_double" t_double,
1336− testProperty "tl_double" tl_double,
1337− testProperty "t_rational" t_rational,
1338− testProperty "tl_rational" tl_rational
1339− ],
1340−
1341− {-
1342− testGroup "input-output" [
1343− testProperty "t_write_read" t_write_read,
1344− testProperty "tl_write_read" tl_write_read,
1345− testProperty "t_write_read_line" t_write_read_line,
1346− testProperty "tl_write_read_line" tl_write_read_line
1347− -- These tests are subject to I/O race conditions when run under
1348− -- test-framework-quickcheck2.
1349− -- testProperty "t_put_get" t_put_get
1350− -- testProperty "tl_put_get" tl_put_get
1351− ],
1352− -}
1353−
1354− testGroup "lowlevel" [
1355− testProperty "t_dropWord16" t_dropWord16,
1356− testProperty "t_takeWord16" t_takeWord16,
1357− testProperty "t_take_drop_16" t_take_drop_16,
1358− testProperty "t_use_from" t_use_from,
1359− testProperty "t_copy" t_copy
1360− ],
1361−
1362− testGroup "mul" Mul.tests
1363− ]