{-# 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