@@ -2,19 +2,29 @@ module Streamly.Test.Unicode.Stream (main) where
22
33import Data.Char (ord, chr)
44import Data.Word (Word8)
5−import Test.Hspec.QuickCheck
65import Test.QuickCheck
7− (Property, forAll, Gen, listOf, arbitraryUnicodeChar, arbitrary)
6+ ( Property
7+ , forAll
8+ , Gen
9+ , listOf
10+ , arbitraryASCIIChar
11+ , arbitraryUnicodeChar
12+ , arbitrary
13+ , expectFailure
14+ , vectorOf
15+ , choose
16+ )
817import Test.QuickCheck.Monadic (run, monadicIO, assert)
918
10−import Test.Hspec as H
11−
1219import qualified Streamly.Data.Array.Storable.Foreign as A
1320import qualified Streamly.Internal.Memory.ArrayStream as AS
1421import qualified Streamly.Prelude as S
1522import qualified Streamly.Unicode.Stream as SS
1623import qualified Streamly.Internal.Unicode.Stream as IUS
1724import qualified Streamly.Internal.Unicode.Array.Char as IUA
25+import qualified Test.Hspec as H
26+
27+import Test.Hspec.QuickCheck
1828
1929-- Coverage build takes too long with default number of tests
2030{-
@@ -59,6 +69,41 @@ propDecodeEncodeIdArrays =
5969 (S.fold A.write wrds)
6070 assert (chrs == list)
6171
72+unicodeTestData :: [Char]
73+unicodeTestData = "z\72150\83468;L$Wz| ?_i/J ."
74+
75+latin1TestData :: [Char]
76+latin1TestData = "z\214\f;L$Wz| ?_i/J ."
77+
78+propASCIIToLatin1 :: Property
79+propASCIIToLatin1 =
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)
86+
87+propUnicodeToLatin1 :: Property
88+propUnicodeToLatin1 =
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)
96+
97+propUnicodeToLatin1' :: Property
98+propUnicodeToLatin1' =
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)
106+
62107testLines :: Property
63108testLines =
64109 forAll genUnicode $ \list ->
@@ -112,21 +157,28 @@ testUnwords =
112157 assert (xs == unwords (words list))
113158
114159main :: IO ()
115−main = hspec
160+main = H.hspec
116161 $ H.parallel
117162 $ modifyMaxSuccess (const 1000)
118163 $ do
119− describe "UTF8 - Encoding / Decoding" $ do
120− prop "decodeUtf8' . encodeUtf8' == id" $ propDecodeEncodeId'
121− prop "decodeUtf8 . encodeUtf8' == id" $ propDecodeEncodeId
164+ H.describe "UTF8 - Encoding / Decoding" $ do
165+ prop "decodeUtf8' . encodeUtf8' == id" propDecodeEncodeId'
166+ prop "decodeUtf8 . encodeUtf8' == id" propDecodeEncodeId
122167 prop "decodeUtf8Arrays . encodeUtf8' == id"
123− $ propDecodeEncodeIdArrays
124− prop "Streamly.Data.String.lines == Prelude.lines" $ testLines
125− prop "Arrays Streamly.Data.String.lines == Prelude.lines" $ testLinesArray
126− prop "Streamly.Data.String.words == Prelude.words" $ testWords
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
127173 prop
128174 "Streamly.Data.String.unlines . Streamly.Data.String.lines == unlines . lines"
129− $ testUnlines
175+ testUnlines
130176 prop
131177 "Streamly.Data.String.unwords . Streamly.Data.String.words == unwords . words"
132− $ testUnwords
178+ testUnwords
179+
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'
184+