packages feed

ghcup-0.2.6.2: test/optparse-test/SetTest.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}

module SetTest where

import GHCup.OptParse
import GHCup.Input.Parsers (SetToolVersion(..))
import Test.Tasty
import GHCup.Types
import Data.Versions
import Data.List.NonEmpty (NonEmpty ((:|)))
import Utils

setTests :: TestTree
setTests =
  testGroup "set"
    $ map
        (buildTestTree setParseWith)
        [ ("ghc", setGhcCheckList)
        , ("cabal", setCabalCheckList)
        , ("hls", setHlsCheckList)
        , ("stack", setStackCheckList)
        ]

setGhcCheckList :: [(String, SetCommand)]
setGhcCheckList = mapSecond (SetGHC . SetOptions)
  [ ("set ghc", SetRecommended)
  , ("set ghc 9.2", SetGHCVersion
        $ (`TargetVersionReq` Nothing) $ TargetVersion
          Nothing
          $(versionQ "9.2")
    )
  , ("set ghc next", SetNext)
  , ("set ghc latest", SetToolTag Latest)
  , ("set ghc nightly", SetGHCVersion
        $ (`TargetVersionReq` Nothing) $ TargetVersion
          Nothing
          $(versionQ "nightly")
    )
  , ("set ghc recommended", SetToolTag Recommended)
  , ("set ghc prerelease", SetToolTag Prerelease)
  , ("set ghc latest-prerelease", SetToolTag LatestPrerelease)
  , ("set ghc latest-nightly", SetToolTag LatestNightly)
  , ("set ghc javascript-unknown-ghcjs-9.6", SetGHCVersion
        $ (`TargetVersionReq` Nothing) $ TargetVersion
          (Just "javascript-unknown-ghcjs")
          $(versionQ "9.6")
    )
  , ("set ghc base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
  ]

setCabalCheckList :: [(String, SetCommand)]
setCabalCheckList = mapSecond (SetCabal . SetOptions)
  [ ("set cabal", SetRecommended)
  , ("set cabal 3.10", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "3.10"))
  , ("set cabal next", SetNext)
  , ("set cabal latest", SetToolTag Latest)
  , ("set cabal nightly", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))
  , ("set cabal recommended", SetToolTag Recommended)
  , ("set cabal prerelease", SetToolTag Prerelease)
  , ("set cabal latest-prerelease", SetToolTag LatestPrerelease)
  , ("set cabal latest-nightly", SetToolTag LatestNightly)
  , ("set cabal base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
  , ("set cabal cabal-3.10", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "cabal-3.10"))
  ]

setHlsCheckList :: [(String, SetCommand)]
setHlsCheckList = mapSecond (SetHLS . SetOptions)
  [ ("set hls", SetRecommended)
  , ("set hls 2.0", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "2.0"))
  , ("set hls next", SetNext)
  , ("set hls latest", SetToolTag Latest)
  , ("set hls nightly", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))
  , ("set hls recommended", SetToolTag Recommended)
  , ("set hls prerelease", SetToolTag Prerelease)
  , ("set hls latest-prerelease", SetToolTag LatestPrerelease)
  , ("set hls latest-nightly", SetToolTag LatestNightly)
  , ("set hls base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
  , ("set hls hls-2.0", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "hls-2.0"))
  ]

setStackCheckList :: [(String, SetCommand)]
setStackCheckList = mapSecond (SetStack . SetOptions)
  [ ("set stack", SetRecommended)
  , ("set stack 2.9", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "2.9"))
  , ("set stack next", SetNext)
  , ("set stack latest", SetToolTag Latest)
  , ("set stack nightly", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "nightly"))
  , ("set stack recommended", SetToolTag Recommended)
  , ("set stack prerelease", SetToolTag Prerelease)
  , ("set stack latest-prerelease", SetToolTag LatestPrerelease)
  , ("set stack latest-nightly", SetToolTag LatestNightly)
  , ("set stack base-4.18", SetToolTag (Base (PVP {_pComponents = 4 :| [18]})))
  , ("set stack stack-2.9", SetToolVersion $ (`VersionReq` Nothing) $(versionQ "stack-2.9"))
  ]

setParseWith :: [String] -> IO SetCommand
setParseWith args = do
  Set a <- parseWith args
  pure a