module Data.GenValidity.Text where

import           Data.GenValidity

import           Test.QuickCheck

import           Data.Text        (Text)
import qualified Data.Text        as T


genUncheckedText :: Gen Text
genUncheckedText = sized $ \n -> do
    size <- upTo n
    chars <- resize size $ genListOf arbitrary
    return $ T.pack chars

textStartingWith :: Char -> Gen Text
textStartingWith c = sized $ \n ->
    case n of
        0 -> pure $ T.singleton c
        1 -> pure $ T.singleton c
        _ -> do
            rest <- resize (n - 1) genUncheckedText
            return $ T.cons c rest

textWith :: Gen Text -> Gen Text
textWith gen = sized $ \n -> do
    (b, m, a) <- genSplit3 n
    before <- resize b genUncheckedText
    middle <- resize m gen
    after  <- resize a genUncheckedText
    return $ T.concat [before, middle, after]

textWithA :: Char -> Gen Text
textWithA c = textWith $ T.singleton <$> pure c

textWithoutAny :: Char -> Gen Text
textWithoutAny c = textWithoutAnyOf [c]

textWithoutAnyOf :: [Char] -> Gen Text
textWithoutAnyOf cs = T.pack <$> genListOf (arbitrary `suchThat` (`notElem` cs))

textAllCaps :: Gen Text
textAllCaps = T.toUpper <$> genUncheckedText