module Test.Toml.Parser.Double
    (doubleSpecs
    ) where

import Test.Hspec (Spec, describe, it)
import Test.Hspec.Megaparsec (parseSatisfies)
import Text.Megaparsec (parse)

import Test.Toml.Parser.Common (doubleFailOn, parseDouble)
import Toml.Parser.Value (doubleP)


doubleSpecs :: Spec
doubleSpecs = describe "doubleP" $ do
    it "can parse a number which consists of an integral part, and a fractional part" $ do
        parseDouble "+1.0"      1.0
        parseDouble "3.1415"    3.1415
        parseDouble "0.0"       0.0
        parseDouble "-0.01"     (-0.01)
        parseDouble "5e+22"     5e+22
        parseDouble "1e6"       1e6
        parseDouble "-2E-2"     (-2E-2)
        parseDouble "6.626e-34" 6.626e-34
    it "can parse a number with underscores" $ do
        parseDouble "5e+2_2"         5e+22
        parseDouble "1.1_1e6"        1.11e6
        parseDouble "-2_2.21_9E-0_2" (-22.219E-2)
    it "can parse sign-prefixed zero" $ do
        parseDouble "+0.0" 0.0
        parseDouble "-0.0" (-0.0)
    it "can parse positive and negative special float values (inf and nan)" $ do
        parseDouble "inf"  (1 / 0)
        parseDouble "+inf" (1 / 0)
        parseDouble "-inf" (-1 / 0)
        doubleSatisfies "nan"  isNaN
        doubleSatisfies "+nan" isNaN
        doubleSatisfies "-nan" isNaN
    it "fails if `inf` or `nan` are not all lowercase" $ do
        doubleFailOn "Inf"
        doubleFailOn "INF"
        doubleFailOn "Nan"
        doubleFailOn "NAN"
        doubleFailOn "NaN"
  where
    doubleSatisfies given f = parse doubleP "" given `parseSatisfies` f