packages feed

hw-bits-0.0.0.11: test/HaskellWorks/Data/Bits/UnmatchedSpec.hs

{-# LANGUAGE ScopedTypeVariables #-}

module HaskellWorks.Data.Bits.UnmatchedSpec (spec) where

import           Data.Vector.Storable                 as DVS
import           Data.Word
import           HaskellWorks.Data.Bits.BitWise
import           HaskellWorks.Data.Bits.FixedBitSize
import           HaskellWorks.Data.Bits.Unmatched
import           Test.Hspec
import           Test.QuickCheck

{-# ANN module ("HLint: Ignore Redundant do" :: String) #-}

spec :: Spec
spec = describe "HaskellWorks.Data.Bits.UnmatchedSpec" $ do
  describe "For Word8" $ do
    it "umatchedL0 concatentation" $
      property $ \(a :: Word8) (b :: Word8) ->
        let c :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedL0 a + ((unmatchedL0 b - unmatchedR1 a) `max` 0) `shouldBe` unmatchedL0 c
    it "umatchedL1 concatentation" $
      property $ \(a :: Word8) (b :: Word8) ->
        let c :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedL1 a + ((unmatchedL1 b - unmatchedR0 a) `max` 0) `shouldBe` unmatchedL1 c
    it "umatchedR0 concatentation" $
      property $ \(a :: Word8) (b :: Word8) ->
        let c :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedR0 b + ((unmatchedR0 a - unmatchedL1 b) `max` 0) `shouldBe` unmatchedR0 c
    it "umatchedR1 concatentation" $
      property $ \(a :: Word8) (b :: Word8) ->
        let c :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedR1 b + ((unmatchedR1 a - unmatchedL0 b) `max` 0) `shouldBe` unmatchedR1 c
  describe "For Word16" $ do
    it "umatchedL0 concatentation" $
      property $ \(a :: Word16) (b :: Word16) ->
        let c :: Word32 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedL0 a + ((unmatchedL0 b - unmatchedR1 a) `max` 0) `shouldBe` unmatchedL0 c
    it "umatchedL1 concatentation" $
      property $ \(a :: Word16) (b :: Word16) ->
        let c :: Word32 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedL1 a + ((unmatchedL1 b - unmatchedR0 a) `max` 0) `shouldBe` unmatchedL1 c
    it "umatchedR0 concatentation" $
      property $ \(a :: Word16) (b :: Word16) ->
        let c :: Word32 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedR0 b + ((unmatchedR0 a - unmatchedL1 b) `max` 0) `shouldBe` unmatchedR0 c
    it "umatchedR1 concatentation" $
      property $ \(a :: Word16) (b :: Word16) ->
        let c :: Word32 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedR1 b + ((unmatchedR1 a - unmatchedL0 b) `max` 0) `shouldBe` unmatchedR1 c
  describe "For Word32" $ do
    it "umatchedL0 concatentation" $
      property $ \(a :: Word32) (b :: Word32) ->
        let c :: Word64 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedL0 a + ((unmatchedL0 b - unmatchedR1 a) `max` 0) `shouldBe` unmatchedL0 c
    it "umatchedL1 concatentation" $
      property $ \(a :: Word32) (b :: Word32) ->
        let c :: Word64 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedL1 a + ((unmatchedL1 b - unmatchedR0 a) `max` 0) `shouldBe` unmatchedL1 c
    it "umatchedR0 concatentation" $
      property $ \(a :: Word32) (b :: Word32) ->
        let c :: Word64 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedR0 b + ((unmatchedR0 a - unmatchedL1 b) `max` 0) `shouldBe` unmatchedR0 c
    it "umatchedR1 concatentation" $
      property $ \(a :: Word32) (b :: Word32) ->
        let c :: Word64 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedR1 b + ((unmatchedR1 a - unmatchedL0 b) `max` 0) `shouldBe` unmatchedR1 c
  describe "For (DVS.Vector Word8)" $ do
    it "umatchedL0 concatentation" $
      property $ \(a :: Word8) (b :: Word8) ->
        let c = DVS.fromList [a, b] in
        let d :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedL0 d `shouldBe` unmatchedL0 c
    it "umatchedL1 concatentation" $
      property $ \(a :: Word8) (b :: Word8) ->
        let c = DVS.fromList [a, b] in
        let d :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedL1 d `shouldBe` unmatchedL1 c
    it "umatchedR0 concatentation" $
      property $ \(a :: Word8) (b :: Word8) ->
        let c = DVS.fromList [a, b] in
        let d :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedR0 d `shouldBe` unmatchedR0 c
    it "umatchedR1 concatentation" $
      property $ \(a :: Word8) (b :: Word8) ->
        let c = DVS.fromList [a, b] in
        let d :: Word16 = (fromIntegral a) .|. (fromIntegral b .<. fixedBitSize b) in
        unmatchedR1 d `shouldBe` unmatchedR1 c