snowchecked 0.0.0.1 → 0.0.0.3
raw patch · 7 files changed
+118/−31 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- package.yaml +1/−1
- snowchecked.cabal +5/−1
- test/Gens.hs +35/−0
- test/Integer.hs +20/−0
- test/Spec.hs +11/−29
- test/Word32.hs +23/−0
- test/Word64.hs +23/−0
package.yaml view
@@ -1,5 +1,5 @@ name: snowchecked-version: 0.0.0.1+version: 0.0.0.3 github: robertfischer/hs-snowflake-checked license: Apache-2.0 author: Robert Fischer
snowchecked.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: snowchecked-version: 0.0.0.1+version: 0.0.0.3 synopsis: A checksummed variation on Twitter's Snowflake UID generation algorithm description: See the file ./README.md, which is included in the package and also on GitHub. category: Data@@ -55,6 +55,10 @@ type: exitcode-stdio-1.0 main-is: Spec.hs other-modules:+ Gens+ Integer+ Word32+ Word64 Paths_snowchecked hs-source-dirs: test
+ test/Gens.hs view
@@ -0,0 +1,35 @@+{-# LANGUAGE TypeApplications #-}++module Gens (module Gens) where++import Control.Monad (unless, void)+import Control.Monad.IO.Class (MonadIO)+import Data.List (nub)+import Data.Snowchecked+import Data.WideWord.Word256+import Data.Word+import Hedgehog+import qualified Hedgehog.Gen as Gen+import Hedgehog.Main (defaultMain)+import qualified Hedgehog.Range as Range++genWord8 :: (MonadGen m) => m Word8+genWord8 = Gen.word8 $ Range.linear (minBound @Word8) (maxBound @Word8)++genWord256 :: (MonadGen m) => m Word256+genWord256 = Gen.integral $ Range.linear (minBound @Word256) (maxBound @Word256)++genConfig :: (MonadGen m) => m SnowcheckedConfig+genConfig = SnowcheckedConfig+ <$> Gen.integral (Range.linear 2 (maxBound @Word8))+ <*> Gen.integral (Range.linear 2 (maxBound @Word8))+ <*> Gen.integral (Range.linear 2 (maxBound @Word8))+ <*> Gen.integral (Range.linear 2 (maxBound @Word8))++forAllFlake :: (MonadIO m) => PropertyT m Flake+forAllFlake = forAll genConfig >>= forAllFlake'++forAllFlake' :: (MonadIO m) => SnowcheckedConfig -> PropertyT m Flake+forAllFlake' cfg = do+ nodeId <- forAll genWord256+ newSnowcheckedGen cfg nodeId >>= nextFlake
+ test/Integer.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeApplications #-}++module Integer (tests) where++import Data.Snowchecked+import Data.Snowchecked.Encoding.Integral+import Gens+import Hedgehog++tests :: IO Bool+tests = checkParallel $$(discover)++prop_flakeToIntegerToFlake :: Property+prop_flakeToIntegerToFlake = property $ do+ cfg <- forAll genConfig+ flake <- forAllFlake' cfg+ let value = fromFlake @Integer flake+ let result = parseFlake cfg value + result === Just flake
test/Spec.hs view
@@ -8,39 +8,28 @@ import Data.Snowchecked import Data.WideWord.Word256 import Data.Word+import Gens import Hedgehog import qualified Hedgehog.Gen as Gen import Hedgehog.Main (defaultMain) import qualified Hedgehog.Range as Range +import qualified Integer+import qualified Word32+import qualified Word64+ main :: IO () main = do recheck (Size 4) (Seed 14462958355020818941 14776761114051845121) prop_generatesUniqueValues recheck (Size 8) (Seed 11763301661976410488 14055395789257366631) prop_generatesUniqueValues recheck (Size 14) (Seed 6771904241892528611 8532317410904456029) prop_generatesUniqueValues recheck (Size 14) (Seed 4790609826115340731 8375105224114527375) prop_generatesUniqueValues- defaultMain [ checkParallel $$(discover) ]--genWord8 :: (MonadGen m) => m Word8-genWord8 = Gen.word8 $ Range.linear (minBound @Word8) (maxBound @Word8)--genWord256 :: (MonadGen m) => m Word256-genWord256 = Gen.integral $ Range.linear (minBound @Word256) (maxBound @Word256)--genConfig :: (MonadGen m) => m SnowcheckedConfig-genConfig = SnowcheckedConfig- <$> Gen.integral (Range.linear 2 (maxBound @Word8))- <*> Gen.integral (Range.linear 2 (maxBound @Word8))- <*> Gen.integral (Range.linear 2 (maxBound @Word8))- <*> Gen.integral (Range.linear 2 (maxBound @Word8))--forAllFlake :: (MonadIO m) => PropertyT m Flake-forAllFlake = forAll genConfig >>= forAllFlake'--forAllFlake' :: (MonadIO m) => SnowcheckedConfig -> PropertyT m Flake-forAllFlake' cfg = do- nodeId <- forAll genWord256- newSnowcheckedGen cfg nodeId >>= nextFlake+ defaultMain+ [ checkParallel $$(discover)+ , Integer.tests+ , Word32.tests+ , Word64.tests+ ] prop_generatesUniqueValues :: Property prop_generatesUniqueValues = property $ do@@ -51,13 +40,6 @@ flakeGen <- newSnowcheckedGen cfg nodeId resultLst <- mapM (\_ -> nextFlake flakeGen) lst resultLst === nub resultLst--prop_roundTripIntegral :: Property-prop_roundTripIntegral = property $ do- cfg <- forAll genConfig- flake <- forAllFlake' cfg- result <- parseFlake cfg $ flakeToIntegral @Integer flake- flake === result prop_flakeCanBeNFed :: Property prop_flakeCanBeNFed = property $ do
+ test/Word32.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeApplications #-}++module Word32 (tests) where++import Control.Monad+import Data.Snowchecked+import Data.Snowchecked.Encoding.Integral+import Data.Word+import Gens+import Hedgehog++tests :: IO Bool+tests = checkParallel $$(discover)++prop_flakeToWord32ToFlake :: Property+prop_flakeToWord32ToFlake = withDiscards (999999999 :: DiscardLimit) . property $ do+ cfg <- forAll genConfig+ unless (snowcheckedConfigBitCount cfg <= 32) discard+ flake <- forAllFlake' cfg+ let value = fromFlake @Word32 flake+ let result = parseFlake cfg value+ result === Just flake
+ test/Word64.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeApplications #-}++module Word64 (tests) where++import Control.Monad+import Data.Snowchecked+import Data.Snowchecked.Encoding.Integral+import Data.Word+import Gens+import Hedgehog++tests :: IO Bool+tests = checkParallel $$(discover)++prop_flakeToWord64ToFlake :: Property+prop_flakeToWord64ToFlake = withDiscards (999999999 :: DiscardLimit) . property $ do+ cfg <- forAll genConfig+ unless (snowcheckedConfigBitCount cfg <= 64) discard+ flake <- forAllFlake' cfg+ let value = fromFlake @Word64 flake+ let result = parseFlake cfg value+ result === Just flake