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

module ChangeLogTest where

import Test.Tasty
import GHCup.OptParse
import Utils
import Test.Tasty.HUnit
import Control.Monad.IO.Class
import GHCup.Types
import Data.Versions (versionQ)

changeLogTests :: TestTree
changeLogTests = testGroup "changelog" $ map (uncurry check) checkList
  where
    check :: String -> ChangeLogOptions -> TestTree
    check args expected = testCase args $ do
      res <- changeLogParseWith (words args)
      liftIO $ res @?= expected

checkList :: [(String, ChangeLogOptions)]
checkList =
  [ ("changelog", ChangeLogOptions False Nothing Nothing)
  , ("changelog -o", ChangeLogOptions True Nothing Nothing)
  , ("changelog -t ghc", ChangeLogOptions False (Just GHC) Nothing)
  , ("changelog -t cabal", ChangeLogOptions False (Just Cabal) Nothing)
  , ("changelog -t hls", ChangeLogOptions False (Just HLS) Nothing)
  , ("changelog -t stack", ChangeLogOptions False (Just Stack) Nothing)
  , ("changelog -t ghcup", ChangeLogOptions False (Just GHCup) Nothing)
  , ("changelog 9.2", ChangeLogOptions False Nothing
      (Just $ GHCVersion
        $ GHCTargetVersion
          Nothing
          $(versionQ "9.2"))
    )
  , ("changelog recommended", ChangeLogOptions False Nothing (Just $ ToolTag Recommended))
  , ("changelog -t cabal recommended", ChangeLogOptions False (Just Cabal) (Just $ ToolTag Recommended))
  , ("changelog -t cabal 3.10.1.0", ChangeLogOptions False (Just Cabal)
      (Just $ GHCVersion
        $ GHCTargetVersion
          Nothing
          $(versionQ "3.10.1.0"))
    )
  , ("changelog 2023-07-22", ChangeLogOptions False Nothing (Just (ToolDay (read "2023-07-22"))))
  ]

changeLogParseWith :: [String] -> IO ChangeLogOptions
changeLogParseWith args = do
  ChangeLog a <- parseWith args
  pure a