on ffcb268 help sign in
188 lines 5.6 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.Internal.Data.Stream.Chunked as AS
23import qualified Streamly.Prelude as S
24import qualified Streamly.Internal.Data.Stream.IsStream as S
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' $ S.fromList list
54 chrs <- S.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 $ S.fromList list
63 chrs <- S.toList $ SS.decodeUtf8 wrds
64 assert (chrs == list)
66propDecodeEncodeIdArrays :: Property
67propDecodeEncodeIdArrays =
68 forAll genUnicode $ \list ->
69 monadicIO $ do
70 let wrds = S.arraysOf 8 $ SS.encodeUtf8' $ S.fromList list
71 chrs <- S.toList $ IUS.decodeUtf8Arrays 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 $ SS.encodeLatin1 $ S.fromList list
86 lst <- run $ S.toList wrds
87 assert (list == lst)
89propUnicodeToLatin1 :: Property
90propUnicodeToLatin1 =
91 monadicIO $ do
92 let wrds =
93 SS.decodeLatin1
94 $ SS.encodeLatin1
95 $ S.fromList unicodeTestData
96 lst <- run $ S.toList wrds
97 assert (latin1TestData == lst)
99propUnicodeToLatin1' :: Property
100propUnicodeToLatin1' =
101 monadicIO $ do
102 let wrds =
103 SS.decodeLatin1
104 $ SS.encodeLatin1'
105 $ S.fromList unicodeTestData
106 lst <- run $ S.toList wrds
107 assert (latin1TestData == lst)
109testLines :: Property
110testLines =
111 forAll genUnicode $ \list ->
112 monadicIO $ do
113 xs <- S.toList
114 $ S.map A.toList
115 $ IUA.lines
116 $ S.fromList list
117 assert (xs == lines list)
119testLinesArray :: Property
120testLinesArray =
121 forAll genWord8 $ \list ->
122 monadicIO $ do
123 xs <- S.toList
124 $ S.map A.toList
125 $ AS.splitOnSuffix 10
126 $ S.fromPure (A.fromList list)
127 assert (xs == map (map (fromIntegral . ord))
128 (lines (map (chr . fromIntegral) list)))
130testWords :: Property
131testWords =
132 forAll genUnicode $ \list ->
133 monadicIO $ do
134 xs <- S.toList
135 $ S.map A.toList
136 $ IUA.words
137 $ S.fromList list
138 assert (xs == words list)
140testUnlines :: Property
141testUnlines =
142 forAll genUnicode $ \list ->
143 monadicIO $ do
144 xs <- S.toList
145 $ IUA.unlines
146 $ IUA.lines
147 $ S.fromList list
148 assert (xs == unlines (lines list))
150testUnwords :: Property
151testUnwords =
152 forAll genUnicode $ \list ->
153 monadicIO $ do
154 xs <- run
155 $ S.toList
156 $ IUA.unwords
157 $ IUA.words
158 $ S.fromList list
159 assert (xs == unwords (words list))
161moduleName :: String
162moduleName = "Unicode.Stream"
164main :: IO ()
165main = H.hspec
166 $ H.parallel
167 $ modifyMaxSuccess (const 1000)
168 $ H.describe moduleName $ do
169 H.describe "UTF8 - Encoding / Decoding" $ do
170 prop "decodeUtf8' . encodeUtf8' == id" propDecodeEncodeId'
171 prop "decodeUtf8 . encodeUtf8' == id" propDecodeEncodeId
172 prop "decodeUtf8Arrays . encodeUtf8' == id"
173 propDecodeEncodeIdArrays
174 prop "Streamly.Data.String.lines == Prelude.lines" testLines
175 prop "Arrays Streamly.Data.String.lines == Prelude.lines"
176 testLinesArray
177 prop "Streamly.Data.String.words == Prelude.words" testWords
178 prop
179 "Streamly.Data.String.unlines . Streamly.Data.String.lines == unlines . lines"
180 testUnlines
181 prop
182 "Streamly.Data.String.unwords . Streamly.Data.String.words == unwords . words"
183 testUnwords
185 H.describe "Latin1 - Encoding / Decoding" $ do
186 prop "ASCII to Latin1" propASCIIToLatin1
187 prop "Unicode to Latin1" propUnicodeToLatin1
188 prop "Unicode to Latin1'" $ expectFailure propUnicodeToLatin1'