packages feed

mmzk-env-0.2.1.0: test/EnumParserSpec.hs

module EnumParserSpec ( spec ) where

import Data.Either ( isLeft )
import Data.Env.EnumParser
import Data.Env.TypeParser
import Test.Hspec

-- Test enum types
data Gender = Male | Female
  deriving (Show, Eq, Enum, Bounded)
  deriving TypeParser via (EnumParser Gender)

data LogLevel = Debug | Info | Warning | Error
  deriving (Show, Eq, Enum, Bounded)
  deriving TypeParser via (EnumParser LogLevel)

spec :: Spec
spec = describe "EnumParser" do
  describe "parse Gender enum" do
    it "parses Male" do
      parseType @Gender "Male" `shouldBe` Right Male
    it "parses Female" do
      parseType @Gender "Female" `shouldBe` Right Female
    it "fails to parse invalid value" do
      parseType @Gender "Other" `shouldSatisfy` isLeft
      parseType @Gender "male" `shouldSatisfy` isLeft
      parseType @Gender "MALE" `shouldSatisfy` isLeft
      parseType @Gender "" `shouldSatisfy` isLeft

  describe "parse LogLevel enum" do
    it "parses Debug" do
      parseType @LogLevel "Debug" `shouldBe` Right Debug
    it "parses Info" do
      parseType @LogLevel "Info" `shouldBe` Right Info
    it "parses Warning" do
      parseType @LogLevel "Warning" `shouldBe` Right Warning
    it "parses Error" do
      parseType @LogLevel "Error" `shouldBe` Right Error
    it "fails to parse invalid values" do
      parseType @LogLevel "debug" `shouldSatisfy` isLeft
      parseType @LogLevel "INFO" `shouldSatisfy` isLeft
      parseType @LogLevel "Warn" `shouldSatisfy` isLeft
      parseType @LogLevel "" `shouldSatisfy` isLeft