string-random-0.1.0.0: test/string-random-test.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE FlexibleContexts #-}
import Data.Monoid ((<>))
import qualified Data.ByteString as ByteString
import qualified Data.Text.Encoding as Encoding
import Control.Monad (forM_)
import qualified Text.StringRandom as StringRandom
import qualified Text.StringRandom.Parser as Parser
import qualified Test.Tasty as Tasty
import qualified Test.Tasty.HUnit as HUnit
import Test.Tasty.HUnit ((@?=), (@?))
import qualified Text.Regex.PCRE.Heavy as PCRE
main :: IO ()
main = Tasty.defaultMain allTests
allTests :: Tasty.TestTree
allTests = Tasty.testGroup "All tests of random-string"
[ testParser
, testStringRandom
]
testParser :: Tasty.TestTree
testParser = HUnit.testCase "Test parsers" $ do
Parser.processParse "" @?= Right (Parser.PConcat [])
Parser.processParse "a" @?= Right (Parser.PClass "a")
Parser.processParse "[a-c]" @?= Right (Parser.PClass "abc")
Parser.processParse "\\d" @?= Right (Parser.PClass "0123456789")
Parser.processParse "[^\\w\\W]" @?= Right (Parser.PClass "")
Parser.processParse "a*" @?= Right (Parser.PRange
0 Nothing (Parser.PClass "a"))
Parser.processParse "a+" @?= Right (Parser.PRange
1 Nothing (Parser.PClass "a"))
Parser.processParse "a{3}" @?= Right (Parser.PRange
3 (Just 3) (Parser.PClass "a"))
Parser.processParse "a{1,}" @?= Right (Parser.PRange
1 Nothing (Parser.PClass "a"))
Parser.processParse "a{1,3}" @?= Right (Parser.PRange
1 (Just 3) (Parser.PClass "a"))
Parser.processParse "abc" @?= Right (Parser.PConcat
[ Parser.PClass "a"
, Parser.PClass "b"
, Parser.PClass "c"
])
Parser.processParse "a|b|c" @?= Right (Parser.PSelect
[ Parser.PClass "a"
, Parser.PClass "b"
, Parser.PClass "c"
])
Parser.processParse "((a)(?:b)(c))" @?=
Right (Parser.PGrouped 1
( Parser.PConcat
[ Parser.PGrouped 2 (Parser.PClass "a")
, Parser.PClass "b"
, Parser.PGrouped 3 (Parser.PClass "c")
]
)
)
Parser.processParse "\\5" @?= Right (Parser.PBackward 5)
Parser.processParse "^a\\b$" @?= Right (Parser.PConcat
[ Parser.PIgnored
, Parser.PClass "a"
, Parser.PIgnored
, Parser.PIgnored
])
testStringRandom :: Tasty.TestTree
testStringRandom = HUnit.testCase "Test stringRandomIO" $ do
e <- StringRandom.stringRandomIO ""
e @?= ""
e' <- StringRandom.stringRandomIO "a{0}"
e' @?= ""
let patterns =
[ ""
, "a"
, "[a-c]"
, "\\d"
, "[^\\W]"
, "a*"
, "a+"
, "a{4}"
, "a{2,}"
, "a{2,4}"
, "abc"
, "a|b|c"
, "((a)(?:b)(c))"
, "(.*)\\1"
]
forM_ patterns $ \pat -> do
let pat' = "^" <> fixBS pat <> "$"
(Right reg) = PCRE.compileM pat' []
randbs <- fixBS <$> StringRandom.stringRandomIO pat
randbs PCRE.=~ reg @? ("check regexp: " ++ show pat'
++ ", string: " ++ show randbs)
where
-- Seems that PCRE can't handle strings generated by encodeUtf8
fixBS = (<> "") . Encoding.encodeUtf8