packages feed

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