module Test.Cardano.Data (
  expectValidMap,
  genNonEmptyMap,
) where

import Control.Monad
import qualified Data.Map.Internal.Debug as Map
import qualified Data.Map.Strict as Map hiding (showTree)
import Test.Hspec
import Test.QuickCheck

expectValidMap :: HasCallStack => (Ord k, Show k, Show a) => Map.Map k a -> Expectation
expectValidMap :: forall k a.
(HasCallStack, Ord k, Show k, Show a) =>
Map k a -> Expectation
expectValidMap Map k a
m =
  Bool -> Expectation -> Expectation
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Map k a -> Bool
forall k a. Ord k => Map k a -> Bool
Map.valid Map k a
m) (Expectation -> Expectation) -> Expectation -> Expectation
forall a b. (a -> b) -> a -> b
$
    HasCallStack => String -> Expectation
String -> Expectation
expectationFailure (String -> Expectation) -> String -> Expectation
forall a b. (a -> b) -> a -> b
$
      [String] -> String
unlines
        [ String
"Interal strucutre of a map is invalid:"
        , String
"Keys are ordered: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Bool -> String
forall a. Show a => a -> String
show (Map k a -> Bool
forall k a. Ord k => Map k a -> Bool
Map.ordered Map k a
m)
        , String
"Tree is balanced: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Bool -> String
forall a. Show a => a -> String
show (Map k a -> Bool
forall k a. Map k a -> Bool
Map.balanced Map k a
m)
        , String
"Sizes are valid: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Bool -> String
forall a. Show a => a -> String
show (Map k a -> Bool
forall k a. Map k a -> Bool
Map.validsize Map k a
m)
        , Map k a -> String
forall k a. (Show k, Show a) => Map k a -> String
Map.showTree Map k a
m
        ]

genNonEmptyMap :: Ord k => Gen k -> Gen v -> Gen (Map.Map k v)
genNonEmptyMap :: forall k v. Ord k => Gen k -> Gen v -> Gen (Map k v)
genNonEmptyMap Gen k
genKey Gen v
genVal = [(k, v)] -> Map k v
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(k, v)] -> Map k v) -> Gen [(k, v)] -> Gen (Map k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (k, v) -> Gen [(k, v)]
forall a. Gen a -> Gen [a]
listOf1 ((,) (k -> v -> (k, v)) -> Gen k -> Gen (v -> (k, v))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen k
genKey Gen (v -> (k, v)) -> Gen v -> Gen (k, v)
forall a b. Gen (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen v
genVal)