    {-# LANGUAGE MultiParamTypeClasses #-}
    {-# LANGUAGE ScopedTypeVariables #-}

    module Test.Validity.Property
      ( module Data.GenValidity,
        forAllValid,

        -- * Tests for GenValidity instances
        genGeneratesValid,

        -- * Standard tests involving functions

        -- ** Standard tests involving validity
        producesValidsOnGen,
        producesValid,
        producesValidsOnArbitrary,
        producesValidsOnGens2,
        producesValid2,
        producesValidsOnArbitrary2,
        producesValidsOnGens3,
        producesValid3,
        producesValidsOnArbitrary3,

        -- ** Standard tests involving functions that can fail
        CanFail (..),
        succeedsOnGen,
        succeeds,
        succeedsOnArbitrary,
        succeedsOnGens2,
        succeeds2,
        succeedsOnArbitrary2,
        failsOnGen,
        failsOnGens2,
        validIfSucceedsOnGen,
        validIfSucceedsOnArbitrary,
        validIfSucceeds,
        validIfSucceedsOnGens2,
        validIfSucceeds2,
        validIfSucceedsOnArbitrary2,
        validIfSucceedsOnGens3,
        validIfSucceeds3,
        validIfSucceedsOnArbitrary3,

        -- ** Standard tests involving equivalence of functions

        -- *** Simple functions

        -- **** One argument
        equivalentOnGen,
        equivalent,
        equivalentOnArbitrary,

        -- **** Two arguments
        equivalentOnGens2,
        equivalent2,
        equivalentOnArbitrary2,

        -- **** Three arguments
        equivalentOnGens3,
        equivalent3,
        equivalentOnArbitrary3,

        -- *** First function can fail

        -- **** One argument
        equivalentWhenFirstSucceedsOnGen,
        equivalentWhenFirstSucceeds,
        equivalentWhenFirstSucceedsOnArbitrary,

        -- **** Two arguments
        equivalentWhenFirstSucceedsOnGens2,
        equivalentWhenFirstSucceeds2,
        equivalentWhenFirstSucceedsOnArbitrary2,

        -- *** Second function can fail

        -- **** One argument
        equivalentWhenSecondSucceedsOnGen,
        equivalentWhenSecondSucceeds,
        equivalentWhenSecondSucceedsOnArbitrary,

        -- **** Two arguments
        equivalentWhenSecondSucceedsOnGens2,
        equivalentWhenSecondSucceeds2,
        equivalentWhenSecondSucceedsOnArbitrary2,

        -- *** Both functions can fail

        -- **** One argument
        equivalentWhenSucceedOnGen,
        equivalentWhenSucceed,
        equivalentWhenSucceedOnArbitrary,

        -- **** Two arguments
        equivalentWhenSucceedOnGens2,
        equivalentWhenSucceed2,
        equivalentWhenSucceedOnArbitrary2,

        -- ** Standard tests involving inverse functions
        inverseFunctionsOnGen,
        inverseFunctions,
        inverseFunctionsOnArbitrary,
        inverseFunctionsIfFirstSucceedsOnGen,
        inverseFunctionsIfFirstSucceeds,
        inverseFunctionsIfFirstSucceedsOnArbitrary,
        inverseFunctionsIfSecondSucceedsOnGen,
        inverseFunctionsIfSecondSucceeds,
        inverseFunctionsIfSecondSucceedsOnArbitrary,
        inverseFunctionsIfSucceedOnGen,
        inverseFunctionsIfSucceed,
        inverseFunctionsIfSucceedOnArbitrary,

        -- ** Properties involving idempotence
        idempotentOnGen,
        idempotent,
        idempotentOnArbitrary,

        -- * Properties of relations

        -- ** Reflexivity
        reflexiveOnElem,
        reflexivityOnGen,
        reflexivity,
        reflexivityOnArbitrary,

        -- ** Transitivity
        transitiveOnElems,
        transitivityOnGens,
        transitivity,
        transitivityOnArbitrary,

        -- ** Antisymmetry
        antisymmetricOnElemsWithEquality,
        antisymmetryOnGensWithEquality,
        antisymmetryOnGens,
        antisymmetry,
        antisymmetryOnArbitrary,

        -- ** Antireflexivity
        antireflexiveOnElem,
        antireflexivityOnGen,
        antireflexivity,
        antireflexivityOnArbitrary,

        -- ** Symmetry
        symmetricOnElems,
        symmetryOnGens,
        symmetry,
        symmetryOnArbitrary,

        -- * Properties of operations

        -- ** Identity element

        -- *** Left Identity
        leftIdentityOnElemWithEquality,
        leftIdentityOnGenWithEquality,
        leftIdentityOnGen,
        leftIdentity,
        leftIdentityOnArbitrary,

        -- *** Right Identity
        rightIdentityOnElemWithEquality,
        rightIdentityOnGenWithEquality,
        rightIdentityOnGen,
        rightIdentity,
        rightIdentityOnArbitrary,

        -- *** Identity
        identityOnGen,
        identity,
        identityOnArbitrary,

        -- ** Associativity
        associativeOnGens,
        associative,
        associativeOnArbitrary,

        -- ** Commutativity
        commutativeOnGens,
        commutative,
        commutativeOnArbitrary,
      )
    where

    import Data.GenValidity
    import Test.Validity.Functions
    import Test.Validity.GenValidity.Property
    import Test.Validity.Operations
    import Test.Validity.Property.Utils
    import Test.Validity.Relations
    import Test.Validity.Types