packages feed

stan-0.0.0.0: test/Test/Stan/Toml.hs

module Test.Stan.Toml
    ( tomlSpec
    ) where

import Hedgehog (forAll, (===))
import Test.Hspec (Spec, describe, it, shouldReturn)
import Test.Hspec.Hedgehog (hedgehog)
import Trial (Trial (..), fiasco, withTag)

import Stan.Config (Check (..), CheckFilter (..), CheckType (..), Config, ConfigP (..),
                    PartialConfig, Scope (..), finaliseConfig)
import Stan.Core.Id (Id (..))
import Stan.Toml (configCodec)
import Test.Stan.Gen (Property, genConfig)

import qualified Toml


tomlSpec :: Spec
tomlSpec = describe "TOML configuration tests" $ do
    it "decode . encode ≡ pure" configTomlRoundtripProperty
    it "Parses test/.stan.example.toml" $
        Toml.decodeFile configCodec "test/.stan-example.toml" `shouldReturn` configExample
  where
    configExample :: PartialConfig
    configExample = ConfigP
        { configChecks = withTag "TOML" $ pure
            [ Check Exclude CheckAll (ScopeDirectory "test/")
            , Check Include CheckAll ScopeAll
            , Check Exclude (CheckInspection $ Id "STAN-0002") ScopeAll
            , Check
                Exclude
                (CheckInspection $ Id "STAN-0001")
                (ScopeFile "src/MyFile.hs")
            ]
        , configRemoved = withTag "TOML" $ pure [] <> fiasco "No TOML value is specified for key: remove"
        , configIgnored = withTag "TOML" $ pure [] <> fiasco "No TOML value is specified for key: ignore"
        }

configTomlRoundtripProperty :: Property
configTomlRoundtripProperty = hedgehog $ do
    config <- forAll genConfig
    case Toml.decode configCodec $ Toml.encode configCodec $ toPartialConfig config of
        Right partialConfig -> case finaliseConfig partialConfig of
            Result _ res -> config === res
            Fiasco _     -> fail "Expected Result, but this is Fiasco, bro"
        Left _ -> fail "Expected Right"

toPartialConfig :: Config -> PartialConfig
toPartialConfig ConfigP{..} = ConfigP
    { configChecks = withTag "TOML" $ pure configChecks
    , configRemoved = withTag "TOML" $ pure configRemoved
    , configIgnored = withTag "TOML" $ pure configIgnored
    }