content: {-# LANGUAGE NoImplicitPrelude #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE OverloadedLists #-}
  {-# LANGUAGE TemplateHaskell #-}
  
  module Cmt.Parser.ConfigTest where
  
  import ClassyPrelude
  
  import Test.Tasty
  import Test.Tasty.HUnit
  
  import Data.FileEmbed (embedFile)
  
  import Cmt.Parser.Config (config, predefined)
  import Cmt.Types.Config
  
  basic :: Text
  basic = decodeUtf8 $(embedFile "test/data/.cmt")
  
  basicConfig :: Config
  basicConfig = Config [Part "Week" Line] [Named "Week", Literal ": ", Named "*", Literal "\n"]
  
  angular :: Text
  angular = decodeUtf8 $(embedFile "test/data/.cmt-angular")
  
  comments :: Text
  comments = decodeUtf8 $(embedFile "test/data/.cmt-comments")
  
  angularConfig :: Config
  angularConfig =
      Config
          [ Part "Type" (Options ["feat", "fix", "docs", "style", "refactor", "test", "chore"])
          , Part "Scope" Changed
          , Part "Short Message" Line
          , Part "Body" Lines
          ]
          [ Named "Type"
          , Literal " ("
          , Named "Scope"
          , Literal "): "
          , Named "Short Message"
          , Literal "\n\n"
          , Named "Body"
          , Literal "\n"
          ]
  
  pre :: Text
  pre = decodeUtf8 $(embedFile "test/data/.cmt-predefined")
  
  preWithVars :: Text
  preWithVars = decodeUtf8 $(embedFile "test/data/.cmt-predefined-with-vars")
  
  preConfig :: PreDefinedParts
  preConfig =
      [ ("vb", Config [] [Literal "chore (package.yaml): version bump"])
      , ("readme", Config [] [Literal "docs (README.md): updated readme"])
      ]
  
  preWithVarsConfig :: PreDefinedParts
  preWithVarsConfig =
      [ ( "vb"
        , Config [Part "Scope" Changed] [Literal "chore (", Named "Scope", Literal "): version bump"])
      , ( "readme"
        , Config [Part "Short Message" Line] [Literal "docs (README.md): ", Named "Short Message"])
      , ("multiline", Config [] [Literal "This\nNow works # but comments are included\nI believe\n"])
      ]
  
  -- import Test.Tasty.HUnit
  test_config :: TestTree
  test_config =
      testGroup
          "Cmt.Parser.Config"
          [ testGroup
                "config"
                [ testCase
                      "basic"
                      (assertEqual "Gives back correct format" (Right basicConfig) (config basic))
                , testCase
                      "angular"
                      (assertEqual "Gives back correct format" (Right angularConfig) (config angular))
                , testCase
                      "comments"
                      (assertEqual "Gives back correct format" (Right angularConfig) (config comments))
                ]
          , testGroup
                "predefined"
                [ testCase
                      "angular"
                      (assertEqual "Gives back correct format" (Right []) (predefined comments))
                , testCase
                      "predefined"
                      (assertEqual "Gives back correct format" (Right preConfig) (predefined pre))
                , testCase
                      "predefined with variables"
                      (assertEqual
                           "Gives back correct format"
                           (Right preWithVarsConfig)
                           (predefined preWithVars))
                ]
          ]
  