{-# LANGUAGE OverloadedStrings #-}
module Copilot.Verifier.Examples
  ( shouldFailExamples
  , shouldPassExamples
  ) where

import qualified Data.CaseInsensitive as CI
import Data.CaseInsensitive (CI)
import qualified Data.Map as Map
import Data.Map (Map)
import Data.Text (Text)

import Copilot.Verifier (Verbosity)
import qualified Copilot.Verifier.Examples.ShouldFail.Partial.AbsIntMin        as Fail.AbsIntMin
import qualified Copilot.Verifier.Examples.ShouldFail.Partial.AddSignedWrap    as Fail.AddSignedWrap
import qualified Copilot.Verifier.Examples.ShouldFail.Partial.DivByZero        as Fail.DivByZero
import qualified Copilot.Verifier.Examples.ShouldFail.Partial.IndexOutOfBounds as Fail.IndexOutOfBounds
import qualified Copilot.Verifier.Examples.ShouldFail.Partial.ModByZero        as Fail.ModByZero
import qualified Copilot.Verifier.Examples.ShouldFail.Partial.MulSignedWrap    as Fail.MulSignedWrap
import qualified Copilot.Verifier.Examples.ShouldFail.Partial.ShiftLTooLarge   as Fail.ShiftLTooLarge
import qualified Copilot.Verifier.Examples.ShouldFail.Partial.ShiftRTooLarge   as Fail.ShiftRTooLarge
import qualified Copilot.Verifier.Examples.ShouldFail.Partial.SubSignedWrap    as Fail.SubSignedWrap
import qualified Copilot.Verifier.Examples.ShouldPass.Array                    as Array
import qualified Copilot.Verifier.Examples.ShouldPass.ArrayGen                 as ArrayGen
import qualified Copilot.Verifier.Examples.ShouldPass.ArrayOfStructs           as ArrayOfStructs
import qualified Copilot.Verifier.Examples.ShouldPass.ArrayTriggerArgument     as ArrayTriggerArgument
import qualified Copilot.Verifier.Examples.ShouldPass.Arith                    as Arith
import qualified Copilot.Verifier.Examples.ShouldPass.Clock                    as Clock
import qualified Copilot.Verifier.Examples.ShouldPass.Counter                  as Counter
import qualified Copilot.Verifier.Examples.ShouldPass.Engine                   as Engine
import qualified Copilot.Verifier.Examples.ShouldPass.FPNegation               as FPNegation
import qualified Copilot.Verifier.Examples.ShouldPass.FPOps                    as FPOps
import qualified Copilot.Verifier.Examples.ShouldPass.Heater                   as Heater
import qualified Copilot.Verifier.Examples.ShouldPass.IntOps                   as IntOps
import qualified Copilot.Verifier.Examples.ShouldPass.Partial.AbsIntMin        as Pass.AbsIntMin
import qualified Copilot.Verifier.Examples.ShouldPass.Partial.AddSignedWrap    as Pass.AddSignedWrap
import qualified Copilot.Verifier.Examples.ShouldPass.Partial.IndexOutOfBounds as Pass.IndexOutOfBounds
import qualified Copilot.Verifier.Examples.ShouldPass.Partial.DivByZero        as Pass.DivByZero
import qualified Copilot.Verifier.Examples.ShouldPass.Partial.ModByZero        as Pass.ModByZero
import qualified Copilot.Verifier.Examples.ShouldPass.Partial.MulSignedWrap    as Pass.MulSignedWrap
import qualified Copilot.Verifier.Examples.ShouldPass.Partial.ShiftLTooLarge   as Pass.ShiftLTooLarge
import qualified Copilot.Verifier.Examples.ShouldPass.Partial.ShiftRTooLarge   as Pass.ShiftRTooLarge
import qualified Copilot.Verifier.Examples.ShouldPass.Partial.SubSignedWrap    as Pass.SubSignedWrap
import qualified Copilot.Verifier.Examples.ShouldPass.Structs                  as Structs
import qualified Copilot.Verifier.Examples.ShouldPass.UpdateArray              as UpdateArray
import qualified Copilot.Verifier.Examples.ShouldPass.UpdateStruct             as UpdateStruct
import qualified Copilot.Verifier.Examples.ShouldPass.Voting                   as Voting
import qualified Copilot.Verifier.Examples.ShouldPass.WCV                      as WCV

shouldFailExamples :: Verbosity -> Map (CI Text) (IO ())
shouldFailExamples :: Verbosity -> Map (CI Text) (IO ())
shouldFailExamples Verbosity
verb = [(CI Text, IO ())] -> Map (CI Text) (IO ())
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
    [ -- Partial operation tests
      Text -> IO () -> (CI Text, IO ())
example Text
"AbsIntMin-fail" (Verbosity -> IO ()
Fail.AbsIntMin.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"AddSignedWrap-fail" (Verbosity -> IO ()
Fail.AddSignedWrap.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"DivByZero-fail" (Verbosity -> IO ()
Fail.DivByZero.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"IndexOutOfBounds-fail" (Verbosity -> IO ()
Fail.IndexOutOfBounds.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"ModByZero-fail" (Verbosity -> IO ()
Fail.ModByZero.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"MulSignedWrap-fail" (Verbosity -> IO ()
Fail.MulSignedWrap.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"ShiftLTooLarge-fail" (Verbosity -> IO ()
Fail.ShiftLTooLarge.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"ShiftRTooLarge-fail" (Verbosity -> IO ()
Fail.ShiftRTooLarge.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"SubSignedWrap-fail" (Verbosity -> IO ()
Fail.SubSignedWrap.verifySpec Verbosity
verb)
    ]

shouldPassExamples :: Verbosity -> Map (CI Text) (IO ())
shouldPassExamples :: Verbosity -> Map (CI Text) (IO ())
shouldPassExamples Verbosity
verb = [(CI Text, IO ())] -> Map (CI Text) (IO ())
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
    [ Text -> IO () -> (CI Text, IO ())
example Text
"Array" (Verbosity -> IO ()
Array.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"ArrayGen" (Verbosity -> IO ()
ArrayGen.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"ArrayOfStructs" (Verbosity -> IO ()
ArrayOfStructs.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"ArrayTriggerArgument" (Verbosity -> IO ()
ArrayTriggerArgument.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"Arith" (Verbosity -> IO ()
Arith.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"Clock" (Verbosity -> IO ()
Clock.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"Counter" (Verbosity -> IO ()
Counter.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"Engine" (Verbosity -> IO ()
Engine.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"FPNegation" (Verbosity -> IO ()
FPNegation.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"FPOps" (Verbosity -> IO ()
FPOps.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"Heater" (Verbosity -> IO ()
Heater.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"IntOps" (Verbosity -> IO ()
IntOps.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"Structs" (Verbosity -> IO ()
Structs.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"UpdateArray" (Verbosity -> IO ()
UpdateArray.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"UpdateStruct" (Verbosity -> IO ()
UpdateStruct.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"Voting" (Verbosity -> IO ()
Voting.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"WCV" (Verbosity -> IO ()
WCV.verifySpec Verbosity
verb)

      -- Partial operation tests
    , Text -> IO () -> (CI Text, IO ())
example Text
"AbsIntMin-pass" (Verbosity -> IO ()
Pass.AbsIntMin.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"AddSignedWrap-pass" (Verbosity -> IO ()
Pass.AddSignedWrap.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"DivByZero-pass" (Verbosity -> IO ()
Pass.DivByZero.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"IndexOutOfBounds-pass" (Verbosity -> IO ()
Pass.IndexOutOfBounds.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"ModByZero-pass" (Verbosity -> IO ()
Pass.ModByZero.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"MulSignedWrap-pass" (Verbosity -> IO ()
Pass.MulSignedWrap.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"ShiftLTooLarge-pass" (Verbosity -> IO ()
Pass.ShiftLTooLarge.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"ShiftRTooLarge-pass" (Verbosity -> IO ()
Pass.ShiftRTooLarge.verifySpec Verbosity
verb)
    , Text -> IO () -> (CI Text, IO ())
example Text
"SubSignedWrap-pass" (Verbosity -> IO ()
Pass.SubSignedWrap.verifySpec Verbosity
verb)
    ]

example :: Text -> IO () -> (CI Text, IO ())
example :: Text -> IO () -> (CI Text, IO ())
example Text
name IO ()
action = (Text -> CI Text
forall s. FoldCase s => s -> CI s
CI.mk Text
name, IO ()
action)