content: {-# LANGUAGE CPP #-}
  module Cabal.OptionsSpec (spec) where
  
  import           Imports
  
  import           Test.Hspec
  
  import           System.IO
  import           System.IO.Silently
  import           System.Exit
  import           System.Process
  import           Data.Set ((\\))
  import qualified Data.Set as Set
  
  import qualified Cabal.ReplOptionsSpec as Repl
  
  import           Cabal.Options
  
  spec :: Spec
  spec = do
    describe "replOnlyOptions" $ do
      it "is the set of options that are unique to 'cabal repl'" $ do
        build <- Set.fromList . lines <$> readProcess "cabal" ["build", "--list-options"] ""
        repl <- Set.fromList . lines <$> readProcess "cabal" ["repl", "--list-options"] ""
        Set.toList replOnlyOptions `shouldMatchList` Set.toList (repl \\ build)
  
    describe "rejectUnsupportedOptions" $ do
      it "produces error messages that are consistent with 'cabal repl'" $ do
        let
          shouldFail :: HasCallStack => String -> IO a -> Expectation
          shouldFail command action = do
            hCapture_ [stderr] (action `shouldThrow` (== ExitFailure 1))
              `shouldReturn` "Error: cabal: unrecognized '" <> command <> "' option `--installdir'\n"
  
  #ifndef mingw32_HOST_OS
        shouldFail "repl" $ call "cabal" ["repl", "--installdir"]
  #endif
        shouldFail "doctest" $ rejectUnsupportedOptions ["--installdir"]
  
      context "with --list-options" $ do
        it "lists supported command-line options" $ do
          repl <- Set.fromList . lines <$> readProcess "cabal" ["repl", "--list-options"] ""
          doctest <- Set.fromList . lines <$> capture_ (rejectUnsupportedOptions ["--list-options"] `shouldThrow` (== ExitSuccess))
          Set.toList (doctest \\ repl) `shouldMatchList` []
          Set.toList (repl \\ doctest) `shouldMatchList` Set.toList Repl.unsupported
  
    describe "discardReplOptions" $ do
      it "discards 'cabal repl'-only options" $ do
        discardReplOptions [
            "-w", "ghc-9.10"
          , "--build-depends=foo"
          , "--build-depends", "foo"
          , "-bfoo"
          , "-b", "foo"
          , "--disable-optimization"
          , "--enable-multi-repl"
          , "--repl-options", "foo"
          , "--repl-options=foo"
          , "--allow-newer"
          ] `shouldBe` ["--with-compiler=ghc-9.10", "--disable-optimization", "--allow-newer"]
  