-- | A reusable differential-testing toolkit for @pqi@ adapters.
--
-- An adapter's test suite calls 'specs' with its 'Pqi.Adapter' value. The
-- battery runs the same operation on the candidate and on the FFI reference
-- and asserts that the protocol-derived observations match.
--
-- The throwaway PostgreSQL container lifecycle is baked into 'specs', so
-- adapter test suites only need @hspec (specs MyAdapter.adapter)@; they
-- don't have to know about @testcontainers@ at all. The SCRAM-SHA-256
-- authentication spec is part of the @connectdb@ group and boots its own
-- password-auth container.
module Pqi.Conformance
  ( specs,
  )
where

import qualified Pqi
import Pqi.Conformance.Harness
import qualified Pqi.Conformance.Operation.BackendPID as BackendPID
import qualified Pqi.Conformance.Operation.Cancel as Cancel
import qualified Pqi.Conformance.Operation.ClientEncoding as ClientEncoding
import qualified Pqi.Conformance.Operation.CmdStatus as CmdStatus
import qualified Pqi.Conformance.Operation.CmdTuples as CmdTuples
import qualified Pqi.Conformance.Operation.ConnectPoll as ConnectPoll
import qualified Pqi.Conformance.Operation.ConnectStart as ConnectStart
import qualified Pqi.Conformance.Operation.Connectdb as Connectdb
import qualified Pqi.Conformance.Operation.ConnectionNeedsPassword as ConnectionNeedsPassword
import qualified Pqi.Conformance.Operation.ConnectionUsedPassword as ConnectionUsedPassword
import qualified Pqi.Conformance.Operation.ConsumeInput as ConsumeInput
import qualified Pqi.Conformance.Operation.Db as Db
import qualified Pqi.Conformance.Operation.DescribePortal as DescribePortal
import qualified Pqi.Conformance.Operation.DescribePrepared as DescribePrepared
import qualified Pqi.Conformance.Operation.DisableNoticeReporting as DisableNoticeReporting
import qualified Pqi.Conformance.Operation.EnableNoticeReporting as EnableNoticeReporting
import qualified Pqi.Conformance.Operation.EnterPipelineMode as EnterPipelineMode
import qualified Pqi.Conformance.Operation.ErrorMessage as ErrorMessage
import qualified Pqi.Conformance.Operation.EscapeByteaConn as EscapeByteaConn
import qualified Pqi.Conformance.Operation.EscapeIdentifier as EscapeIdentifier
import qualified Pqi.Conformance.Operation.EscapeStringConn as EscapeStringConn
import qualified Pqi.Conformance.Operation.Exec as Exec
import qualified Pqi.Conformance.Operation.ExecParams as ExecParams
import qualified Pqi.Conformance.Operation.ExecPrepared as ExecPrepared
import qualified Pqi.Conformance.Operation.ExitPipelineMode as ExitPipelineMode
import qualified Pqi.Conformance.Operation.Fformat as Fformat
import qualified Pqi.Conformance.Operation.Finish as Finish
import qualified Pqi.Conformance.Operation.Flush as Flush
import qualified Pqi.Conformance.Operation.Fmod as Fmod
import qualified Pqi.Conformance.Operation.Fname as Fname
import qualified Pqi.Conformance.Operation.Fnumber as Fnumber
import qualified Pqi.Conformance.Operation.Fsize as Fsize
import qualified Pqi.Conformance.Operation.Ftable as Ftable
import qualified Pqi.Conformance.Operation.Ftablecol as Ftablecol
import qualified Pqi.Conformance.Operation.Ftype as Ftype
import qualified Pqi.Conformance.Operation.GetCancel as GetCancel
import qualified Pqi.Conformance.Operation.GetCopyData as GetCopyData
import qualified Pqi.Conformance.Operation.GetNotice as GetNotice
import qualified Pqi.Conformance.Operation.GetResult as GetResult
import qualified Pqi.Conformance.Operation.Getisnull as Getisnull
import qualified Pqi.Conformance.Operation.Getlength as Getlength
import qualified Pqi.Conformance.Operation.Getvalue as Getvalue
import qualified Pqi.Conformance.Operation.GetvalueCopy as GetvalueCopy
import qualified Pqi.Conformance.Operation.Host as Host
import qualified Pqi.Conformance.Operation.IsBusy as IsBusy
import qualified Pqi.Conformance.Operation.IsNullConnection as IsNullConnection
import qualified Pqi.Conformance.Operation.Isnonblocking as Isnonblocking
import qualified Pqi.Conformance.Operation.LoClose as LoClose
import qualified Pqi.Conformance.Operation.LoCreat as LoCreat
import qualified Pqi.Conformance.Operation.LoCreate as LoCreate
import qualified Pqi.Conformance.Operation.LoExport as LoExport
import qualified Pqi.Conformance.Operation.LoImport as LoImport
import qualified Pqi.Conformance.Operation.LoImportWithOid as LoImportWithOid
import qualified Pqi.Conformance.Operation.LoOpen as LoOpen
import qualified Pqi.Conformance.Operation.LoRead as LoRead
import qualified Pqi.Conformance.Operation.LoSeek as LoSeek
import qualified Pqi.Conformance.Operation.LoTell as LoTell
import qualified Pqi.Conformance.Operation.LoTruncate as LoTruncate
import qualified Pqi.Conformance.Operation.LoUnlink as LoUnlink
import qualified Pqi.Conformance.Operation.LoWrite as LoWrite
import qualified Pqi.Conformance.Operation.NewNullConnection as NewNullConnection
import qualified Pqi.Conformance.Operation.Nfields as Nfields
import qualified Pqi.Conformance.Operation.Notifies as Notifies
import qualified Pqi.Conformance.Operation.Nparams as Nparams
import qualified Pqi.Conformance.Operation.Ntuples as Ntuples
import qualified Pqi.Conformance.Operation.Options as Options
import qualified Pqi.Conformance.Operation.ParameterStatus as ParameterStatus
import qualified Pqi.Conformance.Operation.Paramtype as Paramtype
import qualified Pqi.Conformance.Operation.Pass as Pass
import qualified Pqi.Conformance.Operation.PipelineStatus as PipelineStatus
import qualified Pqi.Conformance.Operation.PipelineSync as PipelineSync
import qualified Pqi.Conformance.Operation.Port as Port
import qualified Pqi.Conformance.Operation.Prepare as Prepare
import qualified Pqi.Conformance.Operation.ProtocolVersion as ProtocolVersion
import qualified Pqi.Conformance.Operation.PutCopyData as PutCopyData
import qualified Pqi.Conformance.Operation.PutCopyEnd as PutCopyEnd
import qualified Pqi.Conformance.Operation.Reset as Reset
import qualified Pqi.Conformance.Operation.ResetPoll as ResetPoll
import qualified Pqi.Conformance.Operation.ResetStart as ResetStart
import qualified Pqi.Conformance.Operation.ResultErrorField as ResultErrorField
import qualified Pqi.Conformance.Operation.ResultErrorMessage as ResultErrorMessage
import qualified Pqi.Conformance.Operation.ResultStatus as ResultStatus
import qualified Pqi.Conformance.Operation.SendDescribePortal as SendDescribePortal
import qualified Pqi.Conformance.Operation.SendDescribePrepared as SendDescribePrepared
import qualified Pqi.Conformance.Operation.SendFlushRequest as SendFlushRequest
import qualified Pqi.Conformance.Operation.SendPrepare as SendPrepare
import qualified Pqi.Conformance.Operation.SendQuery as SendQuery
import qualified Pqi.Conformance.Operation.SendQueryParams as SendQueryParams
import qualified Pqi.Conformance.Operation.SendQueryPrepared as SendQueryPrepared
import qualified Pqi.Conformance.Operation.ServerVersion as ServerVersion
import qualified Pqi.Conformance.Operation.SetClientEncoding as SetClientEncoding
import qualified Pqi.Conformance.Operation.SetErrorVerbosity as SetErrorVerbosity
import qualified Pqi.Conformance.Operation.SetSingleRowMode as SetSingleRowMode
import qualified Pqi.Conformance.Operation.Setnonblocking as Setnonblocking
import qualified Pqi.Conformance.Operation.Socket as Socket
import qualified Pqi.Conformance.Operation.Status as Status
import qualified Pqi.Conformance.Operation.TransactionStatus as TransactionStatus
import qualified Pqi.Conformance.Operation.UnescapeBytea as UnescapeBytea
import qualified Pqi.Conformance.Operation.UnsafeFreeResult as UnsafeFreeResult
import qualified Pqi.Conformance.Operation.User as User
import Pqi.Conformance.Prelude
import Test.Hspec

