packages feed

ptr-poker-0.1: test/Main.hs

module Main where

import Prelude
import Hedgehog
import Hedgehog.Main
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import qualified Data.ByteString.Char8 as Char8ByteString
import qualified PtrPoker.Write as Write
import qualified PtrPoker.Size as Size
import qualified Numeric.Limits as NumericLimits


main =
  defaultMain $ pure $ checkParallel $ $$(discover)

prop_word64Size =
  withTests 999 $
  property $ do
    a <- forAll (Gen.word64 (Range.exponential minBound maxBound))
    Size.word64AsciiDec a
      === length (show a)

prop_int64Size =
  withTests 999 $
  property $ do
    a <- forAll (Gen.int64 (Range.exponential minBound maxBound))
    Size.int64AsciiDec a
      === length (show a)

prop_wordAsciiDec =
  withTests 999 $
  property $ do
    a <- forAll (Gen.word (Range.exponential minBound maxBound))
    let
      string =
        Char8ByteString.unpack (Write.writeToByteString (Write.wordAsciiDec a))
    annotate string
    read string === a

prop_intAsciiDec =
  withTests 999 $
  property $ do
    a <- forAll (Gen.int (Range.exponential minBound maxBound))
    let
      string =
        Char8ByteString.unpack (Write.writeToByteString (Write.intAsciiDec a))
    annotate string
    read string === a

prop_doubleAsciiDec =
  withTests 999 $
  property $ do
    a <- forAll realFloatGen
    let
      string =
        Char8ByteString.unpack (Write.writeToByteString (Write.doubleAsciiDec a))
    annotate string
    if isNaN a
      then string === "NaN"
      else read string === a

prop_realZeroNonRealDoubleAsciiDec =
  withTests 999 $
  property $ do
    a <- forAll realRealFloatGen
    let
      string =
        Char8ByteString.unpack (Write.writeToByteString (Write.zeroNonRealDoubleAsciiDec a))
    annotate string
    read string === a

prop_nonRealZeroNonRealDoubleAsciiDec =
  withTests 99 $
  property $ do
    a <- forAll nonRealRealFloatGen
    let
      string =
        Char8ByteString.unpack (Write.writeToByteString (Write.zeroNonRealDoubleAsciiDec a))
    annotate string
    read string === 0


-- * Gens
-------------------------

realFloatGen =
  Gen.frequency [
    (99, realRealFloatGen)
    ,
    (1, nonRealRealFloatGen)
    ]

nonRealRealFloatGen =
  Gen.element [0 / 0, 1 / 0, (-1) / 0, -0]

realRealFloatGen =
  Gen.realFloat (Range.exponentialFloat NumericLimits.minValue NumericLimits.maxValue)