string-random-0.1.0.0: test/string-random-quickcheck.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE Strict #-}
import Data.Monoid ((<>))
import qualified Data.Text as Text
import Data.Text.Encoding (encodeUtf8)
import qualified Test.QuickCheck as QC
import qualified Test.QuickCheck.Gen as QC
import qualified Test.QuickCheck.Random as QC
import qualified Text.StringRandom as StringRandom
import qualified Test.Tasty as Tasty
import qualified Test.Tasty.QuickCheck as TastyQC
import Text.Regex.PCRE.Heavy (compileM, (=~))
regexp :: QC.Gen Text.Text
regexp = QC.MkGen $ \(QC.QCGen g) _ -> StringRandom.stringRandom g regregexp
where regregexp = "((\\w|" <> classes <> "|\\(\\w+\\))(\\{[0-4],[5-9]\\}|\\*|\\+|))*"
classes = "\\[^?(\\w|" <> escaped <> "|a-z)+-?\\]"
escaped = "\\\\[dDwWsSnr\\[\\]|.(){}^$-]"
main :: IO ()
main = Tasty.defaultMain (TastyQC.testProperty
"by quickcheck" prop_stringRandom)
prop_stringRandom :: QC.Property
prop_stringRandom = QC.forAll regexp $ \pat -> QC.ioProperty $ do
let pat' = "^" <> fixBS pat <> "$"
(Right reg) = compileM pat' []
randbs <- fixBS <$> StringRandom.stringRandomIO pat
return $ randbs =~ reg
where
-- Seems that PCRE can't handle strings generated by encodeUtf8
fixBS = (<> "") . encodeUtf8