getopt-generics-0.9: test/System/Console/GetOpt/Generics/ModifierSpec.hs
{-# LANGUAGE DeriveGeneric #-}
module System.Console.GetOpt.Generics.ModifierSpec where
import Data.Char
import Data.Proxy
import qualified GHC.Generics
import Generics.SOP
import Test.Hspec
import Test.QuickCheck hiding (Result(..))
import System.Console.GetOpt.Generics.GetArguments
import System.Console.GetOpt.Generics.Modifier
import System.Console.GetOpt.Generics.Result
spec :: Spec
spec = do
describe "deriveShortOptions" $ do
it "includes modifiers for short options" $ do
let [AddShortOption long short] = deriveShortOptions (Proxy :: Proxy Foo)
(long, short) `shouldBe` ("bar", 'b')
it "doesn't include modifiers for short options in case of overlaps" $ do
null (deriveShortOptions (Proxy :: Proxy Overlap))
describe "mkShortModifiers" $ do
it "returns only lower-case ascii alpha characters as short options" $ do
property $ \ strings ->
all
(\ (AddShortOption _ c) -> isLower c && isAscii c && isAlpha c)
(mkShortModifiers strings)
describe "insertWith" $ do
it "combines existing values with the given function" $ do
insertWith (++) (1 :: Integer) "bar" [(1, "foo")]
`shouldBe` [(1, "foobar")]
describe "getVersion" $ do
it "returns the version" $ do
let modifiers = mkModifiers [AddVersionFlag "1.0.0"]
getVersion modifiers `shouldBe` Just "1.0.0"
context "when used with Modifiers" $ do
describe "parseArguments" $ do
it "allows to specify a flag specific help" $ do
let OutputAndExit output =
parseArguments "prog-name" [AddOptionHelp "bar" "bar help text"]
(words "--help") :: Result Foo
output `shouldContain` "--bar=STRING bar help text"
data Foo
= Foo {
bar :: String
}
deriving (GHC.Generics.Generic)
instance Generic Foo
instance HasDatatypeInfo Foo
data Overlap
= Overlap {
foo :: String,
fooo :: String
}
deriving (GHC.Generics.Generic)
instance Generic Overlap
instance HasDatatypeInfo Overlap