| {-# OPTIONS_GHC -fno-warn-orphans #-} |
| |
| module Thrift.Arbitraries where |
| |
| import Data.Bits() |
| |
| import Test.QuickCheck.Arbitrary |
| |
| import Control.Applicative ((<$>)) |
| import Data.Map (Map) |
| import qualified Data.Map as Map |
| import qualified Data.Set as Set |
| import qualified Data.Vector as Vector |
| import qualified Data.Text.Lazy as Text |
| import qualified Data.HashSet as HSet |
| import qualified Data.HashMap.Strict as HMap |
| import Data.Hashable (Hashable) |
| |
| import Data.ByteString.Lazy (ByteString) |
| import qualified Data.ByteString.Lazy as BS |
| |
| -- String has an Arbitrary instance already |
| -- Bool has an Arbitrary instance already |
| -- A Thrift 'list' is a Vector. |
| |
| instance Arbitrary ByteString where |
| arbitrary = BS.pack . filter (/= 0) <$> arbitrary |
| |
| instance (Arbitrary k) => Arbitrary (Vector.Vector k) where |
| arbitrary = Vector.fromList <$> arbitrary |
| |
| instance Arbitrary Text.Text where |
| arbitrary = Text.pack . filter (/= '\0') <$> arbitrary |
| |
| instance (Eq k, Hashable k, Arbitrary k) => Arbitrary (HSet.HashSet k) where |
| arbitrary = HSet.fromList <$> arbitrary |
| |
| instance (Eq k, Hashable k, Arbitrary k, Arbitrary v) => |
| Arbitrary (HMap.HashMap k v) where |
| arbitrary = HMap.fromList <$> arbitrary |
| |
| {- |
| To handle Thrift 'enum' we would ideally use something like: |
| |
| instance (Enum a, Bounded a) => Arbitrary a |
| where arbitrary = elements (enumFromTo minBound maxBound) |
| |
| Unfortunately this doesn't play nicely with the type system. |
| Instead we'll generate an arbitrary instance along with the code. |
| -} |
| |
| {- |
| There might be some way to introspect on the Haskell structure of a |
| Thrift 'struct' or 'exception' but generating the code directly is simpler. |
| -} |