packages feed

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