-- | The full conformance battery: every per-operation spec under one shared
-- trust-auth container, plus SCRAM-SHA-256 authentication (which boots its own
-- password-auth container). Every operation spec is differential against the
-- FFI reference.
specs :: Pqi.Adapter -> Spec
specs :: Adapter -> Spec
specs Adapter
adapter = Spec -> Spec
forall a. SpecWith a -> SpecWith a
parallel do
  SpecWith ByteString -> Spec
containerHook do
    -- Connection lifecycle
    Adapter -> SpecWith ByteString
Connectdb.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ConnectStart.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ConnectPoll.spec Adapter
adapter
    Adapter -> SpecWith ByteString
NewNullConnection.spec Adapter
adapter
    Adapter -> SpecWith ByteString
IsNullConnection.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Finish.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Reset.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ResetStart.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ResetPoll.spec Adapter
adapter
    -- Connection information accessors
    Adapter -> SpecWith ByteString
Db.spec Adapter
adapter
    Adapter -> SpecWith ByteString
User.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Pass.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Host.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Port.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Options.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Status.spec Adapter
adapter
    Adapter -> SpecWith ByteString
TransactionStatus.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ParameterStatus.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ProtocolVersion.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ServerVersion.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ErrorMessage.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Socket.spec Adapter
adapter
    Adapter -> SpecWith ByteString
BackendPID.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ConnectionNeedsPassword.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ConnectionUsedPassword.spec Adapter
adapter
    -- Querying
    Adapter -> SpecWith ByteString
