content: {-# LANGUAGE LambdaCase #-}
  {-# OPTIONS_GHC -fno-warn-orphans #-}
  
  module VerifyBindings where
  
  import           Test.Tasty
  import           Test.Tasty.QuickCheck
  import qualified Test.Verification as V
  
  
  instance Testable V.Property where
    property = \case
      V.BoolProperty b -> property b
      V.AssumptionProp a -> (V.preCondition a) ==> (V.assumedProp a)
  
  verifyGenerators :: V.GenEnv Gen
  verifyGenerators = V.GenEnv { V.genChooseBool = elements [ True, False ]
                              , V.genChooseInteger = \r -> choose r
                              , V.genChooseInt = \r -> choose r
                              , V.genGetSize = getSize
                              }
  
  
  genTest :: String -> V.Gen V.Property -> TestTree
  genTest nm p = testProperty nm (property $ V.toNativeProperty verifyGenerators p)
  
  
  setTestOptions :: TestTree -> TestTree
  setTestOptions =
    -- some tests discard a lot of values based on preconditions;
    -- this helps prevent those tests from failing for insufficent coverage
    localOption (QuickCheckMaxRatio 1000) .
  
    -- run at least 5000 tests
    adjustOption (\(QuickCheckTests x) -> QuickCheckTests (max x 5000))
  