on 103705f help sign in
streamly/test/String.hs
133 lines 4.0 kB history raw
1{-# LANGUAGE CPP #-}
2{-# LANGUAGE FlexibleContexts #-}
4module Main (main) where
6import Data.Char (ord, chr)
7import Data.Word (Word8)
8import Test.Hspec.QuickCheck
9import Test.QuickCheck
10 (Property, forAll, Gen, listOf, arbitraryUnicodeChar, arbitrary)
11import Test.QuickCheck.Monadic (run, monadicIO, assert)
13import Test.Hspec as H
15import qualified Streamly.Memory.Array as A
16import qualified Streamly.Internal.Memory.ArrayStream as AS
17import qualified Streamly.Prelude as S
18import qualified Streamly.Data.String as SS
20-- Coverage build takes too long with default number of tests
21{-
22maxTestCount :: Int
23#ifdef DEVBUILD
24maxTestCount = 100
25#else
26maxTestCount = 10
27#endif
28-}
30-- Use quickcheck-unicode instead?
31genUnicode :: Gen String
32genUnicode = listOf arbitraryUnicodeChar
34genWord8 :: Gen [Word8]
35genWord8 = listOf arbitrary
37propDecodeEncodeId :: Property
38propDecodeEncodeId =
39 forAll genUnicode $ \list ->
40 monadicIO $ do
41 let wrds = SS.encodeUtf8 $ S.fromList list
42 chrs <- S.toList $ SS.decodeUtf8 wrds
43 assert (chrs == list)
45-- XXX need to use invalid characters
46propDecodeEncodeIdLenient :: Property
47propDecodeEncodeIdLenient =
48 forAll genUnicode $ \list ->
49 monadicIO $ do
50 let wrds = SS.encodeUtf8 $ S.fromList list
51 chrs <- S.toList $ SS.decodeUtf8Lenient wrds
52 assert (chrs == list)
54propDecodeEncodeIdArrays :: Property
55propDecodeEncodeIdArrays =
56 forAll genUnicode $ \list ->
57 monadicIO $ do
58 let wrds = SS.encodeUtf8 $ S.fromList list
59 chrs <- S.toList $ SS.decodeUtf8ArraysLenient
60 (S.fold A.write wrds)
61 assert (chrs == list)
63testLines :: Property
64testLines =
65 forAll genUnicode $ \list ->
66 monadicIO $ do
67 xs <- S.toList
68 $ S.map A.toList
69 $ SS.lines
70 $ S.fromList list
71 assert (xs == lines list)
73testLinesArray :: Property
74testLinesArray =
75 forAll genWord8 $ \list ->
76 monadicIO $ do
77 xs <- S.toList
78 $ S.map A.toList
79 $ AS.splitOnSuffix 10
80 $ S.yield (A.fromList list)
81 assert (xs == map (map (fromIntegral . ord))
82 (lines (map (chr . fromIntegral) list)))
84testWords :: Property
85testWords =
86 forAll genUnicode $ \list ->
87 monadicIO $ do
88 xs <- S.toList
89 $ S.map A.toList
90 $ SS.words
91 $ S.fromList list
92 assert (xs == words list)
94testUnlines :: Property
95testUnlines =
96 forAll genUnicode $ \list ->
97 monadicIO $ do
98 xs <- S.toList
99 $ SS.unlines
100 $ SS.lines
101 $ S.fromList list
102 assert (xs == unlines (lines list))
104testUnwords :: Property
105testUnwords =
106 forAll genUnicode $ \list ->
107 monadicIO $ do
108 xs <- run
109 $ S.toList
110 $ SS.unwords
111 $ SS.words
112 $ S.fromList list
113 assert (xs == unwords (words list))
115main :: IO ()
116main = hspec
117 $ H.parallel
118 $ modifyMaxSuccess (const 1000)
119 $ do
120 describe "UTF8 - Encoding / Decoding" $ do
121 prop "decodeUtf8 . encodeUtf8 == id" $ propDecodeEncodeId
122 prop "decodeUtf8Lenient . encodeUtf8 == id" $ propDecodeEncodeIdLenient
123 prop "decodeUtf8ArraysLenient . encodeUtf8 == id"
124 $ propDecodeEncodeIdArrays
125 prop "Streamly.Data.String.lines == Prelude.lines" $ testLines
126 prop "Arrays Streamly.Data.String.lines == Prelude.lines" $ testLinesArray
127 prop "Streamly.Data.String.words == Prelude.words" $ testWords
128 prop
129 "Streamly.Data.String.unlines . Streamly.Data.String.lines == unlines . lines"
130 $ testUnlines
131 prop
132 "Streamly.Data.String.unwords . Streamly.Data.String.words == unwords . words"
133 $ testUnwords