module WithCliSpec where import System.Environment import System.Exit import System.IO import System.IO.Silently import Test.Hspec import WithCli spec :: Spec spec = do describe "withCli" $ do context "no arguments" $ do it "executes the operation in case of no command line arguments" $ do let main :: IO () main = putStrLn "success" (capture_ $ withArgs [] $ withCli main) `shouldReturn` "success\n" it "produces nice error messages" $ do let main :: IO () main = putStrLn "success" output <- hCapture_ [stderr] (withArgs ["foo"] (withCli main) `shouldThrow` (== ExitFailure 1)) output `shouldBe` "unknown argument: foo\n" context "1 argument" $ do it "parses Ints" $ do let main :: Int -> IO () main n = putStrLn ("success: " ++ show n) (capture_ $ withArgs ["12"] $ withCli main) `shouldReturn` "success: 12\n" it "error parsing" $ do let main :: Int -> IO () main n = putStrLn ("error: " ++ show n) output <- hCapture_ [stderr] (withArgs (words "12 foo") (withCli main) `shouldThrow` (== ExitFailure 1)) output `shouldBe` "unknown argument: foo\n" it "handle Maybes as positional arguments with a proper error message" $ do let main :: Maybe Int -> IO () main = error "main" output <- hCapture_ [stderr] (withCli main `shouldThrow` (== ExitFailure 1)) output `shouldBe` "cannot use Maybes for positional arguments\n"