packages feed

newhope-0.1.0.0: test/Test/ConfigFile.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE Trustworthy       #-}
{-|
  Module        : Test.ConfigFile
  Description   : Tests our ability to parse our testing configuration files
  Copyright     : © Jeremy Bornstein 2019
  License       : Apache 2.0
  Maintainer    : jeremy@bornstein.org
  Stability     : experimental
  Portability   : portable

-}

module Test.ConfigFile where


import qualified Data.ByteString   as BS (ByteString)
import qualified Data.Map          as M
import           Prelude
import           Test.Tasty
import           Test.Tasty.HUnit
import           Text.RawString.QQ
import           Text.Trifecta     hiding (expected)

import qualified ConfigFile


maybeSuccess :: Result a -> Maybe a
maybeSuccess (Success a) = Just a
maybeSuccess _           = Nothing


assignmentCheck :: TestTree
assignmentCheck = testCase "Assignment Parsing" $ do
    let m = parseByteString ConfigFile.parseAssignment mempty input
        parsed = maybeSuccess m
        input = "simply=listen"
    assertEqual "simple assignment" parsed $ Just ("simply", "listen")


headerCheck :: TestTree
headerCheck = testCase "Header Parsing" $ do
    let m = parseByteString ConfigFile.parseHeader mempty input
        parsed = maybeSuccess m
        input = "[important]"
    assertEqual "header" parsed $ Just (ConfigFile.Header "important")


commentCheck :: TestTree
commentCheck = testCase "Comment Parsing" $ do
    let p = ConfigFile.skipComments >> ConfigFile.parseHeader
        m = parseByteString p mempty input
        parsed =  maybeSuccess m
        input = "; this is imporant\n[not_important]"
    assertEqual "skip comment before header" parsed $ Just (ConfigFile.Header "not_important")


sectionCheck :: TestTree
sectionCheck = testCase "Section Parsing" $ do
    let m = parseByteString ConfigFile.parseSection mempty input
        parsed = maybeSuccess m
        input  = "; super important\n[cheese_opinions]\ncheddar=fine"
        expected = Just (ConfigFile.Section
                            (ConfigFile.Header "cheese_opinions")
                            (M.fromList [("cheddar", "fine")]))
    assertEqual "skip comment before header" parsed expected


fullFile :: BS.ByteString
fullFile = [r|
; do not read this information
; you may find it artless
[animal_info]
crawler=wombat
bird=colibri

[charming]
quokka=super
|]


fileCheck :: TestTree
fileCheck = testCase "File Parsing" $ do
    let m = parseByteString ConfigFile.parseIni mempty fullFile
        parsed = maybeSuccess m
        sectionValues = M.fromList [ ("bird", "colibri")
                                   , ("crawler", "wombat")]
        charming = M.fromList [("quokka", "super")]
        expected = Just (ConfigFile.Config (M.fromList [ (ConfigFile.Header "animal_info", sectionValues)
                                                       , (ConfigFile.Header "charming", charming)]))
    assertEqual "can parse multiple sections" parsed expected



tests :: TestTree
tests = testGroup "ConfigFile tests" [ assignmentCheck
                                     , headerCheck
                                     , commentCheck
                                     , sectionCheck
                                     , fileCheck
                                     ]