@@ -2,19 +2,29 @@ module Streamly.Test.Unicode.Stream (main) where
3import Data.Char (ord, chr)
3import Data.Char (ord, chr)
4import Data.Word (Word8)
4import Data.Word (Word8)
5−import Test.Hspec.QuickCheck
6import Test.QuickCheck
5import Test.QuickCheck
7− (Property, forAll, Gen, listOf, arbitraryUnicodeChar, arbitrary)
11+ , arbitraryUnicodeChar
8import Test.QuickCheck.Monadic (run, monadicIO, assert)
17import Test.QuickCheck.Monadic (run, monadicIO, assert)
10−import Test.Hspec as H
12import qualified Streamly.Data.Array.Storable.Foreign as A
19import qualified Streamly.Data.Array.Storable.Foreign as A
13import qualified Streamly.Internal.Memory.ArrayStream as AS
20import qualified Streamly.Internal.Memory.ArrayStream as AS
14import qualified Streamly.Prelude as S
21import qualified Streamly.Prelude as S
15import qualified Streamly.Unicode.Stream as SS
22import qualified Streamly.Unicode.Stream as SS
16import qualified Streamly.Internal.Unicode.Stream as IUS
23import qualified Streamly.Internal.Unicode.Stream as IUS
17import qualified Streamly.Internal.Unicode.Array.Char as IUA
24import qualified Streamly.Internal.Unicode.Array.Char as IUA
25+import qualified Test.Hspec as H
27+import Test.Hspec.QuickCheck
19-- Coverage build takes too long with default number of tests
29-- Coverage build takes too long with default number of tests
@@ -59,6 +69,41 @@ propDecodeEncodeIdArrays =
59 (S.fold A.write wrds)
69 (S.fold A.write wrds)
60 assert (chrs == list)
70 assert (chrs == list)
72+unicodeTestData :: [Char]
73+unicodeTestData = "z\72150\83468;L$Wz| ?_i/J ."
75+latin1TestData :: [Char]
76+latin1TestData = "z\214\f;L$Wz| ?_i/J ."
78+propASCIIToLatin1 :: Property
80+ forAll (choose (1, 1000)) $ \len ->
81+ forAll (vectorOf len arbitraryASCIIChar) $ \list ->
83+ let wrds = SS.decodeLatin1 $ SS.encodeLatin1 $ S.fromList list
84+ lst <- run $ S.toList wrds
87+propUnicodeToLatin1 :: Property
93+ $ S.fromList unicodeTestData
94+ lst <- run $ S.toList wrds
95+ assert (latin1TestData == lst)
97+propUnicodeToLatin1' :: Property
98+propUnicodeToLatin1' =
103+ $ S.fromList unicodeTestData
104+ lst <- run $ S.toList wrds
105+ assert (latin1TestData == lst)
62testLines :: Property
107testLines :: Property
63testLines =
108testLines =
64 forAll genUnicode $ \list ->
109 forAll genUnicode $ \list ->
@@ -112,21 +157,28 @@ testUnwords =
112 assert (xs == unwords (words list))
157 assert (xs == unwords (words list))
114main :: IO ()
159main :: IO ()
115−main = hspec
160+main = H.hspec
116 $ H.parallel
161 $ H.parallel
117 $ modifyMaxSuccess (const 1000)
162 $ modifyMaxSuccess (const 1000)
119− describe "UTF8 - Encoding / Decoding" $ do
164+ H.describe "UTF8 - Encoding / Decoding" $ do
120− prop "decodeUtf8' . encodeUtf8' == id" $ propDecodeEncodeId'
165+ prop "decodeUtf8' . encodeUtf8' == id" propDecodeEncodeId'
121− prop "decodeUtf8 . encodeUtf8' == id" $ propDecodeEncodeId
166+ prop "decodeUtf8 . encodeUtf8' == id" propDecodeEncodeId
122 prop "decodeUtf8Arrays . encodeUtf8' == id"
167 prop "decodeUtf8Arrays . encodeUtf8' == id"
123− $ propDecodeEncodeIdArrays
168+ propDecodeEncodeIdArrays
124− prop "Streamly.Data.String.lines == Prelude.lines" $ testLines
169+ prop "Streamly.Data.String.lines == Prelude.lines" testLines
125− prop "Arrays Streamly.Data.String.lines == Prelude.lines" $ testLinesArray
170+ prop "Arrays Streamly.Data.String.lines == Prelude.lines"
126− prop "Streamly.Data.String.words == Prelude.words" $ testWords
172+ prop "Streamly.Data.String.words == Prelude.words" testWords
128 "Streamly.Data.String.unlines . Streamly.Data.String.lines == unlines . lines"
174 "Streamly.Data.String.unlines . Streamly.Data.String.lines == unlines . lines"
129− $ testUnlines
175+ testUnlines
131 "Streamly.Data.String.unwords . Streamly.Data.String.words == unwords . words"
177 "Streamly.Data.String.unwords . Streamly.Data.String.words == unwords . words"
132− $ testUnwords
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'