packages feed

hinterface-0.5.0.0: test/Foreign/Erlang/NodeDataSpec.hs

module Foreign.Erlang.NodeDataSpec ( spec ) where

import           Test.Hspec
--import Test.Hspec.QuickCheck
import           Test.QuickCheck

import           Data.Word
import           Data.List                ( nub, sort )
import           Data.Binary              ( decode, encode )

import           Foreign.Erlang.NodeData

spec :: Spec
spec = do
    describe "NodeType" $ do
        it "decode . encode = id" $
            property $ do
                a <- arbitraryBoundedEnum :: Gen NodeType
                return $ (decode . encode) a `shouldBe` a
        it "NormalNode encodes to 77" $
            encode NormalNode `shouldBe` encode (77 :: Word8)
        it "HiddenNode encodes to 72" $
            encode HiddenNode `shouldBe` encode (72 :: Word8)


    describe "NodeProtocol" $ do
        it "decode . encode = id" $
            property $ do
                a <- arbitraryBoundedEnum :: Gen NodeProtocol
                return $ (decode . encode) a `shouldBe` a
        it "TcpIpV4 encodes to 0" $
            encode TcpIpV4 `shouldBe` encode (0 :: Word8)

    describe "DistributionVersion" $ do
        it "decode . encode = id" $
            property $ do
                a <- arbitraryBoundedEnum :: Gen DistributionVersion
                return $ (decode . encode) a `shouldBe` a
        it "R4 encodes to 1" $
            encode R4 `shouldBe` encode (1 :: Word16)
        it "R5C encodes to 3" $
            encode R5C `shouldBe` encode (3 :: Word16)
        it "R6 encodes to 4" $
            encode R6 `shouldBe` encode (4 :: Word16)
        it "R6B encodes to 5" $
            encode R6B `shouldBe` encode (5 :: Word16)

    describe "DistributionFlags" $ do
        it "decode . encode = id" $
            property $ do
                a <- (DistributionFlags . nub . sort) <$> listOf arbitraryBoundedEnum :: Gen DistributionFlags
                return $ (decode . encode) a `shouldBe` a
        it "[] encodes to 0x00000" $
            encode (DistributionFlags []) `shouldBe` encode (0x00000 :: Word32)
        it "[PUBLISHED] encodes to 0x00001" $
            encode (DistributionFlags [ PUBLISHED ]) `shouldBe` encode (0x00001 :: Word32)
        it "[ATOM_CACHE] encodes to 0x00002" $
            encode (DistributionFlags [ ATOM_CACHE ]) `shouldBe` encode (0x00002 :: Word32)
        it "[EXTENDED_REFERENCES] encodes to 0x00004" $
            encode (DistributionFlags [ EXTENDED_REFERENCES ]) `shouldBe` encode (0x00004 :: Word32)
        it "[DIST_MONITOR] encodes to 0x00008" $
            encode (DistributionFlags [ DIST_MONITOR ]) `shouldBe` encode (0x00008 :: Word32)
        it "[FUN_TAGS] encodes to 0x00010" $
            encode (DistributionFlags [ FUN_TAGS ]) `shouldBe` encode (0x00010 :: Word32)
        it "[DIST_MONITOR_NAME] encodes to 0x00020" $
            encode (DistributionFlags [ DIST_MONITOR_NAME ]) `shouldBe` encode (0x00020 :: Word32)
        it "[HIDDEN_ATOM_CACHE] encodes to 0x00040" $
            encode (DistributionFlags [ HIDDEN_ATOM_CACHE ]) `shouldBe` encode (0x00040 :: Word32)
        it "[NEW_FUN_TAGS] encodes to 0x00080" $
            encode (DistributionFlags [ NEW_FUN_TAGS ]) `shouldBe` encode (0x00080 :: Word32)
        it "[EXTENDED_PIDS_PORTS] encodes to 0x00100" $
            encode (DistributionFlags [ EXTENDED_PIDS_PORTS ]) `shouldBe` encode (0x00100 :: Word32)
        it "[EXPORT_PTR_TAG] encodes to 0x00200" $
            encode (DistributionFlags [ EXPORT_PTR_TAG ]) `shouldBe` encode (0x00200 :: Word32)
        it "[BIT_BINARIES] encodes to 0x00400" $
            encode (DistributionFlags [ BIT_BINARIES ]) `shouldBe` encode (0x00400 :: Word32)
        it "[NEW_FLOATS] encodes to 0x00800" $
            encode (DistributionFlags [ NEW_FLOATS ]) `shouldBe` encode (0x00800 :: Word32)
        it "[UNICODE_IO] encodes to 0x01000" $
            encode (DistributionFlags [ UNICODE_IO ]) `shouldBe` encode (0x01000 :: Word32)
        it "[DIST_HDR_ATOM_CACHE] encodes to 0x02000" $
            encode (DistributionFlags [ DIST_HDR_ATOM_CACHE ]) `shouldBe` encode (0x02000 :: Word32)
        it "[SMALL_ATOM_TAGS] encodes to 0x04000" $
            encode (DistributionFlags [ SMALL_ATOM_TAGS ]) `shouldBe` encode (0x04000 :: Word32)
        it "[UTF8_ATOMS] encodes to 0x10000" $
            encode (DistributionFlags [ UTF8_ATOMS ]) `shouldBe` encode (0x10000 :: Word32)
        it "[minBound .. maxBound] encodes to 0x17FFF" $
            encode (DistributionFlags [minBound .. maxBound]) `shouldBe` encode (0x17FFF :: Word32)
        it "0xFFFFFFFF decodes to [minBound .. maxBound]" $
            (decode . encode) (0xFFFFFFFF :: Word32) `shouldBe`
                DistributionFlags [minBound .. maxBound]