text-icu-0.7.1.0: tests/QuickCheckUtils.hs
{-# LANGUAGE BangPatterns #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module QuickCheckUtils (NonEmptyText(..), LatinSpoofableText(..),
NonSpoofableText(..)) where
import Control.Applicative ((<$>))
import Control.DeepSeq (NFData(..))
import Data.Text.ICU (Collator, LocaleName(..), NormalizationMode(..))
import Data.Text.ICU.Break (available)
import Test.QuickCheck (Arbitrary(..), Gen, elements, listOf1)
import qualified Data.Text as T
import qualified Data.Text.ICU as I
instance NFData Ordering where
rnf !_ = ()
instance Arbitrary T.Text where
arbitrary = T.pack `fmap` arbitrary
shrink = map T.pack . shrink . T.unpack
instance Arbitrary LocaleName where
arbitrary = elements (Root:available)
instance Arbitrary NormalizationMode where
arbitrary = elements [None ..FCD]
instance Arbitrary Collator where
arbitrary = I.collator <$> arbitrary
newtype NonEmptyText = NonEmptyText { nonEmptyText :: T.Text } deriving Show
instance Arbitrary NonEmptyText where
arbitrary = NonEmptyText <$> T.pack <$> listOf1 arbitrary
newtype LatinSpoofableText = LatinSpoofableText { latinSpoofableText :: T.Text }
deriving Show
instance Arbitrary LatinSpoofableText where
arbitrary = LatinSpoofableText <$> T.pack <$>
listOf1 genCyrillicLatinSpoofableChar
genCyrillicLatinSpoofableChar :: Gen Char
genCyrillicLatinSpoofableChar = elements (
"\x043A\x043E\x0433\x0435\x043A\x043C" ++
['\x043E'..'\x0443'] ++
['\x0445'..'\x0446'] ++
"\x044A" ++
['\x0454'..'\x0456'] ++
"\x0458\x045B\x048D\x0491\x0493\x049B\x049F\x04AB\x04AD\x04AF\x04B1\x04BB\
\\x04BD\x04BF" ++
['\x04CE'..'\x04CF'] ++
"\x04D5\x04D9\x04E9\x0501\x0511\x051B\x051D")
newtype NonSpoofableText = NonSpoofableText { nonSpoofableText :: T.Text }
deriving Show
instance Arbitrary NonSpoofableText where
arbitrary = NonSpoofableText <$> T.pack <$> listOf1 genNonSpoofableChar
genNonSpoofableChar :: Gen Char
genNonSpoofableChar = elements "QDFRz"