on 4e04eff help sign in
streamly/test/String.hs
135 lines 4.1 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.Internal.Memory.ArrayStream as AS
17import qualified Streamly.Prelude as S
18import qualified Streamly.Data.Unicode.Stream as SS
19import qualified Streamly.Internal.Data.Unicode.Stream as IUS
20import qualified Streamly.Internal.Memory.Unicode.Array as IUA
22-- Coverage build takes too long with default number of tests
23{-
24maxTestCount :: Int
25#ifdef DEVBUILD
26maxTestCount = 100
27#else
28maxTestCount = 10
29#endif
30-}
32-- Use quickcheck-unicode instead?
33genUnicode :: Gen String
34genUnicode = listOf arbitraryUnicodeChar
36genWord8 :: Gen [Word8]
37genWord8 = listOf arbitrary
39propDecodeEncodeId :: Property
40propDecodeEncodeId =
41 forAll genUnicode $ \list ->
42 monadicIO $ do
43 let wrds = SS.encodeUtf8 $ S.fromList list
44 chrs <- S.toList $ SS.decodeUtf8 wrds
45 assert (chrs == list)
47-- XXX need to use invalid characters
48propDecodeEncodeIdLenient :: Property
49propDecodeEncodeIdLenient =
50 forAll genUnicode $ \list ->
51 monadicIO $ do
52 let wrds = SS.encodeUtf8 $ S.fromList list
53 chrs <- S.toList $ SS.decodeUtf8Lax wrds
54 assert (chrs == list)
56propDecodeEncodeIdArrays :: Property
57propDecodeEncodeIdArrays =
58 forAll genUnicode $ \list ->
59 monadicIO $ do
60 let wrds = SS.encodeUtf8 $ S.fromList list
61 chrs <- S.toList $ IUS.decodeUtf8ArraysLenient
62 (S.fold A.write wrds)
63 assert (chrs == list)
65testLines :: Property
66testLines =
67 forAll genUnicode $ \list ->
68 monadicIO $ do
69 xs <- S.toList
70 $ S.map A.toList
71 $ IUA.lines
72 $ S.fromList list
73 assert (xs == lines list)
75testLinesArray :: Property
76testLinesArray =
77 forAll genWord8 $ \list ->
78 monadicIO $ do
79 xs <- S.toList
80 $ S.map A.toList
81 $ AS.splitOnSuffix 10
82 $ S.yield (A.fromList list)
83 assert (xs == map (map (fromIntegral . ord))
84 (lines (map (chr . fromIntegral) list)))
86testWords :: Property
87testWords =
88 forAll genUnicode $ \list ->
89 monadicIO $ do
90 xs <- S.toList
91 $ S.map A.toList
92 $ IUA.words
93 $ S.fromList list
94 assert (xs == words list)
96testUnlines :: Property
97testUnlines =
98 forAll genUnicode $ \list ->
99 monadicIO $ do
100 xs <- S.toList
101 $ IUA.unlines
102 $ IUA.lines
103 $ S.fromList list
104 assert (xs == unlines (lines list))
106testUnwords :: Property
107testUnwords =
108 forAll genUnicode $ \list ->
109 monadicIO $ do
110 xs <- run
111 $ S.toList
112 $ IUA.unwords
113 $ IUA.words
114 $ S.fromList list
115 assert (xs == unwords (words list))
117main :: IO ()
118main = hspec
119 $ H.parallel
120 $ modifyMaxSuccess (const 1000)
121 $ do
122 describe "UTF8 - Encoding / Decoding" $ do
123 prop "decodeUtf8 . encodeUtf8 == id" $ propDecodeEncodeId
124 prop "decodeUtf8Lax . encodeUtf8 == id" $ propDecodeEncodeIdLenient
125 prop "decodeUtf8ArraysLenient . encodeUtf8 == id"
126 $ propDecodeEncodeIdArrays
127 prop "Streamly.Data.String.lines == Prelude.lines" $ testLines
128 prop "Arrays Streamly.Data.String.lines == Prelude.lines" $ testLinesArray
129 prop "Streamly.Data.String.words == Prelude.words" $ testWords
130 prop
131 "Streamly.Data.String.unlines . Streamly.Data.String.lines == unlines . lines"
132 $ testUnlines
133 prop
134 "Streamly.Data.String.unwords . Streamly.Data.String.words == unwords . words"
135 $ testUnwords