packages feed

getopt-generics-0.7: 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           Test.Hspec
import           Test.QuickCheck hiding (Result)

import           System.Console.GetOpt.Generics
import           System.Console.GetOpt.Generics.Modifier

spec :: Spec
spec = do
  describe "deriveShortOptions" $ do
    it "includes modifiers for short options" $ do
      deriveShortOptions (Proxy :: Proxy Foo) `shouldBe` [AddShortOption "bar" 'b']

    it "doesn't include modifiers for short options in case of overlaps" $ do
      deriveShortOptions (Proxy :: Proxy Overlap) `shouldBe` []

  describe "mkShortModifiers" $ do
    it "returns only lower-case ascii alpha characters as short options" $ do
      property $ \ strings ->
        mkShortModifiers strings `shouldSatisfy` all (\ (AddShortOption _ c) ->
          isLower c && isAscii c && isAlpha c)

  describe "insertWith" $ do
    it "combines existing values with the given function" $ do
      insertWith (++) (1 :: Integer) "bar" [(1, "foo")]
        `shouldBe` [(1, "foobar")]

  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