content: {-# OPTIONS_GHC -fno-warn-missing-fields #-}
  {-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns #-}
  module GetOpt.Declarative.EnvironmentSpec (spec) where
  
  import           Prelude ()
  import           Helper
  
  import           GetOpt.Declarative.Types
  import           GetOpt.Declarative.Environment
  
  spec :: Spec
  spec = do
    describe "parseEnvironmentOption" $ do
      context "with NoArg" $ do
        let
          option :: Option Bool
          option = Option {
            optionName = "some-flag"
          , optionSetter = NoArg $ const True
          }
        it "accepts 'yes'" $ do
          parseEnvironmentOption "FOO" [("FOO_SOME_FLAG", "yes")] False option `shouldBe` Right True
  
        it "rejects other values" $ do
          parseEnvironmentOption "FOO" [("FOO_SOME_FLAG", "no")] False option `shouldBe` invalidValue "FOO_SOME_FLAG" "no"
  
      context "with Flag" $ do
        let
          option :: Option Bool
          option = Option {
            optionName = "some-flag"
          , optionSetter = Flag $ \ value _ -> value
          }
        it "accepts 'yes'" $ do
          parseEnvironmentOption "FOO" [("FOO_SOME_FLAG", "yes")] False option `shouldBe` Right True
  
        it "accepts 'no'" $ do
          parseEnvironmentOption "FOO" [("FOO_SOME_FLAG", "no")] True option `shouldBe` Right False
  
        it "rejects other values" $ do
          parseEnvironmentOption "FOO" [("FOO_SOME_FLAG", "nay")] True option `shouldBe` invalidValue "FOO_SOME_FLAG" "nay"
  
      context "with OptArg" $ do
        let
          option :: Option String
          option = Option {
            optionName = "some-flag"
          , optionSetter = OptArg undefined $ \ (Just arg) _ -> guard (arg == "yes") >> Just arg
          }
  
        it "accepts valid values" $ do
          parseEnvironmentOption "FOO" [("FOO_SOME_FLAG", "yes")] "" option `shouldBe` Right "yes"
  
        it "rejects invalid values" $ do
          parseEnvironmentOption "FOO" [("FOO_SOME_FLAG", "no")] "" option `shouldBe` invalidValue "FOO_SOME_FLAG" "no"
  
      context "with Arg" $ do
        let
          option :: Option String
          option = Option {
            optionName = "some-flag"
          , optionSetter = Arg undefined $ \ arg _ -> guard (arg == "yes") >> Just arg
          }
  
        it "accepts valid values" $ do
          parseEnvironmentOption "FOO" [("FOO_SOME_FLAG", "yes")] "" option `shouldBe` Right "yes"
  
        it "rejects invalid values" $ do
          parseEnvironmentOption "FOO" [("FOO_SOME_FLAG", "no")] "" option `shouldBe` invalidValue "FOO_SOME_FLAG" "no"
    where
      invalidValue name = Left . InvalidValue name
  