packages feed

opt-env-conf-test-0.0.0.2: test/OptEnvConf/ReaderSpec.hs

{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}

module OptEnvConf.ReaderSpec (spec) where

import Data.GenValidity.Text ()
import Data.List.NonEmpty (NonEmpty (..))
import OptEnvConf.Reader
import Test.Syd
import Test.Syd.Validity

spec :: Spec
spec = do
  describe "renderCommaSeparated" $
    it "escapes commas and backslashes" $
      renderCommaSeparated ("hi" :| [",", "\\", "ho"])
        `shouldBe` "hi,\\,,\\\\,ho"

  describe "parseCommaSeparated" $ do
    it "roundtrips with renderCommaSeparated starting from Strings" $
      forAllValid $ \s ->
        renderCommaSeparated (parseCommaSeparated s)
          `shouldBe` s
    it "roundtrips with renderCommaSeparated starting from lists" $
      forAllValid $ \l ->
        parseCommaSeparated (renderCommaSeparated l) `shouldBe` l

  describe "commaSeparated" $ do
    it "can parse these two ints" $
      runReader (commaSeparated auto) "1,2"
        `shouldBe` Right [1, 2 :: Int]

  describe "commaSeparatedList" $ do
    it "can parse these two ints" $
      runReader (commaSeparatedList auto) "3, 4"
        `shouldBe` Right [3, 4 :: Int]

  describe "commaSeparatedSet" $ do
    it "can parse these two ints" $
      runReader (commaSeparatedSet auto) "5,  6"
        `shouldBe` Right [5, 6 :: Int]

  describe "maybeReader" $
    it "can parse a bool using this example reader" $ do
      let r = maybeReader $ \case
            "true" -> Just True
            "false" -> Just False
            _ -> Nothing
      runReader r "true" `shouldBe` Right True
      runReader r "false" `shouldBe` Right False
      runReader r "yes" `shouldBe` Left "Unparseable value: \"yes\""

  describe "viaStringCodec" $
    it "can parse a string via its string codec" $
      runReader viaStringCodec "hi" `shouldBe` Right ("hi" :: String)