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