{-# LANGUAGE OverloadedStrings #-}
import Control.Applicative ((<|>))
import Data.List.NonEmpty (NonEmpty(..))
import Data.Text.Read (decimal)
import Flags.Applicative
import Test.Hspec
import Test.Hspec.QuickCheck
main :: IO ()
main = hspec $ do
describe "parse" $ do
it "should parse a single flag" $ do
let
parser = textFlag "foo" ""
res = parseFlags parser ["--foo=abc", "hi"]
res `shouldBe` Right ("abc", ["hi"])
it "should fail on duplicate flag" $ do
let
parser = (,) <$> textFlag "foo" "" <*> textFlag "foo" ""
res = parseFlags parser []
res `shouldBe` Left (InvalidParser $ DuplicateFlag "foo")
it "should fail on unknown flags" $ do
let
parser = textFlag "foo" ""
res = parseFlags parser ["hi", "--bar"]
res `shouldBe` Left (UnknownFlag "bar")
it "should detect unexpected flags" $ do
let
parser = boolFlag "bar" "" <|> boolFlag "foo" ""
res = parseFlags parser ["--bar", "--foo"]
res `shouldBe` Left (UnexpectedFlags ("foo" :| []))
it "should branch correctly with unary flags" $ do
let
parser = (Right <$> textFlag "ok" "") <|> (Left <$> textFlag "fail" "")
res = parseFlags parser ["--ok", "yes", "no"]
res `shouldBe` Right (Right "yes", ["no"])
it "should branch correctly with nullary flags" $ do
let
parser = (True <$ boolFlag "true" "") <|> (False <$ boolFlag "false" "")
res = parseFlags parser ["--true", "b", "a"]
res `shouldBe` Right (True, ["b", "a"])
it "should fail on inconsistent flag values" $ do
let
parser = textFlag "foo" ""
res = parseFlags parser ["--foo=1", "--foo=2"]
res `shouldBe` Left (InconsistentFlagValues "foo")
it "should support the same flag value multiple times" $ do
let
parser = numericFlag decimal "foo" "" :: FlagParser Int
res = parseFlags parser ["--foo=1", "--foo=1"]
res `shouldBe` Right (1, [])