on e621237 help sign in
streamly/test/String.hs
112 lines 3.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.Mem.Array as A
16import qualified Streamly.Mem.Array.Stream as AS
17import qualified Streamly.Prelude as S
18import qualified Streamly.String as SS
20-- Coverage build takes too long with default number of tests
21{-
22maxTestCount :: Int
23#ifdef DEVBUILD
24maxTestCount = 100
25#else
26maxTestCount = 10
27#endif
28-}
30-- Use quickcheck-unicode instead?
31genUnicode :: Gen String
32genUnicode = listOf arbitraryUnicodeChar
34genWord8 :: Gen [Word8]
35genWord8 = listOf arbitrary
37propDecodeEncodeId :: Property
38propDecodeEncodeId =
39 forAll genUnicode $ \list ->
40 monadicIO $ do
41 let wrds = SS.encodeUtf8 $ S.fromList list
42 chrs <- S.toList $ SS.decodeUtf8 wrds
43 assert (chrs == list)
45testLines :: Property
46testLines =
47 forAll genUnicode $ \list ->
48 monadicIO $ do
49 xs <- S.toList
50 $ S.map A.toList
51 $ SS.lines
52 $ S.fromList list
53 assert (xs == lines list)
55testLinesArray :: Property
56testLinesArray =
57 forAll genWord8 $ \list ->
58 monadicIO $ do
59 xs <- S.toList
60 $ S.map A.toList
61 $ AS.splitOn 10
62 $ S.yield (A.fromList list)
63 assert (xs == map (map (fromIntegral . ord))
64 (lines (map (chr . fromIntegral) list)))
66testWords :: Property
67testWords =
68 forAll genUnicode $ \list ->
69 monadicIO $ do
70 xs <- S.toList
71 $ S.map A.toList
72 $ SS.words
73 $ S.fromList list
74 assert (xs == words list)
76testUnlines :: Property
77testUnlines =
78 forAll genUnicode $ \list ->
79 monadicIO $ do
80 xs <- S.toList
81 $ SS.unlines
82 $ SS.lines
83 $ S.fromList list
84 assert (xs == unlines (lines list))
86testUnwords :: Property
87testUnwords =
88 forAll genUnicode $ \list ->
89 monadicIO $ do
90 xs <- run
91 $ S.toList
92 $ SS.unwords
93 $ SS.words
94 $ S.fromList list
95 assert (xs == unwords (words list))
97main :: IO ()
98main = hspec
99 $ H.parallel
100 $ modifyMaxSuccess (const 1000)
101 $ do
102 describe "UTF8 - Encoding / Decoding" $ do
103 prop "decodeUtf8 . encodeUtf8 == id" $ propDecodeEncodeId
104 prop "Streamly.String.lines == Prelude.lines" $ testLines
105 prop "Arrays Streamly.String.lines == Prelude.lines" $ testLinesArray
106 prop "Streamly.String.words == Prelude.words" $ testWords
107 prop
108 "Streamly.String.unlines . Streamly.String.lines == unlines . lines"
109 $ testUnlines
110 prop
111 "Streamly.String.unwords . Streamly.String.words == unwords . words"
112 $ testUnwords