packages feed

tomland-1.3.3.3: test/Test/Toml/Parser/Common.hs

{-# LANGUAGE CPP #-}

module Test.Toml.Parser.Common
       ( parseX
       , failOn
       , parseArray
       , parseBool
       , parseDouble
       , parseInteger
       , parseKey
       , parseText
       , parseToml
       , parseDateTime
       , arrayFailOn
       , boolFailOn
       , integerFailOn
       , dateTimeFailOn
       , doubleFailOn
       , textFailOn
       , tomlFailOn
       , quoteWith
       , squote
       , dquote
       , squote3
       , dquote3
       , makeOffset
       , makeZoned
       , int1
       , int2
       , int3
       , int4
       , offset710
       , offset0
       , day1
       , day2
       , hours1
       ) where

import Data.Text (Text)
import Data.Time (Day, LocalTime (..), TimeOfDay (..), TimeZone, ZonedTime (..), fromGregorian,
                  minutesToTimeZone)
import Test.Hspec (Expectation)
import Test.Hspec.Megaparsec (shouldFailOn, shouldParse)
import Text.Megaparsec (Parsec, ShowErrorComponent, parse)
#if __GLASGOW_HASKELL__ <= 804
import Text.Megaparsec (Stream)
#endif
#if MIN_VERSION_megaparsec(9,0,0)
import Text.Megaparsec.Stream (TraversableStream, VisualStream)
#endif

import Toml.Parser.Item (tomlP)
import Toml.Parser.Key (keyP)
import Toml.Parser.String (textP)
import Toml.Parser.Validate (validateItems)
import Toml.Parser.Value (arrayP, boolP, dateTimeP, doubleP, integerP)
import Toml.Type.Key (Key (..))
import Toml.Type.TOML (TOML (..))
import Toml.Type.UValue (UValue (..))


parseX
    :: ( ShowErrorComponent e
#if __GLASGOW_HASKELL__ <= 804
       , Stream s
#endif
#if MIN_VERSION_megaparsec(9,0,0)
       , VisualStream s
       , TraversableStream s
#endif
       , Show a
       , Eq a
       )
    => Parsec e s a -> s -> a -> Expectation
parseX p given expected = parse p "" given `shouldParse` expected

failOn :: Show a => Parsec e s a -> s -> Expectation
failOn p given = parse p "" `shouldFailOn` given

parseArray :: Text -> [UValue] -> Expectation
parseArray = parseX arrayP

parseBool :: Text -> Bool -> Expectation
parseBool = parseX boolP

parseDateTime :: Text -> UValue -> Expectation
parseDateTime = parseX dateTimeP

parseDouble :: Text -> Double -> Expectation
parseDouble = parseX doubleP

parseInteger :: Text -> Integer -> Expectation
parseInteger = parseX integerP

parseKey :: Text -> Key -> Expectation
parseKey = parseX keyP

parseText :: Text -> Text -> Expectation
parseText = parseX textP

parseToml :: Text -> TOML -> Expectation
parseToml test toml = parseX (validateItems <$> tomlP) test (Right toml)

arrayFailOn
  , boolFailOn
  , dateTimeFailOn
  , doubleFailOn
  , integerFailOn
  , textFailOn
  , tomlFailOn :: Text -> Expectation
arrayFailOn     = failOn arrayP
boolFailOn      = failOn boolP
dateTimeFailOn  = failOn dateTimeP
doubleFailOn    = failOn doubleP
integerFailOn   = failOn integerP
textFailOn      = failOn textP
tomlFailOn      = failOn tomlP

-- Surround given text with quotes.
quoteWith :: Text -> Text -> Text
quoteWith q t = q <> t <> q
squote, dquote, squote3, dquote3 :: Text -> Text
squote = quoteWith "'"
dquote = quoteWith "\""
squote3 = quoteWith "'''"
dquote3 = quoteWith "\"\"\""

-- UValue Util

makeZoned :: Day -> TimeOfDay -> TimeZone -> UValue
makeZoned d h offset = UZoned $ ZonedTime (LocalTime d h) offset

makeOffset :: Int -> Int -> TimeZone
makeOffset hours mins = minutesToTimeZone (hours * 60 + mins * signum hours)

-- Test Data

int1, int2, int3, int4 :: UValue
int1 = UInteger 1
int2 = UInteger 2
int3 = UInteger 3
int4 = UInteger 4

offset0, offset710 :: TimeZone
offset0 = makeOffset 0 0
offset710 = makeOffset 7 10

day1, day2 :: Day
day1 = fromGregorian 1979 5 27  -- 1979-05-27
day2 = fromGregorian 1920 12 10 -- 1920-12-10

hours1 :: TimeOfDay
hours1 = TimeOfDay 7 32 0  -- 07:32:00