{-# LANGUAGE OverloadedStrings #-}

module CodeAction.AutoSpec where

import Wingman.Types
import Test.Hspec
import Utils


spec :: Spec
spec = do
  let autoTest = goldenTest Auto ""
      autoTestNoWhitespace = goldenTestNoWhitespace Auto ""

  describe "golden" $ do
    autoTest 11  8 "AutoSplitGADT"
    autoTest  2 11 "GoldenEitherAuto"
    autoTest  4 12 "GoldenJoinCont"
    autoTest  3 11 "GoldenIdentityFunctor"
    autoTest  7 11 "GoldenIdTypeFam"
    autoTest  2 15 "GoldenEitherHomomorphic"
    autoTest  2  8 "GoldenNote"
    autoTest  2 12 "GoldenPureList"
    autoTest  2 12 "GoldenListFmap"
    autoTest  2 13 "GoldenFromMaybe"
    autoTest  2 10 "GoldenFoldr"
    autoTest  2  8 "GoldenSwap"
    autoTest  4 11 "GoldenFmapTree"
    autoTest  7 13 "GoldenGADTAuto"
    autoTest  2 12 "GoldenSwapMany"
    autoTest  4 12 "GoldenBigTuple"
    autoTest  2 10 "GoldenShow"
    autoTest  2 15 "GoldenShowCompose"
    autoTest  2  8 "GoldenShowMapChar"
    autoTest  7  8 "GoldenSuperclass"
    autoTest  2 12 "GoldenSafeHead"
    autoTest  2 12 "FmapBoth"
    autoTest  7  8 "RecordCon"
    autoTest  6  8 "NewtypeRecord"
    autoTest  2 14 "FmapJoin"
    autoTest  2  9 "Fgmap"
    autoTest  4 19 "FmapJoinInLet"
    autoTest  9 12 "AutoEndo"
    autoTest  2 16 "AutoEmptyString"
    autoTest  7 35 "AutoPatSynUse"
    autoTest  2 28 "AutoZip"
    autoTest  2 17 "AutoInfixApply"
    autoTest  2 19 "AutoInfixApplyMany"
    autoTest  2 25 "AutoInfixInfix"
    autoTest 19 12 "AutoTypeLevel"
    autoTest 11  9 "AutoForallClassMethod"
    autoTest  2  8 "AutoUnusedPatternMatch"

    failing "flaky in CI" $
      autoTest 2 11 "GoldenApplicativeThen"

    failing "not enough auto gas" $
      autoTest 5 18 "GoldenFish"

  describe "theta" $ do
    autoTest 12 10 "AutoThetaFix"
    autoTest  7 27 "AutoThetaRankN"
    autoTest  6 10 "AutoThetaGADT"
    autoTest  6  8 "AutoThetaGADTDestruct"
    autoTest  4  8 "AutoThetaEqCtx"
    autoTest  6 10 "AutoThetaEqGADT"
    autoTest  6  8 "AutoThetaEqGADTDestruct"
    autoTest  6 10 "AutoThetaRefl"
    autoTest  6  8 "AutoThetaReflDestruct"
    autoTest 19 30 "AutoThetaMultipleUnification"
    autoTest 16  9 "AutoThetaSplitUnification"

  describe "known" $ do
    autoTest 25 13 "GoldenArbitrary"
    autoTest  6 13 "GoldenArbitrarySingleConstructor"
    autoTestNoWhitespace
              6 10 "KnownBigSemigroup"
    autoTest  4 10 "KnownThetaSemigroup"
    autoTest  6 10 "KnownCounterfactualSemigroup"
    autoTest 10 10 "KnownModuleInstanceSemigroup"
    autoTest  4 22 "KnownDestructedSemigroup"
    autoTest  4 10 "KnownMissingSemigroup"
    autoTest  7 12 "KnownMonoid"
    autoTest  7 12 "KnownPolyMonoid"
    autoTest  7 12 "KnownMissingMonoid"


  describe "messages" $ do
    mkShowMessageTest Auto ""  2 8 "MessageForallA"      TacticErrors
    mkShowMessageTest Auto ""  7 8 "MessageCantUnify"    TacticErrors
    mkShowMessageTest Auto "" 12 8 "MessageNotEnoughGas" NotEnoughGas