packages feed

tomland-1.2.1.0: test/Test/Toml/Parsing/Unit/Array.hs

{-# LANGUAGE FlexibleContexts #-}

module Test.Toml.Parsing.Unit.Array where

import Data.Time (TimeOfDay (..))
import Test.Tasty.Hspec (Spec, describe, it)

import Toml.Type (UValue (..))

import Test.Toml.Parsing.Unit.Common (arrayFailOn, day1, day2, int1, int2, int3, int4, parseArray)

arraySpecs :: Spec
arraySpecs = describe "arrayP" $ do
    it "can parse arrays" $ do
        parseArray "[]"              []
        parseArray "[1]"             [int1]
        parseArray "[1, 2, 3]"       [int1, int2, int3]
        parseArray "[1.2, 2.3, 3.4]" [UDouble 1.2, UDouble 2.3, UDouble 3.4]
        parseArray "['x', 'y']"      [UText "x", UText "y"]
        parseArray "[[1], [2]]" [UArray [UInteger 1], UArray [UInteger 2]]
        parseArray "[1920-12-10, 1979-05-27]" [UDay  day2, UDay day1]
        parseArray "[16:33:05, 10:15:30]" [UHours (TimeOfDay 16 33 5), UHours (TimeOfDay 10 15 30)]
    it "can parse multiline arrays" $
        parseArray "[\n1,\n2\n]" [int1, int2]
    it "can parse an array of arrays" $
        parseArray "[[1], [2.3, 5.1]]" [UArray [int1], UArray [UDouble 2.3, UDouble 5.1]]
    it "can parse an array with terminating commas (trailing commas)" $ do
        parseArray "[1, 2,]"        [int1, int2]
        parseArray "[1, 2, 3, , ,]" [int1, int2, int3]
    it "allows an arbitrary number of comments and newlines before or after a value" $
        parseArray "[\n\n#c\n1, #c 2 \n 2, \n\n\n 3, #c \n #c \n 4]" [int1, int2, int3, int4]
    it "ignores white spaces" $
        parseArray "[   1    ,    2,3,  4      ]" [int1, int2, int3, int4]
    it "fails if the elements are not surrounded by square brackets" $ do
        arrayFailOn "1, 2, 3"
        arrayFailOn "[1, 2, 3"
        arrayFailOn "1, 2, 3]"
        arrayFailOn "{'x', 'y', 'z'}"
        arrayFailOn "(\"ab\", \"cd\")"
        arrayFailOn "<true, false>"
    it "fails if the elements are not separated by commas" $ do
        arrayFailOn "[1 2 3]"
        arrayFailOn "[1 . 2 . 3]"
        arrayFailOn "['x' - 'y' - 'z']"
        arrayFailOn "[1920-12-10, 10:15:30]"