diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..92806eb --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +end_of_line = LF +trim_trailing_whitespace = true +insert_final_newline = true + +[*.hs] +indent_style = space +indent_size = 2 +max_line_length = 80 \ No newline at end of file diff --git a/app/ghcup/GHCup/OptParse/ChangeLog.hs b/app/ghcup/GHCup/OptParse/ChangeLog.hs index f209a74..7734d70 100644 --- a/app/ghcup/GHCup/OptParse/ChangeLog.hs +++ b/app/ghcup/GHCup/OptParse/ChangeLog.hs @@ -49,7 +49,7 @@ data ChangeLogOptions = ChangeLogOptions { clOpen :: Bool , clTool :: Maybe Tool , clToolVer :: Maybe ToolVersion - } + } deriving (Eq, Show) diff --git a/ghcup.cabal b/ghcup.cabal index 1ecfcfb..bb8bcc4 100644 --- a/ghcup.cabal +++ b/ghcup.cabal @@ -418,7 +418,8 @@ test-suite ghcup-optparse-test other-modules: SetTest Utils - DebugInfoTest + OtherCommandTest + ChangeLogTest default-language: Haskell2010 ghc-options: -Wall - build-depends: base, ghcup, ghcup-optparse, tasty, tasty-hunit, optparse-applicative, versions, text \ No newline at end of file + build-depends: base, ghcup, ghcup-optparse, tasty, tasty-hunit, optparse-applicative, versions, text diff --git a/lib/GHCup/Types.hs b/lib/GHCup/Types.hs index e67e720..eff9d0d 100644 --- a/lib/GHCup/Types.hs +++ b/lib/GHCup/Types.hs @@ -710,6 +710,7 @@ data ToolVersion = GHCVersion GHCTargetVersion | ToolVersion Version | ToolTag Tag | ToolDay Day + deriving (Eq, Show) instance Pretty ToolVersion where pPrint (GHCVersion v) = pPrint v diff --git a/test/optparse-test/ChangeLogTest.hs b/test/optparse-test/ChangeLogTest.hs new file mode 100644 index 0000000..5179cad --- /dev/null +++ b/test/optparse-test/ChangeLogTest.hs @@ -0,0 +1,49 @@ +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 +import Data.List.NonEmpty (NonEmpty ((:|))) + +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 + (mkVersion $ (Digits 9 :| []) :| [Digits 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 + (mkVersion $ (Digits 3 :| []) :| [Digits 10 :| [],Digits 1 :| [],Digits 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 diff --git a/test/optparse-test/DebugInfoTest.hs b/test/optparse-test/DebugInfoTest.hs deleted file mode 100644 index 719483e..0000000 --- a/test/optparse-test/DebugInfoTest.hs +++ /dev/null @@ -1,18 +0,0 @@ -module DebugInfoTest where - -import Test.Tasty -import Test.Tasty.HUnit -import GHCup.OptParse -import Utils -import Control.Monad.IO.Class - -debugInfoTests :: TestTree -debugInfoTests = - testGroup "debug-info" $ pure - $ testCase "1. debug-info" $ do - res <- parseWith ["debug-info"] - liftIO $ assertBool "debug-info parse failed" (isDInfo res) - where - isDInfo :: Command -> Bool - isDInfo DInfo = True - isDInfo _ = False diff --git a/test/optparse-test/Main.hs b/test/optparse-test/Main.hs index 4bc34e1..a84fa0d 100644 --- a/test/optparse-test/Main.hs +++ b/test/optparse-test/Main.hs @@ -1,10 +1,12 @@ module Main where import Test.Tasty import qualified SetTest -import qualified DebugInfoTest +import qualified OtherCommandTest +import qualified ChangeLogTest main :: IO () main = defaultMain $ testGroup "ghcup" [ SetTest.setTests - , DebugInfoTest.debugInfoTests - ] \ No newline at end of file + , OtherCommandTest.otherCommandTests + , ChangeLogTest.changeLogTests + ] diff --git a/test/optparse-test/OtherCommandTest.hs b/test/optparse-test/OtherCommandTest.hs new file mode 100644 index 0000000..5b1c3af --- /dev/null +++ b/test/optparse-test/OtherCommandTest.hs @@ -0,0 +1,24 @@ +module OtherCommandTest where + +import Test.Tasty +import Test.Tasty.HUnit +import GHCup.OptParse +import Utils +import Control.Monad.IO.Class + +otherCommandTests :: TestTree +otherCommandTests = testGroup "other command" + [ testCase "debug-info" $ do + res <- parseWith ["debug-info"] + liftIO $ assertBool "debug-info parse failed" (isDInfo res) + , testCase "tool-requirements" $ do + ToolRequirements opt <- parseWith ["tool-requirements"] + liftIO $ tlrRaw opt @?= False + , testCase "tool-requirements -r" $ do + ToolRequirements opt <- parseWith ["tool-requirements", "--raw-format"] + liftIO $ tlrRaw opt @?= True + ] + +isDInfo :: Command -> Bool +isDInfo DInfo = True +isDInfo _ = False diff --git a/test/optparse-test/SetTest.hs b/test/optparse-test/SetTest.hs index f39902b..767797a 100644 --- a/test/optparse-test/SetTest.hs +++ b/test/optparse-test/SetTest.hs @@ -33,9 +33,6 @@ setTests = res <- setParseWith (words args) liftIO $ res @?= expected -mkVersion :: NonEmpty VChunk -> Version -mkVersion chunks = Version Nothing chunks [] Nothing - oldStyleCheckList :: [(String, Either SetCommand SetOptions)] oldStyleCheckList = mapSecond (Right . SetOptions) [ ("set", SetRecommended) diff --git a/test/optparse-test/Utils.hs b/test/optparse-test/Utils.hs index 7874f2c..01bd76f 100644 --- a/test/optparse-test/Utils.hs +++ b/test/optparse-test/Utils.hs @@ -3,6 +3,8 @@ module Utils where import GHCup.OptParse as GHCup import Options.Applicative import Data.Bifunctor +import Data.Versions +import Data.List.NonEmpty (NonEmpty) parseWith :: [String] -> IO Command parseWith args = @@ -15,3 +17,6 @@ padLeft desiredLength s = padding ++ s mapSecond :: (b -> c) -> [(a,b)] -> [(a,c)] mapSecond = map . second + +mkVersion :: NonEmpty VChunk -> Version +mkVersion chunks = Version Nothing chunks [] Nothing