Exec.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ExecParams.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Prepare.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ExecPrepared.spec Adapter
adapter
    Adapter -> SpecWith ByteString
DescribePrepared.spec Adapter
adapter
    Adapter -> SpecWith ByteString
DescribePortal.spec Adapter
adapter
    -- Escaping
    Adapter -> SpecWith ByteString
EscapeStringConn.spec Adapter
adapter
    Adapter -> SpecWith ByteString
EscapeByteaConn.spec Adapter
adapter
    Adapter -> SpecWith ByteString
EscapeIdentifier.spec Adapter
adapter
    Adapter -> SpecWith ByteString
UnescapeBytea.spec Adapter
adapter
    -- Asynchronous command processing
    Adapter -> SpecWith ByteString
SendQuery.spec Adapter
adapter
    Adapter -> SpecWith ByteString
SendQueryParams.spec Adapter
adapter
    Adapter -> SpecWith ByteString
SendPrepare.spec Adapter
adapter
    Adapter -> SpecWith ByteString
SendQueryPrepared.spec Adapter
adapter
    Adapter -> SpecWith ByteString
SendDescribePrepared.spec Adapter
adapter
    Adapter -> SpecWith ByteString
SendDescribePortal.spec Adapter
adapter
    Adapter -> SpecWith ByteString
GetResult.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ConsumeInput.spec Adapter
adapter
    Adapter -> SpecWith ByteString
IsBusy.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Setnonblocking.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Isnonblocking.spec Adapter
adapter
    Adapter -> SpecWith ByteString
SetSingleRowMode.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Flush.spec Adapter
adapter
    -- Pipelining
    Adapter -> SpecWith ByteString
PipelineStatus.spec Adapter
adapter
    Adapter -> SpecWith ByteString
EnterPipelineMode.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ExitPipelineMode.spec Adapter
adapter
    Adapter -> SpecWith ByteString
PipelineSync.spec Adapter
adapter
    Adapter -> SpecWith ByteString
SendFlushRequest.spec Adapter
adapter
    -- Cancellation
    Adapter -> SpecWith ByteString
GetCancel.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Cancel.spec Adapter
adapter
    -- Notifications and notices
    Adapter -> SpecWith ByteString
Notifies.spec Adapter
adapter
    Adapter -> SpecWith ByteString
DisableNoticeReporting.spec Adapter
adapter
    Adapter -> SpecWith ByteString
EnableNoticeReporting.spec Adapter
adapter
    Adapter -> SpecWith ByteString
GetNotice.spec Adapter
adapter
    -- Copy sub-protocol
    Adapter -> SpecWith ByteString
PutCopyData.spec Adapter
adapter
    Adapter -> SpecWith ByteString
PutCopyEnd.spec Adapter
adapter
    Adapter -> SpecWith ByteString
GetCopyData.spec Adapter
adapter
    -- Large objects
    Adapter -> SpecWith ByteString
LoCreat.spec Adapter
adapter
    Adapter -> SpecWith ByteString
LoCreate.spec Adapter
adapter
    Adapter -> SpecWith ByteString
LoImport.spec Adapter
adapter
    Adapter -> SpecWith ByteString
LoImportWithOid.spec Adapter
adapter
    Adapter -> SpecWith ByteString
LoExport.spec Adapter
adapter
    Adapter -> SpecWith ByteString
LoOpen.spec Adapter
adapter
    Adapter -> SpecWith ByteString
LoWrite.spec Adapter
adapter
    Adapter -> SpecWith ByteString
LoRead.spec Adapter
adapter
    Adapter -> SpecWith ByteString
LoSeek.spec Adapter
adapter
    Adapter -> SpecWith ByteString
LoTell.spec Adapter
adapter
    Adapter -> SpecWith ByteString
LoTruncate.spec Adapter
adapter
    Adapter -> SpecWith ByteString
LoClose.spec Adapter
adapter
    Adapter -> SpecWith ByteString
LoUnlink.spec Adapter
adapter
    -- Connection control
    Adapter -> SpecWith ByteString
ClientEncoding.spec Adapter
adapter
    Adapter -> SpecWith ByteString
SetClientEncoding.spec Adapter
adapter
    Adapter -> SpecWith ByteString
SetErrorVerbosity.spec Adapter
adapter
    -- Result inspection
    Adapter -> SpecWith ByteString
ResultStatus.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ResultErrorMessage.spec Adapter
adapter
    Adapter -> SpecWith ByteString
ResultErrorField.spec Adapter
adapter
    Adapter -> SpecWith ByteString
UnsafeFreeResult.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Ntuples.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Nfields.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Fname.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Fnumber.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Ftable.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Ftablecol.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Fformat.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Ftype.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Fmod.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Fsize.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Getvalue.spec Adapter
adapter
    Adapter -> SpecWith ByteString
GetvalueCopy.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Getisnull.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Getlength.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Nparams.spec Adapter
adapter
    Adapter -> SpecWith ByteString
Paramtype.spec Adapter
adapter
    Adapter -> SpecWith ByteString
CmdStatus.spec Adapter
adapter
    Adapter -> SpecWith ByteString
CmdTuples.spec Adapter
adapter