{-# LANGUAGE DeriveGeneric #-}
module ModifiersSpec where
import Data.List
import Test.Hspec
import System.Console.GetOpt.Generics
import System.Console.GetOpt.GenericsSpec
import Util
spec :: Spec
spec = do
describe "AddShortOption" $ do
it "allows modifiers for short options" $ do
modsParse [AddShortOption "camel-case" 'x'] "-x foo"
`shouldBe` Success (CamelCaseOptions "foo")
it "allows modifiers in camelCase" $ do
modsParse [AddShortOption "camelCase" 'x'] "-x foo"
`shouldBe` Success (CamelCaseOptions "foo")
let parse' :: String -> Result CamelCaseOptions
parse' = modsParse [AddShortOption "camelCase" 'x']
it "includes the short option in the help" $ do
let OutputAndExit output = parse' "--help"
output `shouldContain` "-x STRING"
describe "RenameOption" $ do
it "allows to rename options" $ do
modsParse [RenameOption "camelCase" "bla"] "--bla foo"
`shouldBe` Success (CamelCaseOptions "foo")
context "when shadowing earlier modifiers with later modifiers" $ do
let parse' = modsParse
[RenameOption "camelCase" "foo", RenameOption "camelCase" "bar"]
it "uses the later renaming" $ do
parse' "--bar foo" `shouldBe` Success (CamelCaseOptions "foo")
it "disregards the earlier renaming" $ do
let Errors errs = parse' "--foo foo"
errs `shouldContain` ["unrecognized option `--foo'"]
it "contains renamed options in error messages" $ do
let Errors errs = modsParse
[RenameOption "camelCase" "foo"]
"" :: Result CamelCaseOptions
show errs `shouldNotContain` "camelCase"
show errs `shouldContain` "foo"
it "allows to address fields in Modifiers in slugified form" $ do
modsParse [RenameOption "camel-case" "foo"] "--foo bar"
`shouldBe` Success (CamelCaseOptions "bar")
it "" $ do
modsParse [RenameOption "bar" "one", RenameOption "baz" "two"] "--one 1 --two foo"
`shouldBe` Success (Foo (Just 1) "foo" False)
describe "AddVersionFlag" $ do
it "implements --version" $ do
let OutputAndExit output = modsParse [AddVersionFlag "1.0.0"] "--version" :: Result Foo
output `shouldBe` "prog-name version 1.0.0\n"
it "--help takes precedence over --version" $ do
let OutputAndExit output = modsParse [AddVersionFlag "1.0.0"] "--version --help" :: Result Foo
output `shouldSatisfy` ("show help and exit" `isInfixOf`)
it "--version shows up in help output" $ do
let OutputAndExit output = modsParse [AddVersionFlag "1.0.0"] "--help" :: Result Foo
output `shouldSatisfy` ("show version and exit" `isInfixOf`)