on a754b13 help sign in
streamly/test/String.hs
132 lines 3.9 kB history raw
1{-# LANGUAGE CPP #-}
2{-# LANGUAGE FlexibleContexts #-}
4module Main (main) where
6import Data.Char (ord, chr)
7import Data.Word (Word8)
8import Test.Hspec.QuickCheck
9import Test.QuickCheck
10 (Property, forAll, Gen, listOf, arbitraryUnicodeChar, arbitrary)
11import Test.QuickCheck.Monadic (run, monadicIO, assert)
13import Test.Hspec as H
15import qualified Streamly.Memory.Array as A
16import qualified Streamly.Prelude as S
17import qualified Streamly.Data.String as SS
19-- Coverage build takes too long with default number of tests
20{-
21maxTestCount :: Int
22#ifdef DEVBUILD
23maxTestCount = 100
24#else
25maxTestCount = 10
26#endif
27-}
29-- Use quickcheck-unicode instead?
30genUnicode :: Gen String
31genUnicode = listOf arbitraryUnicodeChar
33genWord8 :: Gen [Word8]
34genWord8 = listOf arbitrary
36propDecodeEncodeId :: Property
37propDecodeEncodeId =
38 forAll genUnicode $ \list ->
39 monadicIO $ do
40 let wrds = SS.encodeUtf8 $ S.fromList list
41 chrs <- S.toList $ SS.decodeUtf8 wrds
42 assert (chrs == list)
44-- XXX need to use invalid characters
45propDecodeEncodeIdLenient :: Property
46propDecodeEncodeIdLenient =
47 forAll genUnicode $ \list ->
48 monadicIO $ do
49 let wrds = SS.encodeUtf8 $ S.fromList list
50 chrs <- S.toList $ SS.decodeUtf8Lenient wrds
51 assert (chrs == list)
53propDecodeEncodeIdArrays :: Property
54propDecodeEncodeIdArrays =
55 forAll genUnicode $ \list ->
56 monadicIO $ do
57 let wrds = SS.encodeUtf8 $ S.fromList list
58 chrs <- S.toList $ SS.decodeUtf8ArraysLenient
59 (S.runFold A.write wrds)
60 assert (chrs == list)
62testLines :: Property
63testLines =
64 forAll genUnicode $ \list ->
65 monadicIO $ do
66 xs <- S.toList
67 $ S.map A.toList
68 $ SS.lines
69 $ S.fromList list
70 assert (xs == lines list)
72testLinesArray :: Property
73testLinesArray =
74 forAll genWord8 $ \list ->
75 monadicIO $ do
76 xs <- S.toList
77 $ S.map A.toList
78 $ A.splitOnSuffix 10
79 $ S.yield (A.fromList list)
80 assert (xs == map (map (fromIntegral . ord))
81 (lines (map (chr . fromIntegral) list)))
83testWords :: Property
84testWords =
85 forAll genUnicode $ \list ->
86 monadicIO $ do
87 xs <- S.toList
88 $ S.map A.toList
89 $ SS.words
90 $ S.fromList list
91 assert (xs == words list)
93testUnlines :: Property
94testUnlines =
95 forAll genUnicode $ \list ->
96 monadicIO $ do
97 xs <- S.toList
98 $ SS.unlines
99 $ SS.lines
100 $ S.fromList list
101 assert (xs == unlines (lines list))
103testUnwords :: Property
104testUnwords =
105 forAll genUnicode $ \list ->
106 monadicIO $ do
107 xs <- run
108 $ S.toList
109 $ SS.unwords
110 $ SS.words
111 $ S.fromList list
112 assert (xs == unwords (words list))
114main :: IO ()
115main = hspec
116 $ H.parallel
117 $ modifyMaxSuccess (const 1000)
118 $ do
119 describe "UTF8 - Encoding / Decoding" $ do
120 prop "decodeUtf8 . encodeUtf8 == id" $ propDecodeEncodeId
121 prop "decodeUtf8Lenient . encodeUtf8 == id" $ propDecodeEncodeIdLenient
122 prop "decodeUtf8ArraysLenient . 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
127 prop
128 "Streamly.Data.String.unlines . Streamly.Data.String.lines == unlines . lines"
129 $ testUnlines
130 prop
131 "Streamly.Data.String.unwords . Streamly.Data.String.words == unwords . words"
132 $ testUnwords