module Test.Toml.Parser.Date ( dateSpecs ) where import Data.Time (LocalTime (..), TimeOfDay (..)) import Test.Hspec (Spec, describe, it) import Test.Toml.Parser.Common (dateTimeFailOn, day1, hours1, makeOffset, makeZoned, offset0, offset710, parseDateTime) import Toml.Type (UValue (..)) dateSpecs :: Spec dateSpecs = describe "dateTimeP" $ do it "can parse a date-time with an offset" $ do parseDateTime "1979-05-27T07:32:00Z" $ makeZoned day1 hours1 offset0 parseDateTime "1979-05-27T00:32:00+07:10" $ makeZoned day1 (TimeOfDay 0 32 0) offset710 parseDateTime "1979-05-27T00:32:00.999999-07:25" $ makeZoned day1 (TimeOfDay 0 32 0.999999) (makeOffset (-7) 25) it "can parse a date-time with an offset when the T delimiter is replaced with a space" $ parseDateTime "1979-05-27 07:32:00Z" $ makeZoned day1 hours1 offset0 it "can parse a date-time without an offset" $ do parseDateTime "1979-05-27T17:32:00" (ULocal $ LocalTime day1 (TimeOfDay 17 32 0)) parseDateTime "1979-05-27T00:32:00.999999" (ULocal $ LocalTime day1 (TimeOfDay 0 32 0.999999)) it "can parse a local date" $ parseDateTime "1979-05-27" (UDay day1) it "can parse a local time" $ do parseDateTime "07:32:00" (UHours hours1) parseDateTime "00:32:00.999999" (UHours $ TimeOfDay 0 32 0.999999) it "truncates the additional precision after picoseconds in the fractional seconds" $ parseDateTime "00:32:00.99999999999199" (UHours $ TimeOfDay 0 32 0.999999999991) it "fails if the date is not valid" $ do dateTimeFailOn "1920-15-12" dateTimeFailOn "1920-12-40" it "fails if the date does not have the form: 'yyyy-mm-dd'" $ do dateTimeFailOn "1920-01-1" dateTimeFailOn "1920-1-01" dateTimeFailOn "920-01-01" dateTimeFailOn "1920/10/01" it "fails if the time is not valid" $ do dateTimeFailOn "25:10:10" dateTimeFailOn "10:70:10" dateTimeFailOn "10:10:70" it "fails if the time does not have the form: 'hh:mm:ss'" $ do dateTimeFailOn "1:12:12" dateTimeFailOn "12:1:12" dateTimeFailOn "12:12:1" dateTimeFailOn "12-12-12" it "fails if the offset does not have any of the forms: 'Z', '+hh:mm', '-hh:mm'" $ do parseDateTime "1979-05-27T00:32:00X" (ULocal $ LocalTime day1 (TimeOfDay 0 32 0)) parseDateTime "1979-05-27T00:32:00+07:1" (ULocal $ LocalTime day1 (TimeOfDay 0 32 0)) parseDateTime "1979-05-27T00:32:00+7:01" (ULocal $ LocalTime day1 (TimeOfDay 0 32 0)) parseDateTime "1979-05-27T00:32:0007:00" (ULocal $ LocalTime day1 (TimeOfDay 0 32 0))