1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
{-# LANGUAGE CPP #-}
{-|
Module: Spec.Data.FloatingSpec
Copyright: (C) 2014-2017 Ryan Scott
License: BSD-style (see the file LICENSE)
Maintainer: Ryan Scott
Stability: Provisional
Portability: GHC
@hspec@ tests for floating-point data types.
-}
module Spec.Data.FloatingSpec (main, spec) where
import Data.Proxy.Compat (Proxy(..))
import Data.Text.Lazy.Builder.RealFloat (FPFormat)
import Instances.Data.Floating ()
import Numeric.Compat (showEFloat, showFFloat, showGFloat,
showFFloatAlt, showGFloatAlt)
import Prelude ()
import Prelude.Compat
import Spec.Utils (matchesTextShowSpec)
import Test.Hspec (Spec, describe, hspec, parallel)
import Test.Hspec.QuickCheck (prop)
import Test.QuickCheck (Property, arbitrary, property, suchThat)
import TextShow (Builder, fromString)
import TextShow.Data.Floating (showbEFloat, showbFFloat, showbGFloat,
showbFFloatAlt, showbGFloatAlt)
main :: IO ()
main = hspec spec
spec :: Spec
spec = parallel $ do
describe "Float" $
matchesTextShowSpec (Proxy :: Proxy Float)
describe "Double" $
matchesTextShowSpec (Proxy :: Proxy Double)
describe "showbEFloat" $
prop "has the same output as showEFloat" $ prop_showXFloat showEFloat showbEFloat
describe "showbFFloat" $
prop "has the same output as showFFloat" $ prop_showXFloat showFFloat showbFFloat
describe "showbGFloat" $
prop "has the same output as showGFloat" $ prop_showXFloat showGFloat showbGFloat
describe "showbFFloatAlt" $
prop "has the same output as showFFloatAlt" $ prop_showXFloat showFFloatAlt showbFFloatAlt
describe "showbGFloatAlt" $
prop "has the same output as showFFloatAlt" $ prop_showXFloat showGFloatAlt showbGFloatAlt
describe "FPFormat" $
matchesTextShowSpec (Proxy :: Proxy FPFormat)
-- | Verifies @showXFloat@ and @showbXFloat@ generate the same output (where @X@
-- is one of E, F, or G).
prop_showXFloat :: (Maybe Int -> Double -> ShowS)
-> (Maybe Int -> Double -> Builder)
-> Double -> Property
prop_showXFloat f1 f2 val = property $ do
mb_digs <- arbitrary `suchThat` cond
pure $ fromString (f1 mb_digs val "") == f2 mb_digs val
where
cond :: Maybe Int -> Bool
cond mb_digs =
mb_digs /= Nothing && mb_digs <= Just 10
#if !(MIN_VERSION_base(4,12,0))
&& mb_digs > Just 0 -- Work around Trac #15115
#endif
|