on 52ddfee help sign in
190 lines 5.7 kB history raw
1{-# OPTIONS_GHC -Wno-deprecations #-}
3module Streamly.Test.Unicode.Stream (main) where
5import Data.Char (ord, chr)
6import Data.Word (Word8)
7import Test.QuickCheck
8 ( Property
9 , forAll
10 , Gen
11 , listOf
12 , arbitraryASCIIChar
13 , arbitraryUnicodeChar
14 , arbitrary
15 , expectFailure
16 , vectorOf
17 , choose
18 )
19import Test.QuickCheck.Monadic (run, monadicIO, assert)
21import qualified Streamly.Data.Array as A
22import qualified Streamly.Data.Stream as Stream
23import qualified Streamly.Internal.Data.Stream.Chunked as AS
24import qualified Streamly.Internal.Data.Stream as Stream
25import qualified Streamly.Unicode.Stream as SS
26import qualified Streamly.Internal.Unicode.Stream as IUS
27import qualified Streamly.Internal.Unicode.Array as IUA
28import qualified Test.Hspec as H
30import Test.Hspec.QuickCheck
32-- Coverage build takes too long with default number of tests
33{-
34maxTestCount :: Int
35#ifdef DEVBUILD
36maxTestCount = 100
37#else
38maxTestCount = 10
39#endif
40-}
42-- Use quickcheck-unicode instead?
43genUnicode :: Gen String
44genUnicode = listOf arbitraryUnicodeChar
46genWord8 :: Gen [Word8]
47genWord8 = listOf arbitrary
49propDecodeEncodeId' :: Property
50propDecodeEncodeId' =
51 forAll genUnicode $ \list ->
52 monadicIO $ do
53 let wrds = SS.encodeUtf8' $ Stream.fromList list
54 chrs <- run $ Stream.toList $ SS.decodeUtf8' wrds
55 assert (chrs == list)
57-- XXX need to use invalid characters
58propDecodeEncodeId :: Property
59propDecodeEncodeId =
60 forAll genUnicode $ \list ->
61 monadicIO $ do
62 let wrds = SS.encodeUtf8 $ Stream.fromList list
63 chrs <- Stream.toList $ SS.decodeUtf8 wrds
64 assert (chrs == list)
66propDecodeEncodeIdArrays :: Property
67propDecodeEncodeIdArrays =
68 forAll genUnicode $ \list ->
69 monadicIO $ do
70 let wrds = Stream.chunksOf 8 $ SS.encodeUtf8' $ Stream.fromList list
71 chrs <- Stream.toList $ IUS.decodeUtf8Chunks wrds
72 assert (chrs == list)
74unicodeTestData :: [Char]
75unicodeTestData = "z\72150\83468;L$Wz| ?_i/J ."
77latin1TestData :: [Char]
78latin1TestData = "z\214\f;L$Wz| ?_i/J ."
80propASCIIToLatin1 :: Property
81propASCIIToLatin1 =
82 forAll (choose (1, 1000)) $ \len ->
83 forAll (vectorOf len arbitraryASCIIChar) $ \list ->
84 monadicIO $ do
85 let wrds = SS.decodeLatin1
86 $ SS.encodeLatin1
87 $ Stream.fromList list
88 lst <- run $ Stream.toList wrds
89 assert (list == lst)
91propUnicodeToLatin1 :: Property
92propUnicodeToLatin1 =
93 monadicIO $ do
94 let wrds =
95 SS.decodeLatin1
96 $ SS.encodeLatin1
97 $ Stream.fromList unicodeTestData
98 lst <- run $ Stream.toList wrds
99 assert (latin1TestData == lst)
101propUnicodeToLatin1' :: Property
102propUnicodeToLatin1' =
103 monadicIO $ do
104 let wrds =
105 SS.decodeLatin1
106 $ SS.encodeLatin1'
107 $ Stream.fromList unicodeTestData
108 lst <- run $ Stream.toList wrds
109 assert (latin1TestData == lst)
111testLines :: Property
112testLines =
113 forAll genUnicode $ \list ->
114 monadicIO $ do
115 xs <- Stream.toList
116 $ fmap A.toList
117 $ IUA.lines
118 $ Stream.fromList list
119 assert (xs == lines list)
121testLinesArray :: Property
122testLinesArray =
123 forAll genWord8 $ \list ->
124 monadicIO $ do
125 xs <- Stream.toList
126 $ fmap A.toList
127 $ AS.splitOnSuffix 10
128 $ Stream.fromPure (A.fromList list)
129 assert (xs == map (map (fromIntegral . ord))
130 (lines (map (chr . fromIntegral) list)))
132testWords :: Property
133testWords =
134 forAll genUnicode $ \list ->
135 monadicIO $ do
136 xs <- Stream.toList
137 $ Stream.map A.toList
138 $ IUA.words
139 $ Stream.fromList list
140 assert (xs == words list)
142testUnlines :: Property
143testUnlines =
144 forAll genUnicode $ \list ->
145 monadicIO $ do
146 xs <- Stream.toList
147 $ IUA.unlines
148 $ IUA.lines
149 $ Stream.fromList list
150 assert (xs == unlines (lines list))
152testUnwords :: Property
153testUnwords =
154 forAll genUnicode $ \list ->
155 monadicIO $ do
156 xs <- run
157 $ Stream.toList
158 $ IUA.unwords
159 $ IUA.words
160 $ Stream.fromList list
161 assert (xs == unwords (words list))
163moduleName :: String
164moduleName = "Unicode.Stream"
166main :: IO ()
167main = H.hspec
168 $ H.parallel
169 $ modifyMaxSuccess (const 1000)
170 $ H.describe moduleName $ do
171 H.describe "UTF8 - Encoding / Decoding" $ do
172 prop "decodeUtf8' . encodeUtf8' == id" propDecodeEncodeId'
173 prop "decodeUtf8 . encodeUtf8' == id" propDecodeEncodeId
174 prop "decodeUtf8Arrays . encodeUtf8' == id"
175 propDecodeEncodeIdArrays
176 prop "Streamly.Data.String.lines == Prelude.lines" testLines
177 prop "Arrays Streamly.Data.String.lines == Prelude.lines"
178 testLinesArray
179 prop "Streamly.Data.String.words == Prelude.words" testWords
180 prop
181 "Streamly.Data.String.unlines . Streamly.Data.String.lines == unlines . lines"
182 testUnlines
183 prop
184 "Streamly.Data.String.unwords . Streamly.Data.String.words == unwords . words"
185 testUnwords
187 H.describe "Latin1 - Encoding / Decoding" $ do
188 prop "ASCII to Latin1" propASCIIToLatin1
189 prop "Unicode to Latin1" propUnicodeToLatin1
190 prop "Unicode to Latin1'" $ expectFailure propUnicodeToLatin1'