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 Data.Text.Encoding as Text 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 prop_sizeOfTextUtf8 = withTests 999 $ property $ do a <- forAll (Gen.text (Range.exponential 0 9999) Gen.unicode) Size.textUtf8 a === Char8ByteString.length (Text.encodeUtf8 a) prop_textUtf8 = withTests 999 $ property $ do a <- forAll (Gen.text (Range.exponential 0 9999) Gen.unicode) Write.writeToByteString (Write.textUtf8 a) === Text.encodeUtf8 a -- * 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)